Skip to content

Commit

Permalink
Rename
Browse files Browse the repository at this point in the history
  • Loading branch information
jbasdf committed Jan 19, 2024
1 parent 5683364 commit 2c2a842
Show file tree
Hide file tree
Showing 404 changed files with 1,393 additions and 1,458 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
source 'https://rubygems.org'

# Specify your gem's dependencies in moodle2cc.gemspec
# Specify your gem's dependencies in moodle2aa.gemspec
gemspec

gem 'simplecov'
4 changes: 2 additions & 2 deletions Guardfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@

guard :bundler do
watch('Gemfile')
watch('moodle2cc.gemspec')
watch('moodle2aa.gemspec')
end

guard 'minitest' do
# with Minitest::Unit
watch(%r|^test/(.*)\/?(.*)_test\.rb|)
watch(%r|^lib/moodle2cc/(.*?)([^/]+)\.rb|) { |m| "test/unit/#{m[1]}#{m[2]}_test.rb" }
watch(%r|^lib/moodle2aa/(.*?)([^/]+)\.rb|) { |m| "test/unit/#{m[1]}#{m[2]}_test.rb" }
watch(%r|^test/test_helper\.rb|) { "test" }
end

Expand Down
99 changes: 17 additions & 82 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,114 +1,49 @@
# LEARNOSITY
# Moodle2AA

This branch is adapted from moodle2cc to convert moodle to learnosity format. It was meant as a one-time
conversion and isn't done particularly well. YMMV

Usage

moodle2cc migrate $PWD/moodle.mbz OUT/



# Moodle2CC

moodle2cc will convert Moodle 1.9 backup files into IMS Common Cartridge 1.1
formatted files.
moodle2aa will convert Moodle 1.9 backup files into Atomic Assessments compliant JSON.

Moodle information: http://moodle.org/

