github-to-canvas 0.1.7.pre → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/github-to-canvas +41 -12
- data/lib/github-to-canvas.rb +41 -2
- data/lib/github-to-canvas/canvas_interface.rb +9 -8
- data/lib/github-to-canvas/repository_converter.rb +22 -18
- data/lib/github-to-canvas/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ec838f45344a5baa221fdd8269eb9c1405916b8c380b9f6f5d7cd7ca01c3740
|
4
|
+
data.tar.gz: d03331e0767f7019ef6cbbb0b0cc7e44209184419ecf09072f96f19bbee3d21d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 906786dea4252483a97dc04c5ecd4684c0ef2800e9a33e3b10a8ac4982912806e4053f18517c6b7577b2206349435f2f8aea61465da27d4c608d13d087a99579
|
7
|
+
data.tar.gz: c0482ac88b6f62cc022619a4045ed96392c4834ebc6e4e177e95574d4dbfaec55e8b2f40881d7b9d3d5a04a70678d33203b55886254714843f2a83c121cff0b0
|
data/bin/github-to-canvas
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'byebug'
|
4
3
|
|
5
4
|
require 'optparse'
|
6
5
|
require 'github-to-canvas'
|
@@ -78,7 +77,6 @@ OptionParser.new do |opts|
|
|
78
77
|
end
|
79
78
|
opts.on("-tTYPE", "--type TYPE",
|
80
79
|
"Sets the type Canvas lesson to be created (page or assignment). If no type, type decided based on repository structure") do |type|
|
81
|
-
# byebug
|
82
80
|
options[:type] = type.downcase
|
83
81
|
abort if type == 'quiz' || type == 'discussion'
|
84
82
|
# if type == 'page' || type == 'assignment' || type == 'discussion' || type == 'quiz' || type == 'Page' || type == 'Assignment' || type == 'Discussion' || type == 'Quiz'
|
@@ -116,6 +114,10 @@ OptionParser.new do |opts|
|
|
116
114
|
"Adds AAQ flag to HTML header appended with --fis-links") do |aaq|
|
117
115
|
options[:aaq] = aaq
|
118
116
|
end
|
117
|
+
opts.on("--prework",
|
118
|
+
"Adds prework flag to HTML header appended with --fis-links") do |prework|
|
119
|
+
options[:prework] = prework
|
120
|
+
end
|
119
121
|
opts.on("--forkable",
|
120
122
|
"Used with --fis-links, adds fork button to HTML header injected into Canvas lesson") do |remote|
|
121
123
|
options[:forkable] = true
|
@@ -148,10 +150,10 @@ OptionParser.new do |opts|
|
|
148
150
|
"Use with --map. Outputs repo URLs instead of YAML") do |urls|
|
149
151
|
options[:urls_only] = urls
|
150
152
|
end
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
153
|
+
opts.on("--csv",
|
154
|
+
"Returns a course's lesson struction as CSV") do |csv|
|
155
|
+
options[:csv] = csv
|
156
|
+
end
|
155
157
|
opts.on("--read-from-canvas CANVAS_URL",
|
156
158
|
"Retrieves an existing Canvas lesson using the provided URL") do |url|
|
157
159
|
options[:read_from_canvas] = url
|
@@ -197,9 +199,13 @@ OptionParser.new do |opts|
|
|
197
199
|
options[:canvas_to_canvas] = canvas_to_canvas
|
198
200
|
end
|
199
201
|
opts.on("--build-from-csv CSV",
|
200
|
-
"Build a course
|
202
|
+
"Build a course using a CSV of lesson repos, names, modules, and types") do |csv_build|
|
201
203
|
options[:csv_build] = csv_build
|
202
204
|
end
|
205
|
+
opts.on("--update-from-csv CSV",
|
206
|
+
"Update a course using a CSV of lesson repos, names, modules, types, lesson IDs, and course IDs") do |csv_align|
|
207
|
+
options[:csv_align] = csv_align
|
208
|
+
end
|
203
209
|
|
204
210
|
|
205
211
|
end.parse!
|
@@ -232,6 +238,7 @@ if options[:read_from_github]
|
|
232
238
|
forkable: !!options[:forkable],
|
233
239
|
fis_links: !!options[:fis],
|
234
240
|
aaq: !!options[:aaq],
|
241
|
+
prework: !!options[:prework],
|
235
242
|
contains_html: options[:contains_html])
|
236
243
|
abort
|
237
244
|
end
|
@@ -247,6 +254,7 @@ if options[:create_from_github]
|
|
247
254
|
forkable: !!options[:forkable],
|
248
255
|
fis_links: !!options[:fis],
|
249
256
|
aaq: !!options[:aaq],
|
257
|
+
prework: !!options[:prework],
|
250
258
|
contains_html: options[:contains_html])
|
251
259
|
else
|
252
260
|
puts 'Canvas course ID and lesson type required. Example: github-to-canvas --create-from-github URL --course ID --type TYPE'
|
@@ -266,6 +274,7 @@ if options[:align_from_github]
|
|
266
274
|
forkable: !!options[:forkable],
|
267
275
|
fis_links: !!options[:fis],
|
268
276
|
aaq: !!options[:aaq],
|
277
|
+
prework: !!options[:prework],
|
269
278
|
contains_html: options[:contains_html])
|
270
279
|
else
|
271
280
|
puts 'Canvas course ID, lesson ID, and type required. Example: github-to-canvas --create-from-github URL --course COURSE_ID --id LESSON_ID --type TYPE'
|
@@ -281,14 +290,15 @@ end
|
|
281
290
|
if options[:map]
|
282
291
|
GithubToCanvas.new(mode: 'map',
|
283
292
|
file_to_convert: options[:map],
|
284
|
-
urls_only: !!options[:urls_only]
|
293
|
+
urls_only: !!options[:urls_only],
|
294
|
+
csv: !!options[:csv])
|
285
295
|
abort
|
286
296
|
end
|
287
297
|
|
288
|
-
if options[:csv]
|
289
|
-
|
290
|
-
|
291
|
-
end
|
298
|
+
# if options[:csv]
|
299
|
+
# GithubToCanvas.new(mode: 'csv', file_to_convert: options[:csv])
|
300
|
+
# abort
|
301
|
+
# end
|
292
302
|
|
293
303
|
if options[:csv_build]
|
294
304
|
GithubToCanvas.new(mode: 'csv_build',
|
@@ -304,12 +314,27 @@ if options[:csv_build]
|
|
304
314
|
abort
|
305
315
|
end
|
306
316
|
|
317
|
+
if options[:csv_align]
|
318
|
+
GithubToCanvas.new(mode: 'csv_align',
|
319
|
+
file_to_convert: options[:csv_align],
|
320
|
+
course_id: options[:course_id],
|
321
|
+
fis_links: !!options[:fis],
|
322
|
+
remove_header_and_footer: !!options[:remove_header_and_footer],
|
323
|
+
aaq: !!options[:aaq],
|
324
|
+
forkable: !!options[:forkable],
|
325
|
+
branch: options[:branch],
|
326
|
+
contains_html: options[:contains_html],
|
327
|
+
git_links: !!options[:git_links])
|
328
|
+
abort
|
329
|
+
end
|
330
|
+
|
307
331
|
if options[:build_course]
|
308
332
|
GithubToCanvas.new(mode: 'build_course',
|
309
333
|
file_to_convert: options[:build_course],
|
310
334
|
fis_links: !!options[:fis],
|
311
335
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
312
336
|
aaq: !!options[:aaq],
|
337
|
+
prework: !!options[:prework],
|
313
338
|
forkable: !!options[:forkable],
|
314
339
|
contains_html: options[:contains_html],
|
315
340
|
git_links: !!options[:git_links])
|
@@ -325,6 +350,7 @@ if options[:add_to_course]
|
|
325
350
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
326
351
|
forkable: !!options[:forkable],
|
327
352
|
aaq: !!options[:aaq],
|
353
|
+
prework: !!options[:prework],
|
328
354
|
contains_html: options[:contains_html],
|
329
355
|
git_links: !!options[:git_links])
|
330
356
|
else
|
@@ -340,6 +366,7 @@ if options[:update_course_lessons]
|
|
340
366
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
341
367
|
forkable: !!options[:forkable],
|
342
368
|
aaq: !!options[:aaq],
|
369
|
+
prework: !!options[:prework],
|
343
370
|
contains_html: options[:contains_html],
|
344
371
|
git_links: !!options[:git_links])
|
345
372
|
abort
|
@@ -406,6 +433,7 @@ if options[:create_lesson]
|
|
406
433
|
only_update_content: !!options[:only_content],
|
407
434
|
forkable: !!options[:forkable],
|
408
435
|
aaq: !!options[:aaq],
|
436
|
+
prework: !!options[:prework],
|
409
437
|
contains_html: options[:contains_html])
|
410
438
|
end
|
411
439
|
|
@@ -425,5 +453,6 @@ if options[:align]
|
|
425
453
|
only_update_content: !!options[:only_content],
|
426
454
|
forkable: !!options[:forkable],
|
427
455
|
aaq: !!options[:aaq],
|
456
|
+
prework: !!options[:prework],
|
428
457
|
contains_html: options[:contains_html])
|
429
458
|
end
|
data/lib/github-to-canvas.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'byebug'
|
2
1
|
require 'csv'
|
3
2
|
require_relative './github-to-canvas/create_canvas_lesson'
|
4
3
|
require_relative './github-to-canvas/update_canvas_lesson'
|
@@ -53,7 +52,6 @@ class GithubToCanvas
|
|
53
52
|
|
54
53
|
html = RepositoryConverter.adjust_converted_html(options, html)
|
55
54
|
name = options[:name] ? options[:name] : RepositoryInterface.get_name(options[:filepath], html)
|
56
|
-
byebug
|
57
55
|
puts name
|
58
56
|
response = CanvasInterface.create_lesson(options, name, html)
|
59
57
|
|
@@ -217,6 +215,47 @@ class GithubToCanvas
|
|
217
215
|
puts "Creating lesson - #{options[:name]}"
|
218
216
|
response = CanvasInterface.add_to_module(options[:course_id], created_module_info, created_lesson_info)
|
219
217
|
|
218
|
+
}
|
219
|
+
when 'csv_align'
|
220
|
+
|
221
|
+
csv_data = CSV.read(options[:file_to_convert])
|
222
|
+
created_module_info = {
|
223
|
+
"id" => "",
|
224
|
+
"name" => ""
|
225
|
+
}
|
226
|
+
|
227
|
+
csv_data.each { |lesson|
|
228
|
+
# lesson[0] == repo
|
229
|
+
# lesson[1] == name
|
230
|
+
# lesson[2] == module
|
231
|
+
# lesson[3] == type
|
232
|
+
# lesson[4] == yes/no contains HTML
|
233
|
+
# lesson[5] == lesson id
|
234
|
+
# lesson[6] == course id
|
235
|
+
|
236
|
+
module_info = {
|
237
|
+
name: lesson[2]
|
238
|
+
}
|
239
|
+
|
240
|
+
options[:filepath] = lesson[0]
|
241
|
+
options[:name] = lesson[1]
|
242
|
+
options[:type] = lesson[3]
|
243
|
+
options[:id] = lesson[5]
|
244
|
+
options[:course_id] = lesson[6]
|
245
|
+
options[:branch] = "master" if !options[:branch]
|
246
|
+
if !options[:contains_html]
|
247
|
+
options[:contains_html] = (lesson[4] == "yes" || lesson[4] == "Yes") ? true : false
|
248
|
+
end
|
249
|
+
|
250
|
+
|
251
|
+
html = RepositoryConverter.remote_file_conversion(options)
|
252
|
+
html = RepositoryConverter.adjust_converted_html(options, html)
|
253
|
+
updated_lesson_info = CanvasInterface.update_existing_lesson(options, lesson[1], html)
|
254
|
+
updated_lesson_info["page_url"] = updated_lesson_info["url"] if !updated_lesson_info["page_url"]
|
255
|
+
updated_lesson_info["id"] = updated_lesson_info["page_url"] if !updated_lesson_info["id"]
|
256
|
+
updated_lesson_info["type"] = options[:type]
|
257
|
+
puts "Updating lesson - #{options[:name]}"
|
258
|
+
|
220
259
|
}
|
221
260
|
else
|
222
261
|
puts VERSION
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'byebug'
|
2
1
|
require 'json'
|
3
2
|
require 'rest-client'
|
4
3
|
require 'yaml'
|
4
|
+
# require 'byebug'
|
5
5
|
class CanvasInterface
|
6
6
|
|
7
7
|
def self.create_course(course_info)
|
@@ -74,8 +74,6 @@ class CanvasInterface
|
|
74
74
|
begin
|
75
75
|
response = RestClient.post(url, payload, self.headers)
|
76
76
|
rescue
|
77
|
-
byebug
|
78
|
-
|
79
77
|
puts "Something went wrong while adding lesson #{lesson_info["id"]} to module #{module_info["id"]} in course #{course_id}" if lesson_info["type"] == "Assignment"
|
80
78
|
puts "Something went wrong while adding lesson #{lesson_info["page_url"]} to module #{module_info["id"]} in course #{course_id}" if lesson_info["type"] == "Page"
|
81
79
|
abort
|
@@ -97,14 +95,16 @@ class CanvasInterface
|
|
97
95
|
if options[:type] == 'page' || options[:type] == 'Page'
|
98
96
|
response = RestClient.get(url, headers)
|
99
97
|
lesson_info = JSON.parse(response)
|
98
|
+
lesson_info = lesson_info[0] if lesson_info.kind_of?(Array)
|
100
99
|
url = url.sub(/[^\/]+$/, lesson_info["page_id"].to_s)
|
101
100
|
end
|
101
|
+
|
102
102
|
response = RestClient.put(url, payload, headers)
|
103
|
-
rescue
|
103
|
+
rescue Exception => e
|
104
104
|
puts "Something went wrong while pushing lesson #{options[:id]} to course #{options[:course_id]}"
|
105
105
|
puts "Make sure you are working on lessons that are not locked"
|
106
|
+
raise e
|
106
107
|
abort
|
107
|
-
""
|
108
108
|
end
|
109
109
|
JSON.parse(response.body)
|
110
110
|
end
|
@@ -114,6 +114,8 @@ class CanvasInterface
|
|
114
114
|
if !options[:id]
|
115
115
|
canvas_data = CanvasDotfile.read_canvas_data
|
116
116
|
response = nil
|
117
|
+
puts canvas_data
|
118
|
+
puts options
|
117
119
|
canvas_data[:lessons] = canvas_data[:lessons].map { |lesson|
|
118
120
|
response = self.update_existing_lesson(lesson, name, html)
|
119
121
|
options[:id] = lesson[:id]
|
@@ -240,7 +242,6 @@ class CanvasInterface
|
|
240
242
|
puts course_info.to_yaml
|
241
243
|
|
242
244
|
rescue
|
243
|
-
byebug
|
244
245
|
puts "Something went wrong while getting info about course #{course}"
|
245
246
|
abort
|
246
247
|
end
|
@@ -283,8 +284,9 @@ class CanvasInterface
|
|
283
284
|
lesson["repository"] = repo
|
284
285
|
else
|
285
286
|
lesson["repository"] = "https://github.com/learn-co-curriculum/" + repo
|
286
|
-
puts lesson["repository"] if options[:urls_only]
|
287
287
|
end
|
288
|
+
puts lesson["repository"] if options[:urls_only]
|
289
|
+
puts "#{lesson["repository"]}, #{lesson["title"]}, #{mod[:name]}, #{lesson["type"].downcase}, , #{lesson["id"]}, #{course_info[:id]}" if options[:csv]
|
288
290
|
end
|
289
291
|
sleep(1)
|
290
292
|
lesson
|
@@ -338,7 +340,6 @@ class CanvasInterface
|
|
338
340
|
end
|
339
341
|
mod
|
340
342
|
end
|
341
|
-
byebug
|
342
343
|
puts course_info.to_yaml
|
343
344
|
end
|
344
345
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'redcarpet'
|
2
|
-
|
2
|
+
# require 'byebug'
|
3
3
|
class CustomRender < Redcarpet::Render::HTML
|
4
4
|
def block_code(code, lang)
|
5
5
|
"<pre>" \
|
@@ -14,7 +14,7 @@ end
|
|
14
14
|
|
15
15
|
class RepositoryConverter
|
16
16
|
def self.local_file_conversion(options)
|
17
|
-
GithubInterface.get_updated_repo(options[:filepath], options[:branch])
|
17
|
+
# GithubInterface.get_updated_repo(options[:filepath], options[:branch])
|
18
18
|
markdown = RepositoryInterface.read_local_file(options[:filepath], options[:file_to_convert])
|
19
19
|
raw_remote_url = self.set_raw_image_remote_url(options[:filepath])
|
20
20
|
markdown = self.escape_existing_html(markdown) if options[:contains_html]
|
@@ -46,7 +46,8 @@ class RepositoryConverter
|
|
46
46
|
renderer = CustomRender.new(escape_html: true, prettify: true, hard_wrap: true)
|
47
47
|
redcarpet = Redcarpet::Markdown.new(CustomRender, options={tables: true, autolink: true, fenced_code_blocks: true, disable_indented_code_blocks: true})
|
48
48
|
html = redcarpet.render(markdown)
|
49
|
-
|
49
|
+
puts "Markdown converted to HTML"
|
50
|
+
self.remove_line_breaks(html)
|
50
51
|
end
|
51
52
|
|
52
53
|
def self.adjust_converted_html(options, html)
|
@@ -69,12 +70,15 @@ class RepositoryConverter
|
|
69
70
|
def self.fix_escaped_inline_html_code(html)
|
70
71
|
|
71
72
|
# stops HTML/JSX code blocks from rendering as HTML in Canvas
|
72
|
-
html = html.gsub("&gt;</code>", "></code>")
|
73
|
-
html = html.gsub("&gt;</code>", "></code>")
|
73
|
+
# html = html.gsub("&gt;</code>", "></code>")
|
74
|
+
# html = html.gsub("&gt;</code>", "></code>")
|
74
75
|
|
75
76
|
# fixes < and > code snippets
|
76
|
-
|
77
|
-
html = html.gsub(
|
77
|
+
|
78
|
+
# html = html.gsub(/<pre><code>(.*?)<\/code><\/pre>/) { |string|
|
79
|
+
# byebug
|
80
|
+
# }
|
81
|
+
# html = html.gsub("&gt;", ">")
|
78
82
|
|
79
83
|
# # fixes blockquotes
|
80
84
|
# html = html.gsub(/\n<p>>\;(.*)\n>\;/) { |bq|
|
@@ -96,9 +100,13 @@ class RepositoryConverter
|
|
96
100
|
|
97
101
|
|
98
102
|
def self.escape_existing_html(markdown)
|
99
|
-
markdown = markdown.gsub(/<\/(?!iframe)/, "</")
|
100
|
-
markdown = markdown.gsub(/<(?!iframe)/, "<")
|
101
|
-
markdown = markdown.gsub(/(?<!iframe)>/, ">")
|
103
|
+
# markdown = markdown.gsub(/<\/(?!iframe)/, "</")
|
104
|
+
# markdown = markdown.gsub(/<(?!iframe)/, "<")
|
105
|
+
# markdown = markdown.gsub(/(?<!iframe)>/, ">")
|
106
|
+
# byebug
|
107
|
+
# markdown = markdown.gsub(/```(.*?)```/) {|s|
|
108
|
+
# byebug
|
109
|
+
# }
|
102
110
|
end
|
103
111
|
|
104
112
|
def self.remove_header_and_footer(html)
|
@@ -192,7 +200,7 @@ class RepositoryConverter
|
|
192
200
|
begin
|
193
201
|
'src="' + raw_remote_url + '/' + branch + '/' + image_source + '"'
|
194
202
|
rescue
|
195
|
-
|
203
|
+
puts "Error adjust HTML images - check images in Canvas"
|
196
204
|
end
|
197
205
|
else
|
198
206
|
image_source
|
@@ -224,7 +232,7 @@ class RepositoryConverter
|
|
224
232
|
repo_info = self.get_repo_info(options[:filepath])
|
225
233
|
html = html.sub(/<div id="git-data-element.*<header class="fis-header.*<\/header>/,'') # remove existing fis header
|
226
234
|
header = self.create_github_link_header(repo_info[:repo_path], options)
|
227
|
-
data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name], options[:aaq])
|
235
|
+
data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name], options[:aaq], options[:prework])
|
228
236
|
data_element + header + html
|
229
237
|
end
|
230
238
|
|
@@ -247,12 +255,8 @@ class RepositoryConverter
|
|
247
255
|
end
|
248
256
|
end
|
249
257
|
|
250
|
-
def self.create_data_element(repo_org, repo_name, aaq)
|
251
|
-
|
252
|
-
"<div id='git-data-element' data-aaq='enabled' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
253
|
-
else
|
254
|
-
"<div id='git-data-element' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
255
|
-
end
|
258
|
+
def self.create_data_element(repo_org, repo_name, aaq, prework)
|
259
|
+
"<div id='git-data-element' #{prework ? "data-prework='true'" : ""} #{aaq ? "data-aaq='enabled'" : ""} data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
256
260
|
end
|
257
261
|
|
258
262
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: github-to-canvas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- maxwellbenton
|
@@ -104,9 +104,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
104
|
version: '0'
|
105
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
|
-
- - "
|
107
|
+
- - ">="
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
109
|
+
version: '0'
|
110
110
|
requirements: []
|
111
111
|
rubygems_version: 3.2.3
|
112
112
|
signing_key:
|