github-to-canvas 0.1.5 → 0.1.11
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 +85 -13
- data/lib/github-to-canvas.rb +108 -3
- data/lib/github-to-canvas/canvas_interface.rb +45 -15
- data/lib/github-to-canvas/github_interface.rb +1 -2
- data/lib/github-to-canvas/repository_converter.rb +69 -24
- data/lib/github-to-canvas/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25c87f7d039c5d682c061bd089500daa36fbc17944f2b396b7e4e4d09d54d071
|
4
|
+
data.tar.gz: f30fae04f6ce01b02b9fb8462eae2bee98504cfcb24a5f56a6642c8cd971d068
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f04b54f431b6a6c9b786ec8b4542a3a7f488eadf2c3adb632369e3da38522d38bbb7f51d07ebafee759140421bbf932a5e9f834fbe82a094d637f7ba92c5f86a
|
7
|
+
data.tar.gz: 7ad2efd5ddb65d660cb3c0d12fb11d14cac39d2b1495e0eb2eb5e7b73ca8c711fc0064b84f3ef2eb0d7bdd09bd547a95b703832edfbacbb454962caabab38585
|
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'
|
@@ -108,10 +106,18 @@ OptionParser.new do |opts|
|
|
108
106
|
"Adds additional Flatiron School HTML after markdown conversion") do |f|
|
109
107
|
options[:fis] = true
|
110
108
|
end
|
109
|
+
opts.on("-g", "--git-links",
|
110
|
+
"Adds additional GitHub after markdown conversion") do |f|
|
111
|
+
options[:git_links] = true
|
112
|
+
end
|
111
113
|
opts.on("--aaq",
|
112
114
|
"Adds AAQ flag to HTML header appended with --fis-links") do |aaq|
|
113
115
|
options[:aaq] = aaq
|
114
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
|
115
121
|
opts.on("--forkable",
|
116
122
|
"Used with --fis-links, adds fork button to HTML header injected into Canvas lesson") do |remote|
|
117
123
|
options[:forkable] = true
|
@@ -144,10 +150,10 @@ OptionParser.new do |opts|
|
|
144
150
|
"Use with --map. Outputs repo URLs instead of YAML") do |urls|
|
145
151
|
options[:urls_only] = urls
|
146
152
|
end
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
153
|
+
opts.on("--csv",
|
154
|
+
"Returns a course's lesson struction as CSV") do |csv|
|
155
|
+
options[:csv] = csv
|
156
|
+
end
|
151
157
|
opts.on("--read-from-canvas CANVAS_URL",
|
152
158
|
"Retrieves an existing Canvas lesson using the provided URL") do |url|
|
153
159
|
options[:read_from_canvas] = url
|
@@ -188,6 +194,19 @@ OptionParser.new do |opts|
|
|
188
194
|
"Escapes all HTML included in source markdown by replacing '<' and '>' with HTML charset values") do |html|
|
189
195
|
options[:contains_html] = html
|
190
196
|
end
|
197
|
+
opts.on("--canvas-to-canvas COURSE",
|
198
|
+
"Copies an existing Canvas lesson into another Canvas lesson") do |canvas_to_canvas|
|
199
|
+
options[:canvas_to_canvas] = canvas_to_canvas
|
200
|
+
end
|
201
|
+
opts.on("--build-from-csv CSV",
|
202
|
+
"Build a course using a CSV of lesson repos, names, modules, and types") do |csv_build|
|
203
|
+
options[:csv_build] = csv_build
|
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
|
209
|
+
|
191
210
|
|
192
211
|
end.parse!
|
193
212
|
|
@@ -202,6 +221,16 @@ if options[:read_from_canvas]
|
|
202
221
|
abort
|
203
222
|
end
|
204
223
|
|
224
|
+
if options[:canvas_to_canvas]
|
225
|
+
GithubToCanvas.new(mode: 'canvas_copy',
|
226
|
+
filepath: options[:canvas_to_canvas],
|
227
|
+
course_id: options[:course_id],
|
228
|
+
type: options[:type],
|
229
|
+
id: options[:id]
|
230
|
+
)
|
231
|
+
abort
|
232
|
+
end
|
233
|
+
|
205
234
|
if options[:read_from_github]
|
206
235
|
GithubToCanvas.new(mode: 'github_read',
|
207
236
|
filepath: options[:read_from_github],
|
@@ -209,6 +238,7 @@ if options[:read_from_github]
|
|
209
238
|
forkable: !!options[:forkable],
|
210
239
|
fis_links: !!options[:fis],
|
211
240
|
aaq: !!options[:aaq],
|
241
|
+
prework: !!options[:prework],
|
212
242
|
contains_html: options[:contains_html])
|
213
243
|
abort
|
214
244
|
end
|
@@ -224,6 +254,7 @@ if options[:create_from_github]
|
|
224
254
|
forkable: !!options[:forkable],
|
225
255
|
fis_links: !!options[:fis],
|
226
256
|
aaq: !!options[:aaq],
|
257
|
+
prework: !!options[:prework],
|
227
258
|
contains_html: options[:contains_html])
|
228
259
|
else
|
229
260
|
puts 'Canvas course ID and lesson type required. Example: github-to-canvas --create-from-github URL --course ID --type TYPE'
|
@@ -243,6 +274,7 @@ if options[:align_from_github]
|
|
243
274
|
forkable: !!options[:forkable],
|
244
275
|
fis_links: !!options[:fis],
|
245
276
|
aaq: !!options[:aaq],
|
277
|
+
prework: !!options[:prework],
|
246
278
|
contains_html: options[:contains_html])
|
247
279
|
else
|
248
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'
|
@@ -258,12 +290,41 @@ end
|
|
258
290
|
if options[:map]
|
259
291
|
GithubToCanvas.new(mode: 'map',
|
260
292
|
file_to_convert: options[:map],
|
261
|
-
urls_only: !!options[:urls_only]
|
293
|
+
urls_only: !!options[:urls_only],
|
294
|
+
csv: !!options[:csv])
|
295
|
+
abort
|
296
|
+
end
|
297
|
+
|
298
|
+
# if options[:csv]
|
299
|
+
# GithubToCanvas.new(mode: 'csv', file_to_convert: options[:csv])
|
300
|
+
# abort
|
301
|
+
# end
|
302
|
+
|
303
|
+
if options[:csv_build]
|
304
|
+
GithubToCanvas.new(mode: 'csv_build',
|
305
|
+
file_to_convert: options[:csv_build],
|
306
|
+
course_id: options[:course_id],
|
307
|
+
fis_links: !!options[:fis],
|
308
|
+
remove_header_and_footer: !!options[:remove_header_and_footer],
|
309
|
+
aaq: !!options[:aaq],
|
310
|
+
forkable: !!options[:forkable],
|
311
|
+
branch: options[:branch],
|
312
|
+
contains_html: options[:contains_html],
|
313
|
+
git_links: !!options[:git_links])
|
262
314
|
abort
|
263
315
|
end
|
264
316
|
|
265
|
-
if options[:
|
266
|
-
GithubToCanvas.new(mode: '
|
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])
|
267
328
|
abort
|
268
329
|
end
|
269
330
|
|
@@ -273,7 +334,10 @@ if options[:build_course]
|
|
273
334
|
fis_links: !!options[:fis],
|
274
335
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
275
336
|
aaq: !!options[:aaq],
|
276
|
-
|
337
|
+
prework: !!options[:prework],
|
338
|
+
forkable: !!options[:forkable],
|
339
|
+
contains_html: options[:contains_html],
|
340
|
+
git_links: !!options[:git_links])
|
277
341
|
abort
|
278
342
|
end
|
279
343
|
|
@@ -286,7 +350,9 @@ if options[:add_to_course]
|
|
286
350
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
287
351
|
forkable: !!options[:forkable],
|
288
352
|
aaq: !!options[:aaq],
|
289
|
-
|
353
|
+
prework: !!options[:prework],
|
354
|
+
contains_html: options[:contains_html],
|
355
|
+
git_links: !!options[:git_links])
|
290
356
|
else
|
291
357
|
puts '--course required'
|
292
358
|
end
|
@@ -300,7 +366,9 @@ if options[:update_course_lessons]
|
|
300
366
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
301
367
|
forkable: !!options[:forkable],
|
302
368
|
aaq: !!options[:aaq],
|
303
|
-
|
369
|
+
prework: !!options[:prework],
|
370
|
+
contains_html: options[:contains_html],
|
371
|
+
git_links: !!options[:git_links])
|
304
372
|
abort
|
305
373
|
end
|
306
374
|
|
@@ -360,10 +428,12 @@ if options[:create_lesson]
|
|
360
428
|
type: options[:type],
|
361
429
|
save_to_github: !!options[:save_to_github],
|
362
430
|
fis_links: !!options[:fis],
|
431
|
+
git_links: !!options[:git_links],
|
363
432
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
364
433
|
only_update_content: !!options[:only_content],
|
365
434
|
forkable: !!options[:forkable],
|
366
435
|
aaq: !!options[:aaq],
|
436
|
+
prework: !!options[:prework],
|
367
437
|
contains_html: options[:contains_html])
|
368
438
|
end
|
369
439
|
|
@@ -377,10 +447,12 @@ if options[:align]
|
|
377
447
|
name: options[:name],
|
378
448
|
type: options[:type],
|
379
449
|
save_to_github: !!options[:save_to_github],
|
380
|
-
fis_links: !!options[:fis],
|
450
|
+
fis_links: !!options[:fis],
|
451
|
+
git_links: !!options[:git_links],
|
381
452
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
382
453
|
only_update_content: !!options[:only_content],
|
383
454
|
forkable: !!options[:forkable],
|
384
455
|
aaq: !!options[:aaq],
|
456
|
+
prework: !!options[:prework],
|
385
457
|
contains_html: options[:contains_html])
|
386
458
|
end
|
data/lib/github-to-canvas.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'csv'
|
2
2
|
require_relative './github-to-canvas/create_canvas_lesson'
|
3
3
|
require_relative './github-to-canvas/update_canvas_lesson'
|
4
4
|
require_relative './github-to-canvas/canvas_dotfile'
|
@@ -26,6 +26,8 @@ class GithubToCanvas
|
|
26
26
|
CanvasInterface.csv(options[:file_to_convert])
|
27
27
|
when 'canvas_read'
|
28
28
|
puts CanvasInterface.read_lesson(options[:filepath])
|
29
|
+
when 'canvas_copy'
|
30
|
+
CanvasInterface.copy_lesson(options)
|
29
31
|
when 'github_read'
|
30
32
|
html = RepositoryConverter.remote_file_conversion(options)
|
31
33
|
puts RepositoryConverter.adjust_converted_html(options, html)
|
@@ -43,16 +45,24 @@ class GithubToCanvas
|
|
43
45
|
CanvasInterface.update_all_related_lessons(options, name, html)
|
44
46
|
|
45
47
|
when 'github_create'
|
48
|
+
if (!options[:branch])
|
49
|
+
options[:branch] = 'master'
|
50
|
+
end
|
46
51
|
html = RepositoryConverter.remote_file_conversion(options)
|
47
|
-
name = options[:name] ? options[:name] : RepositoryInterface.get_name(options[:filepath], html)
|
48
|
-
html = RepositoryConverter.adjust_converted_html(options, html)
|
49
52
|
|
53
|
+
html = RepositoryConverter.adjust_converted_html(options, html)
|
54
|
+
name = options[:name] ? options[:name] : RepositoryInterface.get_name(options[:filepath], html)
|
55
|
+
puts name
|
50
56
|
response = CanvasInterface.create_lesson(options, name, html)
|
51
57
|
|
52
58
|
puts "Canvas lesson created. Lesson available at #{response['html_url']}"
|
53
59
|
when 'github_align'
|
60
|
+
if (!options[:branch])
|
61
|
+
options[:branch] = 'master'
|
62
|
+
end
|
54
63
|
html = RepositoryConverter.remote_file_conversion(options)
|
55
64
|
name = options[:name] ? options[:name] : RepositoryInterface.get_name(options[:filepath], html)
|
65
|
+
|
56
66
|
html = RepositoryConverter.adjust_converted_html(options, html)
|
57
67
|
response = CanvasInterface.update_existing_lesson(options, name, html)
|
58
68
|
puts "Canvas lesson updated. Lesson available at #{response['html_url']}"
|
@@ -152,6 +162,101 @@ class GithubToCanvas
|
|
152
162
|
end
|
153
163
|
}
|
154
164
|
}
|
165
|
+
when 'csv_build'
|
166
|
+
if !options[:course_id]
|
167
|
+
course_info = {
|
168
|
+
name: "CSV Build Test",
|
169
|
+
course_code: "CSV-TEST"
|
170
|
+
}
|
171
|
+
created_course_info = CanvasInterface.create_course(course_info)
|
172
|
+
puts "Course created - #{created_course_info["id"]}"
|
173
|
+
puts "Make sure to add yourself as a teacher to this course before continuing, then press Enter/Return"
|
174
|
+
input = gets
|
175
|
+
options[:course_id] = created_course_info["id"]
|
176
|
+
else
|
177
|
+
puts "Adding to course #{options[:course_id]}"
|
178
|
+
end
|
179
|
+
|
180
|
+
csv_data = CSV.read(options[:file_to_convert])
|
181
|
+
created_module_info = {
|
182
|
+
"id" => "",
|
183
|
+
"name" => ""
|
184
|
+
}
|
185
|
+
|
186
|
+
csv_data.each { |lesson|
|
187
|
+
# lesson[0] == repo
|
188
|
+
# lesson[1] == name
|
189
|
+
# lesson[2] == module
|
190
|
+
# lesson[3] == type
|
191
|
+
# lesson[4] == yes/no contains HTML
|
192
|
+
module_info = {
|
193
|
+
name: lesson[2]
|
194
|
+
}
|
195
|
+
if created_module_info["name"] != module_info[:name]
|
196
|
+
created_module_info = CanvasInterface.create_module(options[:course_id], module_info)
|
197
|
+
puts "New module created - #{created_module_info["id"]} - #{created_module_info["name"]}"
|
198
|
+
end
|
199
|
+
|
200
|
+
options[:filepath] = lesson[0]
|
201
|
+
options[:name] = lesson[1]
|
202
|
+
options[:type] = lesson[3]
|
203
|
+
options[:branch] = "master" if !options[:branch]
|
204
|
+
if !options[:contains_html]
|
205
|
+
options[:contains_html] = (lesson[4] == "yes" || lesson[4] == "Yes") ? true : false
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
html = RepositoryConverter.remote_file_conversion(options)
|
210
|
+
html = RepositoryConverter.adjust_converted_html(options, html)
|
211
|
+
created_lesson_info = CanvasInterface.create_lesson(options, lesson[1], html)
|
212
|
+
created_lesson_info["page_url"] = created_lesson_info["url"] if !created_lesson_info["page_url"]
|
213
|
+
created_lesson_info["id"] = created_lesson_info["page_url"] if !created_lesson_info["id"]
|
214
|
+
created_lesson_info["type"] = options[:type]
|
215
|
+
puts "Creating lesson - #{options[:name]}"
|
216
|
+
response = CanvasInterface.add_to_module(options[:course_id], created_module_info, created_lesson_info)
|
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
|
+
|
259
|
+
}
|
155
260
|
else
|
156
261
|
puts VERSION
|
157
262
|
end
|
@@ -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)
|
@@ -51,21 +51,21 @@ class CanvasInterface
|
|
51
51
|
# POST /api/v1/courses/:course_id/modules/:module_id/items
|
52
52
|
url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/modules/#{module_info["id"]}/items"
|
53
53
|
|
54
|
-
if lesson_info["type"] == "Page"
|
54
|
+
if lesson_info["type"] == "Page" || lesson_info["type"] == "page"
|
55
55
|
payload = {
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
'module_item[title]' => lesson_info["title"],
|
57
|
+
'module_item[type]' => lesson_info["type"].capitalize,
|
58
|
+
'module_item[indent]' => 0,
|
59
|
+
'module_item[page_url]' => lesson_info["id"],
|
60
|
+
'module_item[completion_requirement][type]' => 'must_view'
|
61
|
+
}
|
62
62
|
elsif lesson_info["type"] == "Quiz"
|
63
63
|
puts "Quiz needs to be added manually - #{lesson_info['title']} - lesson_info["
|
64
64
|
else
|
65
65
|
|
66
66
|
payload = {
|
67
67
|
'module_item[title]' => lesson_info["title"],
|
68
|
-
'module_item[type]' => lesson_info["type"],
|
68
|
+
'module_item[type]' => lesson_info["type"].capitalize,
|
69
69
|
'module_item[indent]' => 1,
|
70
70
|
'module_item[content_id]' => lesson_info["id"],
|
71
71
|
'module_item[completion_requirement][type]' => 'must_submit'
|
@@ -95,14 +95,16 @@ class CanvasInterface
|
|
95
95
|
if options[:type] == 'page' || options[:type] == 'Page'
|
96
96
|
response = RestClient.get(url, headers)
|
97
97
|
lesson_info = JSON.parse(response)
|
98
|
+
lesson_info = lesson_info[0] if lesson_info.kind_of?(Array)
|
98
99
|
url = url.sub(/[^\/]+$/, lesson_info["page_id"].to_s)
|
99
100
|
end
|
101
|
+
|
100
102
|
response = RestClient.put(url, payload, headers)
|
101
|
-
rescue
|
103
|
+
rescue Exception => e
|
102
104
|
puts "Something went wrong while pushing lesson #{options[:id]} to course #{options[:course_id]}"
|
103
105
|
puts "Make sure you are working on lessons that are not locked"
|
106
|
+
raise e
|
104
107
|
abort
|
105
|
-
""
|
106
108
|
end
|
107
109
|
JSON.parse(response.body)
|
108
110
|
end
|
@@ -238,7 +240,6 @@ class CanvasInterface
|
|
238
240
|
puts course_info.to_yaml
|
239
241
|
|
240
242
|
rescue
|
241
|
-
byebug
|
242
243
|
puts "Something went wrong while getting info about course #{course}"
|
243
244
|
abort
|
244
245
|
end
|
@@ -281,8 +282,9 @@ class CanvasInterface
|
|
281
282
|
lesson["repository"] = repo
|
282
283
|
else
|
283
284
|
lesson["repository"] = "https://github.com/learn-co-curriculum/" + repo
|
284
|
-
puts lesson["repository"] if options[:urls_only]
|
285
285
|
end
|
286
|
+
puts lesson["repository"] if options[:urls_only]
|
287
|
+
puts "#{lesson["repository"]}, #{lesson["title"]}, #{mod[:name]}, #{lesson["type"].downcase}, , #{lesson["id"]}, #{course_info[:id]}" if options[:csv]
|
286
288
|
end
|
287
289
|
sleep(1)
|
288
290
|
lesson
|
@@ -336,12 +338,40 @@ class CanvasInterface
|
|
336
338
|
end
|
337
339
|
mod
|
338
340
|
end
|
339
|
-
byebug
|
340
341
|
puts course_info.to_yaml
|
341
342
|
end
|
342
343
|
|
343
|
-
|
344
|
+
def self.copy_lesson(options)
|
345
|
+
types = ["page", "assignment", "quiz", "discussion"]
|
346
|
+
url = options[:filepath]
|
347
|
+
type = types.find {|type| url.match(type)}
|
348
|
+
options[:type] = type
|
349
|
+
if !url.include?(ENV['CANVAS_API_PATH'])
|
350
|
+
url = url.sub(/^.*\/\/.*?\//,"#{ENV['CANVAS_API_PATH']}/")
|
351
|
+
end
|
352
|
+
|
353
|
+
response = RestClient.get(url, headers={
|
354
|
+
"Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
|
355
|
+
})
|
344
356
|
|
357
|
+
lesson_info = JSON.parse(response)
|
358
|
+
lesson_info = lesson_info.slice("title",
|
359
|
+
"name",
|
360
|
+
"description",
|
361
|
+
"body",
|
362
|
+
"message",
|
363
|
+
"shuffle_answers",
|
364
|
+
"allowed_attempts",
|
365
|
+
"question_count"
|
366
|
+
)
|
367
|
+
if options[:type] == "page"
|
368
|
+
self.update_existing_lesson(options, lesson_info["title"], lesson_info["body"])
|
369
|
+
else
|
370
|
+
self.update_existing_lesson(options, lesson_info["name"], lesson_info["description"])
|
371
|
+
end
|
372
|
+
|
373
|
+
|
374
|
+
end
|
345
375
|
|
346
376
|
def self.build_payload(options, name, html)
|
347
377
|
if options[:only_update_content]
|
@@ -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]
|
@@ -27,9 +27,15 @@ class RepositoryConverter
|
|
27
27
|
markdown = GithubInterface.read_remote(options[:filepath])
|
28
28
|
raw_remote_url = self.set_raw_image_remote_url(options[:filepath])
|
29
29
|
if options[:contains_html]
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
begin
|
31
|
+
markdown = self.escape_existing_html(markdown)
|
32
|
+
rescue
|
33
|
+
puts "Error reading remote markdown"
|
34
|
+
abort
|
35
|
+
end
|
36
|
+
end
|
37
|
+
if (!options[:branch])
|
38
|
+
options[:branch] = 'master'
|
33
39
|
end
|
34
40
|
markdown = self.fix_local_images(options, markdown, raw_remote_url)
|
35
41
|
html = self.convert_to_html(markdown)
|
@@ -37,8 +43,10 @@ class RepositoryConverter
|
|
37
43
|
end
|
38
44
|
|
39
45
|
def self.convert_to_html(markdown)
|
40
|
-
|
46
|
+
renderer = CustomRender.new(escape_html: true, prettify: true, hard_wrap: true)
|
47
|
+
redcarpet = Redcarpet::Markdown.new(CustomRender, options={tables: true, autolink: true, fenced_code_blocks: true, disable_indented_code_blocks: true})
|
41
48
|
html = redcarpet.render(markdown)
|
49
|
+
puts "Markdown converted to HTML"
|
42
50
|
self.remove_line_breaks(html)
|
43
51
|
end
|
44
52
|
|
@@ -48,7 +56,7 @@ class RepositoryConverter
|
|
48
56
|
html = self.remove_header_and_footer(html)
|
49
57
|
end
|
50
58
|
|
51
|
-
if options[:fis_links]
|
59
|
+
if options[:fis_links] || options[:git_links]
|
52
60
|
html = self.add_fis_links(options, html)
|
53
61
|
end
|
54
62
|
|
@@ -60,15 +68,45 @@ class RepositoryConverter
|
|
60
68
|
end
|
61
69
|
|
62
70
|
def self.fix_escaped_inline_html_code(html)
|
63
|
-
|
64
|
-
|
71
|
+
|
72
|
+
# stops HTML/JSX code blocks from rendering as HTML in Canvas
|
73
|
+
# html = html.gsub("&gt;</code>", "></code>")
|
74
|
+
# html = html.gsub("&gt;</code>", "></code>")
|
75
|
+
|
76
|
+
# fixes < and > code snippets
|
77
|
+
|
78
|
+
# html = html.gsub(/<pre><code>(.*?)<\/code><\/pre>/) { |string|
|
79
|
+
# byebug
|
80
|
+
# }
|
81
|
+
# html = html.gsub("&gt;", ">")
|
82
|
+
|
83
|
+
# # fixes blockquotes
|
84
|
+
# html = html.gsub(/\n<p>>\;(.*)\n>\;/) { |bq|
|
85
|
+
# bq.delete_prefix!("\n<p>>")
|
86
|
+
# "\n<blockquote>" + bq
|
87
|
+
# }
|
88
|
+
# html = html.gsub(/\n>\;(.*)\n>\;/) { |bq|
|
89
|
+
# bq.delete_prefix!("\n>")
|
90
|
+
# " " + bq
|
91
|
+
# }
|
92
|
+
# html = html.gsub(/\n>\;(.*)<\/p>/) { |bq|
|
93
|
+
# bq.delete_prefix!("\n>\;")
|
94
|
+
# bq.delete_suffix!("</p>")
|
95
|
+
# " " + bq + "</blockquote>"
|
96
|
+
# }
|
97
|
+
|
98
|
+
html
|
65
99
|
end
|
66
100
|
|
67
101
|
|
68
102
|
def self.escape_existing_html(markdown)
|
69
|
-
markdown = markdown.gsub(/<\/(?!iframe)/, "</")
|
70
|
-
markdown = markdown.gsub(/<(?!iframe)/, "<")
|
71
|
-
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
|
+
# }
|
72
110
|
end
|
73
111
|
|
74
112
|
def self.remove_header_and_footer(html)
|
@@ -84,6 +122,9 @@ class RepositoryConverter
|
|
84
122
|
|
85
123
|
def self.remove_footer(readme)
|
86
124
|
readme.gsub(/<p class='util--hide'(.+?)<\/p>/,"")
|
125
|
+
readme.gsub(/<p data-visibility='hidden'(.+?)<\/p>/,"")
|
126
|
+
readme.gsub(/<p><\;p data-visibility='\;hidden'(.+?)<\/p>/,"")
|
127
|
+
readme.gsub(/<p><\;p class='util--hide'\;(.+?)<\/p>/,"")
|
87
128
|
end
|
88
129
|
|
89
130
|
def self.remove_html_header(html)
|
@@ -155,7 +196,12 @@ class RepositoryConverter
|
|
155
196
|
image_source = image_source.gsub(/(\'|\")/, "")
|
156
197
|
image_source = image_source.gsub(/src=/, '')
|
157
198
|
image_source = image_source.strip
|
158
|
-
|
199
|
+
|
200
|
+
begin
|
201
|
+
'src="' + raw_remote_url + '/' + branch + '/' + image_source + '"'
|
202
|
+
rescue
|
203
|
+
puts "Error adjust HTML images - check images in Canvas"
|
204
|
+
end
|
159
205
|
else
|
160
206
|
image_source
|
161
207
|
end
|
@@ -185,12 +231,12 @@ class RepositoryConverter
|
|
185
231
|
def self.add_fis_links(options, html)
|
186
232
|
repo_info = self.get_repo_info(options[:filepath])
|
187
233
|
html = html.sub(/<div id="git-data-element.*<header class="fis-header.*<\/header>/,'') # remove existing fis header
|
188
|
-
header = self.create_github_link_header(repo_info[:repo_path], options
|
189
|
-
data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name], options[:aaq])
|
234
|
+
header = self.create_github_link_header(repo_info[:repo_path], options)
|
235
|
+
data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name], options[:aaq], options[:prework])
|
190
236
|
data_element + header + html
|
191
237
|
end
|
192
238
|
|
193
|
-
def self.create_github_link_header(repo_path,
|
239
|
+
def self.create_github_link_header(repo_path, options)
|
194
240
|
# add link to associated repository
|
195
241
|
github_repo_link = "<a class='fis-git-link' href='#{repo_path}' target='_blank' rel='noopener'><img id='repo-img' title='Open GitHub Repo' alt='GitHub Repo' /></a>"
|
196
242
|
|
@@ -198,20 +244,19 @@ class RepositoryConverter
|
|
198
244
|
github_issue_link = "<a class='fis-git-link' href='#{repo_path}/issues/new' target='_blank' rel='noopener'><img id='issue-img' title='Create New Issue' alt='Create New Issue' /></a>"
|
199
245
|
|
200
246
|
# add link to fork (forking handled by separate Flatiron server, generation of link handled via custom Canvas JS theme file)
|
201
|
-
|
202
|
-
|
247
|
+
|
248
|
+
if (options[:forkable])
|
249
|
+
github_fork_link = "<a class='fis-fork-link' id='fork-link' href='#{repo_path}/fork' target='_blank' rel='noopener'><img id='fork-img' title='Fork This Assignment' alt='Fork This Assignment' /></a>"
|
203
250
|
"<header class='fis-header' style='visibility: hidden;'>#{github_fork_link}#{github_repo_link}#{github_issue_link}</header>"
|
251
|
+
elsif options[:git_links]
|
252
|
+
"<header class='fis-header'>#{github_repo_link}#{github_issue_link}</header>"
|
204
253
|
else
|
205
254
|
"<header class='fis-header' style='visibility: hidden;'>#{github_repo_link}#{github_issue_link}</header>"
|
206
255
|
end
|
207
256
|
end
|
208
257
|
|
209
|
-
def self.create_data_element(repo_org, repo_name, aaq)
|
210
|
-
|
211
|
-
"<div id='git-data-element' data-aaq='enabled' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
212
|
-
else
|
213
|
-
"<div id='git-data-element' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
214
|
-
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>"
|
215
260
|
end
|
216
261
|
|
217
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.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- maxwellbenton
|
@@ -108,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
|
-
rubygems_version: 3.
|
111
|
+
rubygems_version: 3.2.3
|
112
112
|
signing_key:
|
113
113
|
specification_version: 4
|
114
114
|
summary: github-to-canvas is a tool for migrating and aligning GitHub content with
|