japanda 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -2
- data/README.md +38 -26
- data/japanda.gemspec +3 -2
- data/lib/japanda/canvas_factory/assignment.rb +22 -9
- data/lib/japanda/canvas_factory/course.rb +70 -8
- data/lib/japanda/canvas_factory/mergie.rb +9 -0
- data/lib/japanda/canvas_factory/module.rb +34 -41
- data/lib/japanda/canvas_factory/module_item.rb +37 -0
- data/lib/japanda/canvas_factory/quiz.rb +52 -0
- data/lib/japanda/canvas_factory/section.rb +22 -12
- data/lib/japanda/canvas_factory/user.rb +45 -14
- data/lib/japanda/version.rb +1 -1
- metadata +21 -8
- data/lib/japanda/canvas_factory/assignment_config.rb +0 -27
- data/lib/japanda/canvas_factory/course_config.rb +0 -28
- data/lib/japanda/canvas_factory/module_config.rb +0 -22
- data/lib/japanda/canvas_factory/module_item_config.rb +0 -25
- data/lib/japanda/canvas_factory/section_config.rb +0 -21
- data/lib/japanda/canvas_factory/user_config.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c88d5e552e2c67042dd5da76188c48ffefc2f8b7
|
4
|
+
data.tar.gz: b871098f94298c6ad6c0acb22c7d12a01a6bbd25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdbcc9424cd02a9923fed5121c7d74638888ab9cb37e25e7286f1ecaa0b70a9c46109ee688fdcfa149c28f81bbccca3eba977d613f8d979a1bad148c692c8012
|
7
|
+
data.tar.gz: e4c24a8f9858ebd769ce85723066772e46be305456020c90d6ebdba950cab3f5f53f5753d9569b8c87cdab79d27742e6d6bdb15100824171bea160757533414c
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
japanda (0.1.
|
4
|
+
japanda (0.1.4)
|
5
5
|
rest-client
|
6
6
|
|
7
7
|
GEM
|
@@ -11,6 +11,7 @@ GEM
|
|
11
11
|
domain_name (0.5.24)
|
12
12
|
unf (>= 0.0.5, < 1.0.0)
|
13
13
|
dotenv (2.0.2)
|
14
|
+
hashie (2.0.5)
|
14
15
|
http-cookie (1.0.2)
|
15
16
|
domain_name (~> 0.5)
|
16
17
|
mime-types (2.6.2)
|
@@ -43,9 +44,10 @@ PLATFORMS
|
|
43
44
|
DEPENDENCIES
|
44
45
|
bundler (>= 1.0.0)
|
45
46
|
dotenv
|
47
|
+
hashie
|
46
48
|
japanda!
|
47
49
|
rake (~> 10.0)
|
48
50
|
rspec
|
49
51
|
|
50
52
|
BUNDLED WITH
|
51
|
-
1.10.
|
53
|
+
1.10.6
|
data/README.md
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
# Japanda
|
2
|
-
Japanda provides an object oriented wrapper and functional wrapper around canvas api
|
3
|
-
Disclaimer: For testing purposes only
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
Japanda provides an object-oriented wrapper and functional wrapper around Instructure Canvas Api's
|
4
|
+
|
5
|
+
Disclaimer: For testing purposes only.
|
6
|
+
|
7
|
+
v0.1.3 Features
|
8
|
+
|
9
|
+
1. Create canvas learner user and admin user
|
10
|
+
2. Create canvas course
|
11
|
+
3. Add sections to canvas
|
12
|
+
4. Add module(s) with assignment(s)
|
10
13
|
|
11
14
|
## Installation
|
12
15
|
|
13
16
|
Add this line to your application's Gemfile:
|
14
17
|
|
15
|
-
|
16
|
-
gem 'japanda'
|
17
|
-
```
|
18
|
+
gem 'japanda'
|
18
19
|
|
19
20
|
And then execute:
|
20
21
|
|
@@ -25,34 +26,45 @@ Or install it yourself as:
|
|
25
26
|
$ gem install japanda
|
26
27
|
|
27
28
|
## Usage
|
29
|
+
|
28
30
|
Set a few enviroment variables( or use .env.example file)
|
29
31
|
|
30
|
-
|
31
|
-
export
|
32
|
-
export
|
33
|
-
|
34
|
-
|
32
|
+
export CANVAS_API_HOST=
|
33
|
+
export CANVAS_API_TOKEN=
|
34
|
+
export CANVAS_ACCOUNT_ID=
|
35
|
+
|
36
|
+
To create a new course
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
CanvasFactory::Course.new
|
39
|
+
|
40
|
+
To create a canvas course by specifying the course config
|
39
41
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
course_config = CanvasFactory::CourseConfig.new({ name: 'Candy Tasting' })
|
43
|
+
course = CanvasFactory::Course.new course_config
|
44
|
+
|
45
|
+
To create a canvas learner user
|
46
|
+
|
47
|
+
user_config = CanvasFactory::UserConfig.new(short_name: 'John Doe', password: 'Password01')
|
48
|
+
user = CanvasFactory::User.new(user_config)
|
49
|
+
learner_user = user.create_learner_user
|
44
50
|
|
45
51
|
## Development
|
46
52
|
|
47
|
-
After checking out the repo, run `
|
53
|
+
After checking out the repo, run `bundle install` to install dependencies. Then, run `rspec` to run the tests.
|
54
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
55
|
+
|
56
|
+
## Release a new version
|
57
|
+
|
58
|
+
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
48
59
|
|
49
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
50
60
|
|
51
61
|
## Contributing
|
52
62
|
|
53
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
63
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/babababili/japanda. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
54
64
|
|
55
65
|
|
56
66
|
## License
|
57
|
-
|
67
|
+
|
68
|
+
For testing purposes only.
|
69
|
+
|
58
70
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/japanda.gemspec
CHANGED
@@ -6,8 +6,8 @@ require 'japanda/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'japanda'
|
8
8
|
spec.version = Japanda::VERSION
|
9
|
-
spec.authors = ['Santosh Natarajan']
|
10
|
-
spec.email = ['snatarajan@instructure.com']
|
9
|
+
spec.authors = ['Santosh Natarajan', 'Robert Lamb']
|
10
|
+
spec.email = ['snatarajan@instructure.com', 'rlamb@instructure.com']
|
11
11
|
|
12
12
|
spec.summary = %q{Library to create custom course.}
|
13
13
|
spec.description = %q{Library to create custom course. wip.}
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency 'bundler', '>= 1.0.0'
|
31
31
|
spec.add_development_dependency 'rake', '~> 10.0'
|
32
32
|
spec.add_development_dependency 'rspec'
|
33
|
+
spec.add_development_dependency 'hashie'
|
33
34
|
spec.add_development_dependency 'dotenv'
|
34
35
|
spec.add_dependency 'rest-client'
|
35
36
|
end
|
@@ -1,17 +1,31 @@
|
|
1
|
-
# assignment class
|
2
1
|
module CanvasFactory
|
2
|
+
# assignment class
|
3
3
|
class Assignment
|
4
|
-
attr_reader :id, :name, :course_id, :html_url, :grading_type, :published, :due_at,
|
4
|
+
attr_reader :id, :name, :course_id, :html_url, :grading_type, :published, :due_at,
|
5
|
+
:created_at, :request, :response
|
5
6
|
|
6
|
-
def initialize(course_id,
|
7
|
-
fail 'invalid course_id' if course_id.nil?
|
7
|
+
def initialize(course_id, opts = {}, merge = true)
|
8
8
|
@course_id = course_id
|
9
|
-
|
9
|
+
@request = {
|
10
|
+
assignment: {
|
11
|
+
name: "Assignment-#{Time.now.to_i}",
|
12
|
+
grading_type: %w(pass_fail percent letter_grade gpa_scale points).sample,
|
13
|
+
submission_types: ['online_text_entry'],
|
14
|
+
points_possible: 10,
|
15
|
+
due_at: (DateTime.now + 1).iso8601,
|
16
|
+
published: true
|
17
|
+
}
|
18
|
+
}
|
19
|
+
@request = Mergie.deep_merge(@request, opts, merge)
|
20
|
+
create_assignment
|
21
|
+
self
|
10
22
|
end
|
11
23
|
|
12
|
-
|
13
|
-
|
14
|
-
|
24
|
+
private
|
25
|
+
|
26
|
+
def create_assignment
|
27
|
+
assign_end_point = "#{CANVAS_API_V1}/courses/#{@course_id}/assignments"
|
28
|
+
@response = CanvasFactory.perform_post(assign_end_point, @request)
|
15
29
|
@id = response['id']
|
16
30
|
@name = response['name']
|
17
31
|
@html_url = response['html_url']
|
@@ -19,7 +33,6 @@ module CanvasFactory
|
|
19
33
|
@published = response['published']
|
20
34
|
@created_at = response['created_at']
|
21
35
|
@due_at = response['due_at']
|
22
|
-
self
|
23
36
|
end
|
24
37
|
end
|
25
38
|
end
|
@@ -1,16 +1,78 @@
|
|
1
|
-
# canvas course class
|
2
1
|
module CanvasFactory
|
2
|
+
# canvas course class
|
3
3
|
class Course
|
4
|
-
attr_reader :course_response, :course_id, :course_code, :course_name, :
|
4
|
+
attr_reader :course_response, :course_id, :course_code, :course_name, :course_request,
|
5
|
+
:sections, :modules, :assignments, :quizzes
|
5
6
|
|
6
|
-
def initialize(
|
7
|
-
@
|
8
|
-
|
7
|
+
def initialize(opts = {}, merge = true)
|
8
|
+
@sections = []
|
9
|
+
@modules = []
|
10
|
+
@assignments = []
|
11
|
+
@quizzes = []
|
12
|
+
course_name_code = "auto#{SecureRandom.hex}"
|
13
|
+
@course_request = {
|
14
|
+
account_id: CANVAS_ACCOUNT_ID,
|
15
|
+
course: {
|
16
|
+
name: course_name_code,
|
17
|
+
course_code: course_name_code,
|
18
|
+
start_at: Time.now,
|
19
|
+
end_at: Time.now + (30 * 24 * 60 * 60),
|
20
|
+
license: 'public_domain',
|
21
|
+
is_public: true,
|
22
|
+
is_public_to_auth_users: false,
|
23
|
+
public_syllabus: false,
|
24
|
+
public_description: 'api created course',
|
25
|
+
allow_student_wiki_edits: true,
|
26
|
+
allow_wiki_comments: true,
|
27
|
+
allow_student_forum_attachments: true,
|
28
|
+
open_enrollment: true,
|
29
|
+
self_enrollment: false,
|
30
|
+
restrict_enrollments_to_course_dates: false,
|
31
|
+
term_id: nil,
|
32
|
+
# sis_course_id: '', # field is included only when user has permission to view SIS information
|
33
|
+
# integration_id: '', # field is included only when user has permission to view SIS information
|
34
|
+
hide_final_grades: true,
|
35
|
+
apply_assignment_group_weights: false,
|
36
|
+
syllabus_body: 'api syllabus',
|
37
|
+
grading_standard_id: nil,
|
38
|
+
course_format: 'online'
|
39
|
+
},
|
40
|
+
offer: true,
|
41
|
+
enroll_me: false,
|
42
|
+
enable_sis_reactivation: false
|
43
|
+
}
|
44
|
+
@course_request = Mergie.deep_merge(@course_request, opts, merge)
|
45
|
+
create_course
|
9
46
|
end
|
10
47
|
|
11
|
-
def
|
12
|
-
|
13
|
-
@
|
48
|
+
def add_section(opts = {}, merge = true)
|
49
|
+
section = CanvasFactory::Section.new(@course_id, opts, merge)
|
50
|
+
@sections << section
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_module(opts = {}, merge = true)
|
54
|
+
mod = CanvasFactory::Module.new(@course_id, opts, merge)
|
55
|
+
@modules << mod
|
56
|
+
mod
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_assignment(opts = {}, merge = true)
|
60
|
+
assignment = CanvasFactory::Assignment.new(@course_id, opts, merge)
|
61
|
+
@assignments << assignment
|
62
|
+
assignment
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_quiz(opts = {}, merge = true)
|
66
|
+
quiz = CanvasFactory::Quiz.new(@course_id, opts, merge)
|
67
|
+
@quizzes << quiz
|
68
|
+
quiz
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def create_course
|
74
|
+
course_end_point = "#{CANVAS_API_V1}/accounts/#{@course_request[:account_id]}/courses"
|
75
|
+
@course_response = CanvasFactory.perform_post(course_end_point, @course_request)
|
14
76
|
@course_id = @course_response['id']
|
15
77
|
@course_name = @course_response['name']
|
16
78
|
@course_code = @course_response['course_code']
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'hashie/extensions/deep_merge'
|
2
|
+
|
3
|
+
class Mergie < Hash
|
4
|
+
include Hashie::Extensions::DeepMerge
|
5
|
+
|
6
|
+
def self.deep_merge(default_hash, given_hash, should_merge)
|
7
|
+
should_merge ? Mergie[default_hash].deep_merge(Mergie[given_hash]).to_h: given_hash
|
8
|
+
end
|
9
|
+
end
|
@@ -1,58 +1,51 @@
|
|
1
|
-
# canvas module class
|
2
1
|
module CanvasFactory
|
2
|
+
# canvas module class
|
3
3
|
class Module
|
4
|
-
attr_reader :
|
5
|
-
:
|
6
|
-
:assignments
|
4
|
+
attr_reader :course_id, :name, :module_id, :published, :request, :response,
|
5
|
+
:module_items, :publish_response, :publish_request
|
7
6
|
|
8
|
-
def initialize(course_id,
|
9
|
-
@
|
10
|
-
|
11
|
-
|
7
|
+
def initialize(course_id, opts = {}, merge = true)
|
8
|
+
@module_items = []
|
9
|
+
@course_id = course_id
|
10
|
+
@request = {
|
11
|
+
module: {
|
12
|
+
name: "module-#{Time.now.to_i}",
|
13
|
+
unlock_at: DateTime.now.iso8601,
|
14
|
+
require_sequential_progress: true
|
15
|
+
}
|
16
|
+
}
|
17
|
+
@request = Mergie.deep_merge(@request, opts, merge)
|
18
|
+
create_module
|
19
|
+
self
|
12
20
|
end
|
13
21
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@id = response['id']
|
19
|
-
@name = response['name']
|
20
|
-
@position = response['position']
|
21
|
-
@unlock_at = response['unlock_at']
|
22
|
-
@require_sequential_progress = response['require_sequential_progress']
|
23
|
-
@publish_final_grade = response['publish_final_grade']
|
24
|
-
@prerequisite_module_ids = response['prerequisite_module_ids']
|
25
|
-
@published = response['published']
|
26
|
-
@items_count = response['items_count']
|
27
|
-
@items_url = response['items_url']
|
22
|
+
def add_module_item(content, opts = {}, merge = true) # content can be assignment or quiz ...
|
23
|
+
module_item = CanvasFactory::ModuleItem.new(@course_id, @module_id, content, opts, merge)
|
24
|
+
@module_items << module_item
|
25
|
+
module_item
|
28
26
|
end
|
29
27
|
|
30
|
-
def
|
31
|
-
|
28
|
+
def publish(opts = {}, merge = true)
|
29
|
+
@publish_request = {
|
32
30
|
module: {
|
33
31
|
published: true
|
34
32
|
}
|
35
33
|
}
|
36
|
-
|
37
|
-
|
38
|
-
@
|
34
|
+
@publish_request = Mergie.deep_merge(@publish_request, opts, merge)
|
35
|
+
publish_ep = "#{CANVAS_API_V1}/courses/#{@course_id}/modules/#{@module_id}"
|
36
|
+
@publish_response = CanvasFactory.perform_put(publish_ep, @publish_request)
|
37
|
+
@published = @publish_response['published']
|
39
38
|
end
|
40
39
|
|
41
|
-
|
42
|
-
item_end_point = "#{CANVAS_API_V1}/courses/#{@course_id}/modules/#{@id}/items"
|
43
|
-
CanvasFactory.perform_post(item_end_point, module_item_request)
|
44
|
-
publish_module
|
45
|
-
end
|
40
|
+
private
|
46
41
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
@assignments << assignment
|
55
|
-
assignment
|
42
|
+
def create_module
|
43
|
+
m_item_end_point = "#{CANVAS_API_V1}/courses/#{@course_id}/modules"
|
44
|
+
@response = CanvasFactory.perform_post(m_item_end_point, @request)
|
45
|
+
@course_id = course_id
|
46
|
+
@module_id = response['id']
|
47
|
+
@name = response['name']
|
48
|
+
@published = response['published']
|
56
49
|
end
|
57
50
|
end
|
58
51
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module CanvasFactory
|
2
|
+
# module item class
|
3
|
+
class ModuleItem
|
4
|
+
attr_reader :item_id, :name, :course_id, :html_url, :title, :published, :type,
|
5
|
+
:created_at, :request, :response, :module_id
|
6
|
+
|
7
|
+
def initialize(course_id, module_id, content, opts = {}, merge = true)
|
8
|
+
@course_id = course_id
|
9
|
+
@module_id = module_id
|
10
|
+
@request = {
|
11
|
+
module_item: {
|
12
|
+
title: "module-item#{SecureRandom.hex}",
|
13
|
+
type: content.class.name.split('::').last || '',
|
14
|
+
content_id: content.id,
|
15
|
+
completion_requirement: {
|
16
|
+
type: 'must_view'
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
@request = Mergie.deep_merge(@request, opts, merge)
|
21
|
+
create_item
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def create_item
|
28
|
+
item_end_point = "#{CANVAS_API_V1}/courses/#{@course_id}/modules/#{@module_id}/items"
|
29
|
+
@response = CanvasFactory.perform_post(item_end_point, @request)
|
30
|
+
@published = response['published']
|
31
|
+
@item_id = response['id']
|
32
|
+
@type = response['type']
|
33
|
+
@title = response['title']
|
34
|
+
@html_url = response['html_url']
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module CanvasFactory
|
2
|
+
# Quiz class
|
3
|
+
class Quiz
|
4
|
+
attr_reader :id, :course_id, :html_url, :published, :due_at, :title,
|
5
|
+
:request, :response
|
6
|
+
|
7
|
+
def initialize(course_id, opts = {}, merge = true)
|
8
|
+
@course_id = course_id
|
9
|
+
@request = {
|
10
|
+
quiz: {
|
11
|
+
title: "quiz-#{Time.now.to_i}",
|
12
|
+
description: 'api created quiz',
|
13
|
+
quiz_type: %w(practice_quiz assignment graded_survey survey).sample,
|
14
|
+
assignment_group_id: nil,
|
15
|
+
time_limit: nil,
|
16
|
+
shuffle_answers: true,
|
17
|
+
hide_results: %w(always until_after_last_attempt).sample,
|
18
|
+
show_correct_answers: true,
|
19
|
+
show_correct_answers_last_attempt: true,
|
20
|
+
hide_correct_answers_at: true,
|
21
|
+
allowed_attempts: 1,
|
22
|
+
scoring_policy: %w(keep_highest keep_latest).sample,
|
23
|
+
one_question_at_a_time: false,
|
24
|
+
cant_go_back: false,
|
25
|
+
access_code: nil,
|
26
|
+
ip_filter: nil,
|
27
|
+
due_at: (DateTime.now + 10).iso8601,
|
28
|
+
lock_at: (DateTime.now + 10).iso8601,
|
29
|
+
unlock_at: (DateTime.now).iso8601,
|
30
|
+
published: true,
|
31
|
+
one_time_results: false
|
32
|
+
}
|
33
|
+
}
|
34
|
+
@request = Mergie.deep_merge(@request, opts, merge)
|
35
|
+
create_quiz
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def create_quiz
|
42
|
+
quiz_end_point = "#{CANVAS_API_V1}/courses/#{@course_id}/quizzes"
|
43
|
+
@response = CanvasFactory.perform_post(quiz_end_point, @request)
|
44
|
+
@id = response['id']
|
45
|
+
@title = response['title']
|
46
|
+
@html_url = response['html_url']
|
47
|
+
@published = response['published']
|
48
|
+
@due_at = response['due_at']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -1,26 +1,36 @@
|
|
1
|
-
# canvas section class
|
2
1
|
module CanvasFactory
|
2
|
+
# canvas section class
|
3
3
|
class Section
|
4
4
|
attr_reader :course_id, :id, :end_at, :start_at, :name, :sis_section_id, :sis_course_id,
|
5
|
-
:integration_id, :sis_import_id, :nonxlist_course_id
|
5
|
+
:integration_id, :sis_import_id, :nonxlist_course_id, :request, :response
|
6
6
|
|
7
|
-
def initialize(course_id,
|
8
|
-
|
7
|
+
def initialize(course_id, opts = {}, merge = true)
|
8
|
+
@course_id = course_id
|
9
|
+
@request = {
|
10
|
+
course_section: {
|
11
|
+
name: "section-#{Time.now.to_i}",
|
12
|
+
start_at: Time.now,
|
13
|
+
end_at: Time.now + (30 * 24 * 60 * 60),
|
14
|
+
restrict_enrollments_to_section_dates: false,
|
15
|
+
# enable_sis_reactivation: false,
|
16
|
+
# sis_section_id: nil
|
17
|
+
}
|
18
|
+
}
|
19
|
+
@request = Mergie.deep_merge(@request, opts, merge)
|
20
|
+
create_section
|
21
|
+
self
|
9
22
|
end
|
10
23
|
|
11
|
-
|
12
|
-
|
13
|
-
|
24
|
+
private
|
25
|
+
|
26
|
+
def create_section
|
27
|
+
section_end_point = "#{CANVAS_API_V1}/courses/#{@course_id}/sections"
|
28
|
+
@response = CanvasFactory.perform_post(section_end_point, @request)
|
14
29
|
@course_id = response['course_id']
|
15
30
|
@id = response['id']
|
16
31
|
@name = response['name']
|
17
32
|
@end_at = response['end_at']
|
18
33
|
@start_at = response['start_at']
|
19
|
-
@sis_section_id = response['sis_section_id']
|
20
|
-
@sis_course_id = response['sis_course_id']
|
21
|
-
@integration_id = response['integration_id']
|
22
|
-
@sis_import_id = response['sis_import_id']
|
23
|
-
@nonxlist_course_id = response['nonxlist_course_id']
|
24
34
|
end
|
25
35
|
end
|
26
36
|
end
|
@@ -1,27 +1,58 @@
|
|
1
|
-
# canvas user class
|
2
1
|
module CanvasFactory
|
2
|
+
# canvas user class
|
3
3
|
class User
|
4
|
-
attr_reader :
|
5
|
-
:
|
4
|
+
attr_reader :learner_request, :user_response, :id, :admin_request,
|
5
|
+
:email_id, :short_name, :password
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
|
7
|
+
def initialize(opts = {}, merge = true)
|
8
|
+
unique_email = "#{@email_prefix}#{SecureRandom.hex}@example.com"
|
9
|
+
@learner_request = {
|
10
|
+
user: {
|
11
|
+
name: unique_email,
|
12
|
+
short_name: 'auto user',
|
13
|
+
terms_of_use: '1',
|
14
|
+
send_confirmation: true
|
15
|
+
},
|
16
|
+
pseudonym: {
|
17
|
+
unique_id: unique_email,
|
18
|
+
password: 'Testing01'
|
19
|
+
},
|
20
|
+
force_validations: true
|
21
|
+
}
|
22
|
+
@learner_request = Mergie.deep_merge(@learner_request, opts, merge)
|
23
|
+
create_learner_user
|
9
24
|
end
|
10
25
|
|
26
|
+
private
|
27
|
+
|
11
28
|
def create_learner_user
|
12
29
|
user_end_point = "#{CANVAS_API_V1}/accounts/#{CANVAS_ACCOUNT_ID}/users"
|
13
|
-
@user_response = CanvasFactory.perform_post(user_end_point, @
|
14
|
-
@
|
15
|
-
@
|
16
|
-
@
|
17
|
-
@
|
30
|
+
@user_response = CanvasFactory.perform_post(user_end_point, @learner_request)
|
31
|
+
@id = @user_response['id']
|
32
|
+
@email_id = @user_response['login_id']
|
33
|
+
@short_name = @user_response['short_name']
|
34
|
+
@password = @learner_request[:pseudonym][:password]
|
35
|
+
@user_response
|
18
36
|
end
|
37
|
+
end
|
19
38
|
|
20
|
-
|
21
|
-
|
22
|
-
|
39
|
+
# canvas admin user class
|
40
|
+
class AdminUser < User
|
41
|
+
def initialize(opts = {}, merge = true)
|
42
|
+
super(opts, merge)
|
43
|
+
make_admin_user
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def make_admin_user
|
49
|
+
@admin_request = {
|
50
|
+
user_id: @id,
|
51
|
+
role_id: 'AccountAdmin',
|
52
|
+
send_confirmation: true
|
53
|
+
}
|
23
54
|
admin_end_point = "#{CANVAS_API_V1}/accounts/#{CANVAS_ACCOUNT_ID}/admins"
|
24
|
-
CanvasFactory.perform_post(admin_end_point,
|
55
|
+
CanvasFactory.perform_post(admin_end_point, @admin_request)
|
25
56
|
end
|
26
57
|
end
|
27
58
|
end
|
data/lib/japanda/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: japanda
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Santosh Natarajan
|
8
|
+
- Robert Lamb
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-09
|
12
|
+
date: 2015-12-09 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
@@ -52,6 +53,20 @@ dependencies:
|
|
52
53
|
- - ">="
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: hashie
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
55
70
|
- !ruby/object:Gem::Dependency
|
56
71
|
name: dotenv
|
57
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,6 +98,7 @@ dependencies:
|
|
83
98
|
description: Library to create custom course. wip.
|
84
99
|
email:
|
85
100
|
- snatarajan@instructure.com
|
101
|
+
- rlamb@instructure.com
|
86
102
|
executables: []
|
87
103
|
extensions: []
|
88
104
|
extra_rdoc_files: []
|
@@ -102,16 +118,13 @@ files:
|
|
102
118
|
- lib/japanda.rb
|
103
119
|
- lib/japanda/canvas_factory.rb
|
104
120
|
- lib/japanda/canvas_factory/assignment.rb
|
105
|
-
- lib/japanda/canvas_factory/assignment_config.rb
|
106
121
|
- lib/japanda/canvas_factory/course.rb
|
107
|
-
- lib/japanda/canvas_factory/
|
122
|
+
- lib/japanda/canvas_factory/mergie.rb
|
108
123
|
- lib/japanda/canvas_factory/module.rb
|
109
|
-
- lib/japanda/canvas_factory/
|
110
|
-
- lib/japanda/canvas_factory/
|
124
|
+
- lib/japanda/canvas_factory/module_item.rb
|
125
|
+
- lib/japanda/canvas_factory/quiz.rb
|
111
126
|
- lib/japanda/canvas_factory/section.rb
|
112
|
-
- lib/japanda/canvas_factory/section_config.rb
|
113
127
|
- lib/japanda/canvas_factory/user.rb
|
114
|
-
- lib/japanda/canvas_factory/user_config.rb
|
115
128
|
- lib/japanda/version.rb
|
116
129
|
homepage:
|
117
130
|
licenses: []
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module CanvasFactory
|
2
|
-
class AssignmentConfig
|
3
|
-
attr_accessor :name, :grading_type, :submission_types, :points_possible, :due_at, :published
|
4
|
-
|
5
|
-
def initialize(opts = {})
|
6
|
-
@name = opts[:name] || "Assignment-#{Time.now.to_i}"
|
7
|
-
@grading_type = opts[:grading_type] || %w(pass_fail percent letter_grade gpa_scale points).sample
|
8
|
-
@submission_types = opts[:submission_types] || ['online_text_entry']
|
9
|
-
@points_possible = opts[:points_possible] || 10
|
10
|
-
@due_at = opts[:due_at] || (DateTime.now + 1).iso8601
|
11
|
-
@published = opts[:published] || true
|
12
|
-
end
|
13
|
-
|
14
|
-
def request_body
|
15
|
-
{
|
16
|
-
assignment: {
|
17
|
-
name: @name,
|
18
|
-
grading_type: @grading_type,
|
19
|
-
submission_types: @submission_types,
|
20
|
-
points_possible: @points_possible,
|
21
|
-
due_at: @due_at,
|
22
|
-
published: @published
|
23
|
-
}
|
24
|
-
}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module CanvasFactory
|
2
|
-
class CourseConfig
|
3
|
-
attr_accessor :account_id, :name, :course_code, :start_at, :end_at, :offer
|
4
|
-
|
5
|
-
def initialize(opts = {})
|
6
|
-
course_name_code = "auto#{SecureRandom.hex}"
|
7
|
-
@account_id = opts[:account_id] || CANVAS_ACCOUNT_ID
|
8
|
-
@name = opts[:name] || course_name_code
|
9
|
-
@course_code = opts[:course_code] || course_name_code
|
10
|
-
@start_at = opts[:start_at] || Time.now
|
11
|
-
@end_at = opts[:end_at] || Time.now + (30 * 24 * 60 * 60)
|
12
|
-
@offer = opts[:offer] || true
|
13
|
-
end
|
14
|
-
|
15
|
-
def request_body
|
16
|
-
{
|
17
|
-
account_id: @account_id,
|
18
|
-
course: {
|
19
|
-
name: @name,
|
20
|
-
course_code: @course_code,
|
21
|
-
start_at: @start_at,
|
22
|
-
end_at: @end_at
|
23
|
-
},
|
24
|
-
offer: @offer
|
25
|
-
}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module CanvasFactory
|
2
|
-
class ModuleConfig
|
3
|
-
attr_accessor :name, :unlock_at, :require_sequential_progress
|
4
|
-
|
5
|
-
def initialize(opts = {})
|
6
|
-
@name = opts[:name] || "module-#{Time.now.to_i}"
|
7
|
-
@unlock_at = opts[:unlock_at] || DateTime.now.iso8601
|
8
|
-
@require_sequential_progress = opts[:require_sequential_progress] || true
|
9
|
-
@published = opts[:published] || true
|
10
|
-
end
|
11
|
-
|
12
|
-
def request_body
|
13
|
-
{
|
14
|
-
module: {
|
15
|
-
name: @name,
|
16
|
-
unlock_at: @unlock_at,
|
17
|
-
require_sequential_progress: @require_sequential_progress
|
18
|
-
}
|
19
|
-
}
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module CanvasFactory
|
2
|
-
class ModuleItemConfig
|
3
|
-
attr_accessor :module_item_type, :content_id, :completion_type, :title
|
4
|
-
|
5
|
-
def initialize(opts = {})
|
6
|
-
@module_item_type = opts[:module_item_type] || 'Assignment'
|
7
|
-
@content_id = opts[:content_id]
|
8
|
-
@completion_type = opts[:completion_type] || 'must_view'
|
9
|
-
@title = opts[:title] || 'module_assignment'
|
10
|
-
end
|
11
|
-
|
12
|
-
def request_body
|
13
|
-
{
|
14
|
-
module_item: {
|
15
|
-
title: @title,
|
16
|
-
type: @module_item_type,
|
17
|
-
content_id: @content_id,
|
18
|
-
completion_requirement: {
|
19
|
-
type: @completion_type
|
20
|
-
}
|
21
|
-
}
|
22
|
-
}
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module CanvasFactory
|
2
|
-
class SectionConfig
|
3
|
-
attr_accessor :name, :start_at, :end_at
|
4
|
-
|
5
|
-
def initialize(opts = {})
|
6
|
-
@name = opts[:name] || "section-#{Time.now.to_i}"
|
7
|
-
@start_at = opts[:start_at] || Time.now
|
8
|
-
@end_at = opts[:end_at] || Time.now + (30 * 24 * 60 * 60)
|
9
|
-
end
|
10
|
-
|
11
|
-
def request_body
|
12
|
-
{
|
13
|
-
course_section: {
|
14
|
-
name: @name,
|
15
|
-
start_at: @start_at,
|
16
|
-
end_at: @end_at
|
17
|
-
}
|
18
|
-
}
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module CanvasFactory
|
2
|
-
class UserConfig
|
3
|
-
attr_accessor :email_prefix, :password, :short_name, :terms_of_use, :send_confirmation,
|
4
|
-
:force_validations, :role_id, :email_id
|
5
|
-
|
6
|
-
def initialize(opts = {})
|
7
|
-
@email_prefix = opts[:email_prefix] || 'catauto'
|
8
|
-
@password = opts[:password] || 'Testing01'
|
9
|
-
@short_name = opts[:short_name] || 'cat auto'
|
10
|
-
@terms_of_use = opts[:terms_of_use] || '1'
|
11
|
-
@send_confirmation = opts[:send_confirmation] || true
|
12
|
-
@force_validations = opts[:force_validations] || true
|
13
|
-
@role_id = opts[:role_id] || 'AccountAdmin'
|
14
|
-
@email_id = opts[:email_id] || "#{@email_prefix}#{SecureRandom.hex}@example.com"
|
15
|
-
end
|
16
|
-
|
17
|
-
def user_request_body
|
18
|
-
{
|
19
|
-
user: {
|
20
|
-
name: @email_id,
|
21
|
-
short_name: @short_name,
|
22
|
-
terms_of_use: @terms_of_use,
|
23
|
-
send_confirmation: @send_confirmation
|
24
|
-
},
|
25
|
-
pseudonym: {
|
26
|
-
unique_id: @email_id,
|
27
|
-
password: @password
|
28
|
-
},
|
29
|
-
force_validations: @force_validations
|
30
|
-
}
|
31
|
-
end
|
32
|
-
|
33
|
-
def admin_request_body(id)
|
34
|
-
{
|
35
|
-
user_id: id,
|
36
|
-
role_id: @role_id,
|
37
|
-
send_confirmation: @send_confirmation
|
38
|
-
}
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|