class Senkyoshi::ScormPackage

Attributes

entries[RW]
manifest[RW]
points_possible[RW]

Public Class Methods

correct_path(path, scorm_path) click to toggle source

Returns file path with relative path to scorm package removed

# File lib/senkyoshi/models/scorm_package.rb, line 107
def self.correct_path(path, scorm_path)
  corrected = path.gsub(scorm_path, "")
  corrected.slice(1, corrected.size) if corrected.start_with? "/"
end
find_scorm_item_paths(zip_file) click to toggle source

Returns paths to scormItem files

# File lib/senkyoshi/models/scorm_package.rb, line 44
def self.find_scorm_item_paths(zip_file)
  Nokogiri::XML.parse(
    Senkyoshi.read_file(zip_file, "imsmanifest.xml"),
  ).
    xpath("//resource[@type='resource/x-plugin-scormengine']").
    map { |r| r.xpath("./@bb:file").text }
rescue Exceptions::MissingFileError => e
  if zip_file
    STDERR.puts "Blackboard export manifest file missing: #{zip_file.name}"
  end
  STDERR.puts e.to_s

  []
end
find_scorm_items(zip_file) click to toggle source

Returns array of parsed scormItem files

# File lib/senkyoshi/models/scorm_package.rb, line 62
def self.find_scorm_items(zip_file)
  find_scorm_item_paths(zip_file).map do |path|
    Nokogiri::XML.parse Senkyoshi.read_file(zip_file, path)
  end
end
find_scorm_manifest(zip_file, scorm_item) click to toggle source

Returns the zip file entry for the scorm package manifest, given a scormItem file

# File lib/senkyoshi/models/scorm_package.rb, line 72
def self.find_scorm_manifest(zip_file, scorm_item)
  path = scorm_item.xpath("/scormItem/@mappedContentId").text
  zip_file.get_entry("#{path}/imsmanifest.xml")
end
find_scorm_manifests(zip_file) click to toggle source

Returns array of all scorm manifest files inside of blackboard export

# File lib/senkyoshi/models/scorm_package.rb, line 80
def self.find_scorm_manifests(zip_file)
  find_scorm_items(zip_file).map do |scorm_item|
    find_scorm_manifest(zip_file, scorm_item)
  end
end
find_scorm_paths(zip_file) click to toggle source

Returns array of paths to scorm packages

# File lib/senkyoshi/models/scorm_package.rb, line 89
def self.find_scorm_paths(zip_file)
  manifests = ScormPackage.find_scorm_manifests(zip_file)
  manifests.map { |manifest| File.dirname(manifest.name) }
end
get_entries(zip_file, manifest) click to toggle source

Returns array of all zip file entries that belong in scorm package

# File lib/senkyoshi/models/scorm_package.rb, line 97
def self.get_entries(zip_file, manifest)
  zip_file.entries.select do |e|
    File.dirname(e.name).start_with?(File.dirname(manifest.name)) &&
      !e.directory?
  end
end
get_scorm_packages(blackboard_export) click to toggle source

Extracts scorm packages from a blackboard export zip file

# File lib/senkyoshi/models/scorm_package.rb, line 33
def self.get_scorm_packages(blackboard_export)
  find_scorm_items(blackboard_export).
    map do |item|
      manifest_entry = find_scorm_manifest(blackboard_export, item)
      ScormPackage.new blackboard_export, manifest_entry, item
    end
end
new(zip_file, manifest, scorm_item = nil) click to toggle source
# File lib/senkyoshi/models/scorm_package.rb, line 20
def initialize(zip_file, manifest, scorm_item = nil)
  @manifest = manifest
  @entries = ScormPackage.get_entries zip_file, manifest
  @points_possible = if scorm_item
                       scorm_item.xpath(
                         "/scormItem/gradebookInfo/@pointsPossible",
                       ).text
                     end
end

Public Instance Methods

cleanup() click to toggle source

Removes all temp files if they exist

# File lib/senkyoshi/models/scorm_package.rb, line 137
def cleanup
  FileUtils.rm_r @dir unless @dir.nil?
end
write_zip(export_name) click to toggle source

Writes all entries to a zip file in a temporary directory and returns location of temporary file

# File lib/senkyoshi/models/scorm_package.rb, line 116
def write_zip(export_name)
  @dir ||= Dir.mktmpdir
  scorm_path = File.dirname @manifest.name
  path = "#{@dir}/#{export_name}"
  Zip::File.open path, Zip::File::CREATE do |zip|
    @entries.each do |entry|
      if entry.file?
        zip.get_output_stream(
          ScormPackage.correct_path(entry.name, scorm_path),
        ) do |file|
          file.write(entry.get_input_stream.read)
        end
      end
    end
  end
  path
end