Common Cartridge information: http://www.imsglobal.org/cc/index.html
[Atomic Assessments](https://www.atomicjolt.com/atomic-assessments)
[Getting started with Atomic Assessments](https://support.atomicjolt.com/knowledgebase/getting-started-with-atomic-assessments)

Use the [Github Issues](https://github.com/instructure/moodle2cc/issues?state=open)
Use the [Github Issues](https://github.com/atomicjolt/moodle2aa/issues?state=open)
for feature requests and bug reports.

## Legal

This project is derived from the [moodle2aa](https://github.com/instructure/moodle2aa) gem.

## Installation/Usage

### Command line

Install RubyGems on your system, see http://rubygems.org/ for instructions.
Once RubyGems is installed you can install this gem:

$ gem install moodle2cc

Convert a moodle .zip into Common Cartridge format

$ moodle2cc migrate <path-to-moodle-backup> <path-to-cc-export-directory>
$ gem install moodle2aa

Or into a Canvas-enhanced Common Cartridge format
Convert a moodle .zip into Atomic Assessments format

$ moodle2cc migrate --format=canvas <path-to-moodle-backup> <path-to-cc-export-directory>
$ moodle2aa migrate <path-to-moodle-backup> <path-to-aa-export-directory>

### In a Ruby application

Add this line to your application's Gemfile and run `bundle`:

gem 'moodle2cc'
gem 'moodle2aa'

Require the library in your project and use the migrator:

```ruby
require 'moodle2cc'
migrator = Moodle2CC::Migrator.new moodle_zip_path, destination_path
require 'moodle2aa'
migrator = Moodle2AA::Migrator.new moodle_zip_path, destination_path
migrator.migrate
```

## Caveats

Common Cartridge (CC) does not support all of the concepts in a Moodle course.
CC has no concepts such as assignments or wiki pages, so these things have to
fit into Common Cartridge as best they can. Here are some of the decisions we
made about these things:

<table>
<tr>
<th>Moodle</th>
<th>Common Cartridge</th>
</tr>
<tr>
<td>Course Files</td>
<td>All files are in the `web_resources` folder, links to files in HTML are
referenced relative to that directory with the token `$IMS_CC_FILEBASE$`.</td>
</tr>
<tr>
<td>Assignments</td>
<td>HTML pages in an `assignments` subfolder in `web_resources`. The description
of the assignment is the body of the page and stuff like points possible are
in meta fields.</td>
</tr>
<tr>
<td>Wiki Pages</td>
<td>HTML pages in a `pages` subfolder in `web_resources`.</td>
</tr>
<tr>
<td>Discussion Topics</td>
<td>The titles and bodies of topics are intact in the conversion.</td>
</tr>
<tr>
<td>Grade Items</td>
<td>If the grade item is attached to an assignment its data will be in the
meta data of the assignment's HTML page. Otherwise it isn't currently converted.</td>
</tr>
<tr>
<td>Assessments (quizzes)</td>
<td>TODO - Coming soon! Only the CC-supported question types will be converted
to QTI as documented <a href="http://www.imsglobal.org/cc/ccv1p1/imscc_profilev1p1-Implementation.html#_Toc285616469">here</a> </td>
</tr>
<tr>
<td>Question Categories</td>
<td>TODO - Coming soon! Common Cartridge only supports having a single question bank, so all banks
will be combined into one. <a href="http://www.imsglobal.org/cc/ccv1p1/imscc_profilev1p1-Implementation.html#_Toc285616457">CC Question Bank Docs</a> </td>
</tr>
</table>

## Todo

- [ ] Support exporting to CC 1.3
- [ ] Support converting to multiple versions of CC?
- [ ] Quiz conversion
- [ ] Question Category conversion
- [ ] LTI configurations?
- [ ] Convert more Moodle features as requested
- [ ] Moodle 2 support for standard CC
- [x] Moodle 2 support for canvas-flavored CC
This is not a complete solution and not all Moodle information will be migrated.

## Contributing

Expand Down
6 changes: 3 additions & 3 deletions bin/moodle2cc → bin/moodle2aa
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
#!/usr/bin/env ruby
require 'rubygems'
require 'moodle2cc'
require 'moodle2cc/cli'
require 'moodle2aa'
require 'moodle2aa/cli'

require 'pp'
require 'pry'

Moodle2CC::CLI.start
Moodle2AA::CLI.start
142 changes: 142 additions & 0 deletions lib/moodle2aa.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
require 'builder'
require 'cgi'
require 'erb'
require 'fileutils'
require 'happymapper'
require 'logger'
require 'nokogiri'
require 'ostruct'
require 'rdiscount'
require 'uri'
require 'securerandom'

require 'moodle2aa/error'
require 'moodle2aa/logger'
require 'moodle2aa/migration_report'
require 'moodle2aa/migrator'

require 'moodle2aa/moodle2'

require 'moodle2aa/learnosity/converters.rb'
require 'moodle2aa/learnosity/models.rb'
require 'moodle2aa/learnosity/writers.rb'
require 'moodle2aa/learnosity/migrator.rb'

module Moodle2AA
class OpenStruct < ::OpenStruct
if defined? id
undef id
end
end

autoload :ResourceFactory, 'moodle2aa/resource_factory'

module CC
autoload :Assessment, 'moodle2aa/cc/assessment'
autoload :Assignment, 'moodle2aa/cc/assignment'
autoload :CCHelper, 'moodle2aa/cc/cc_helper'
autoload :Converter, 'moodle2aa/cc/converter'
autoload :Course, 'moodle2aa/cc/course'
autoload :DiscussionTopic, 'moodle2aa/cc/discussion_topic'
autoload :Label, 'moodle2aa/cc/label'
autoload :Question, 'moodle2aa/cc/question'
autoload :Resource, 'moodle2aa/cc/resource'
autoload :WebContent, 'moodle2aa/cc/web_content'
autoload :WebLink, 'moodle2aa/cc/web_link'
autoload :Wiki, 'moodle2aa/cc/wiki'
end
module Canvas
autoload :Assessment, 'moodle2aa/canvas/assessment'
autoload :Assignment, 'moodle2aa/canvas/assignment'
autoload :Converter, 'moodle2aa/canvas/converter'
autoload :Course, 'moodle2aa/canvas/course'
autoload :DiscussionTopic, 'moodle2aa/canvas/discussion_topic'
autoload :Label, 'moodle2aa/canvas/label'
autoload :Question, 'moodle2aa/canvas/question'
autoload :QuestionBank, 'moodle2aa/canvas/question_bank'
autoload :QuestionGroup, 'moodle2aa/canvas/question_group'
autoload :Resource, 'moodle2aa/canvas/resource'
autoload :WebContent, 'moodle2aa/canvas/web_content'
autoload :WebLink, 'moodle2aa/canvas/web_link'
autoload :Wiki, 'moodle2aa/canvas/wiki'
end
module Moodle
autoload :Backup, 'moodle2aa/moodle/backup'
autoload :Course, 'moodle2aa/moodle/course'
autoload :GradeItem, 'moodle2aa/moodle/grade_item'
autoload :Info, 'moodle2aa/moodle/info'
autoload :Mod, 'moodle2aa/moodle/mod'
autoload :Question, 'moodle2aa/moodle/question'
autoload :QuestionCategory, 'moodle2aa/moodle/question_category'
autoload :Section, 'moodle2aa/moodle/section'
end
module CanvasCC
autoload :ImsManifestGenerator, 'moodle2aa/canvas_cc/ims_manifest_generator'
autoload :CartridgeCreator, 'moodle2aa/canvas_cc/cartridge_creator'
autoload :CourseSettingWriter, 'moodle2aa/canvas_cc/course_setting_writer'
autoload :ModuleMetaWriter, 'moodle2aa/canvas_cc/module_meta_writer'
autoload :FileMetaWriter, 'moodle2aa/canvas_cc/file_meta_writer'
autoload :CanvasExportWriter, 'moodle2aa/canvas_cc/canvas_export_writer'
autoload :PageWriter, 'moodle2aa/canvas_cc/page_writer'
autoload :DiscussionWriter, 'moodle2aa/canvas_cc/discussion_writer'
autoload :AssignmentWriter, 'moodle2aa/canvas_cc/assignment_writer'

autoload :QuestionWriter, 'moodle2aa/canvas_cc/question_writer'
autoload :CalculatedQuestionWriter, 'moodle2aa/canvas_cc/calculated_question_writer'
autoload :EssayQuestionWriter, 'moodle2aa/canvas_cc/essay_question_writer'
autoload :MatchingQuestionWriter, 'moodle2aa/canvas_cc/matching_question_writer'
autoload :MultipleAnswersQuestionWriter, 'moodle2aa/canvas_cc/multiple_answers_question_writer'
autoload :MultipleBlanksQuestionWriter, 'moodle2aa/canvas_cc/multiple_blanks_question_writer'
autoload :MultipleChoiceQuestionWriter, 'moodle2aa/canvas_cc/multiple_choice_question_writer'
autoload :MultipleDropdownsQuestionWriter, 'moodle2aa/canvas_cc/multiple_dropdowns_question_writer'
autoload :NumericalQuestionWriter, 'moodle2aa/canvas_cc/numerical_question_writer'
autoload :ShortAnswerQuestionWriter, 'moodle2aa/canvas_cc/short_answer_question_writer'
autoload :TextOnlyQuestionWriter, 'moodle2aa/canvas_cc/text_only_question_writer'
autoload :TrueFalseQuestionWriter, 'moodle2aa/canvas_cc/true_false_question_writer'

autoload :QuestionBankWriter, 'moodle2aa/canvas_cc/question_bank_writer'
autoload :QuestionGroupWriter, 'moodle2aa/canvas_cc/question_group_writer'
autoload :AssessmentWriter, 'moodle2aa/canvas_cc/assessment_writer'
module Models
autoload :Course, 'moodle2aa/canvas_cc/models/course'
autoload :Assignment, 'moodle2aa/canvas_cc/models/assignment'
autoload :Assessment, 'moodle2aa/canvas_cc/models/assessment'
autoload :DiscussionTopic, 'moodle2aa/canvas_cc/models/discussion_topic'
autoload :Question, 'moodle2aa/canvas_cc/models/question'
autoload :CalculatedQuestion, 'moodle2aa/canvas_cc/models/calculated_question'
autoload :Answer, 'moodle2aa/canvas_cc/models/answer'
autoload :QuestionBank, 'moodle2aa/canvas_cc/models/question_bank'
autoload :QuestionGroup, 'moodle2aa/canvas_cc/models/question_group'
autoload :WebContent, 'moodle2aa/canvas_cc/models/web_content'
autoload :WebLink, 'moodle2aa/canvas_cc/models/web_link'
autoload :Resource, 'moodle2aa/canvas_cc/models/resource'
autoload :CanvasModule, 'moodle2aa/canvas_cc/models/canvas_module'
autoload :ModuleItem, 'moodle2aa/canvas_cc/models/module_item'
autoload :CanvasFile, 'moodle2aa/canvas_cc/models/canvas_file'
autoload :Page, 'moodle2aa/canvas_cc/models/page'
autoload :Discussion, 'moodle2aa/canvas_cc/models/discussion'
autoload :WorkflowState, 'moodle2aa/canvas_cc/models/workflow_state'
end
end
module Moodle2Converter
autoload :Migrator, 'moodle2aa/moodle2converter/migrator'
autoload :CourseConverter, 'moodle2aa/moodle2converter/course_converter'
autoload :QuestionConverters, 'moodle2aa/moodle2converter/question_converters'
autoload :QuestionBankConverter, 'moodle2aa/moodle2converter/question_bank_converter'
autoload :SectionConverter, 'moodle2aa/moodle2converter/section_converter'
autoload :FileConverter, 'moodle2aa/moodle2converter/file_converter'
autoload :PageConverter, 'moodle2aa/moodle2converter/page_converter'
autoload :DiscussionConverter, 'moodle2aa/moodle2converter/discussion_converter'
autoload :AssignmentConverter, 'moodle2aa/moodle2converter/assignment_converter'
autoload :AssessmentConverter, 'moodle2aa/moodle2converter/assessment_converter'
autoload :FolderConverter, 'moodle2aa/moodle2converter/folder_converter'
autoload :BookConverter, 'moodle2aa/moodle2converter/book_converter'
autoload :ConverterHelper, 'moodle2aa/moodle2converter/converter_helper'
autoload :HtmlConverter, 'moodle2aa/moodle2converter/html_converter'
autoload :HomepageConverter, 'moodle2aa/moodle2converter/homepage_converter'
autoload :GlossaryConverter, 'moodle2aa/moodle2converter/glossary_converter'
autoload :LabelConverter, 'moodle2aa/moodle2converter/label_converter'
autoload :WikiConverter, 'moodle2aa/moodle2converter/wiki_converter'
autoload :GenericActivityConverter, 'moodle2aa/moodle2converter/generic_activity_converter'
end
end
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Moodle2CC::Canvas
class Assessment < Moodle2CC::CC::Assessment
module Moodle2AA::Canvas
class Assessment < Moodle2AA::CC::Assessment
include Resource
META_ATTRIBUTES = [:title, :description, :lock_at, :unlock_at, :allowed_attempts,
:scoring_policy, :access_code, :ip_filter, :shuffle_answers, :time_limit, :quiz_type]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Moodle2CC::Canvas
class Assignment < Moodle2CC::CC::Assignment
module Moodle2AA::Canvas
class Assignment < Moodle2AA::CC::Assignment
include Resource
SETTINGS_ATTRIBUTES = [:title, :points_possible, :grading_type, :due_at,
:lock_at, :unlock_at, :all_day, :all_day_date, :submission_types,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
module Moodle2CC::Canvas
class Converter < Moodle2CC::CC::Converter
module Moodle2AA::Canvas
class Converter < Moodle2AA::CC::Converter
def initialize(moodle_backup, destination_dir)
super
@resource_factory = Moodle2CC::ResourceFactory.new Moodle2CC::Canvas
@resource_factory = Moodle2AA::ResourceFactory.new Moodle2AA::Canvas
end

def create_resources(resources_node)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Moodle2CC::Canvas
class Course < Moodle2CC::CC::Course
module Moodle2AA::Canvas
class Course < Moodle2AA::CC::Course

attr_accessor :id, :title, :course_code, :start_at, :format, :is_public, :syllabus_body

Expand All @@ -14,7 +14,7 @@ def initialize(course)
@start_at = ims_datetime(Time.at(course.startdate))
@is_public = course.visible
@syllabus_body = convert_file_path_tokens(course.sections.first.summary)
@resource_factory = Moodle2CC::ResourceFactory.new Moodle2CC::Canvas
@resource_factory = Moodle2AA::ResourceFactory.new Moodle2AA::Canvas
end

def identifier
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Moodle2CC::Canvas
class DiscussionTopic < Moodle2CC::CC::DiscussionTopic
module Moodle2AA::Canvas
class DiscussionTopic < Moodle2AA::CC::DiscussionTopic
include Resource
attr_accessor :posted_at, :position, :type, :identifierref

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module Moodle2CC::Canvas
class Label < Moodle2CC::CC::Label
module Moodle2AA::Canvas
class Label < Moodle2AA::CC::Label
include Resource
def create_module_meta_item_elements(item_node)
item_node.content_type 'ContextModuleSubHeader'
Expand Down
Loading

0 comments on commit 2c2a842

Please sign in to comment.