github-to-canvas 0.1.8 → 0.1.9
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 +29 -12
- data/lib/github-to-canvas.rb +41 -0
- data/lib/github-to-canvas/canvas_interface.rb +5 -2
- data/lib/github-to-canvas/repository_converter.rb +19 -11
- data/lib/github-to-canvas/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71e183a1ea3659fdc71af9af4c1ce0370be119f4241e8773ac82fdee9400cf48
|
4
|
+
data.tar.gz: ce08e0ec8f3f64471a4966a955e454d8a25cd95e9b9555dd61ca550ec77fe41b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b04300b61b6301f32512ca328f27affaa186082e0e35d8eeab7c748b77ba3c10a07a7309ba1d3e92563007910da3c9e70a7a1db37ce184b48763cc8d455ffb7
|
7
|
+
data.tar.gz: 2cbe19f6cd61338619072f9f07e215762ce45ffbd3b3aa0672d3f77a1c3bd3a8e7837b5e237bf6b01bd4058ac05afaf5c547b82c1b829a8787b344c88fc21276
|
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'
|
@@ -152,10 +150,10 @@ OptionParser.new do |opts|
|
|
152
150
|
"Use with --map. Outputs repo URLs instead of YAML") do |urls|
|
153
151
|
options[:urls_only] = urls
|
154
152
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
153
|
+
opts.on("--csv",
|
154
|
+
"Returns a course's lesson struction as CSV") do |csv|
|
155
|
+
options[:csv] = csv
|
156
|
+
end
|
159
157
|
opts.on("--read-from-canvas CANVAS_URL",
|
160
158
|
"Retrieves an existing Canvas lesson using the provided URL") do |url|
|
161
159
|
options[:read_from_canvas] = url
|
@@ -201,9 +199,13 @@ OptionParser.new do |opts|
|
|
201
199
|
options[:canvas_to_canvas] = canvas_to_canvas
|
202
200
|
end
|
203
201
|
opts.on("--build-from-csv CSV",
|
204
|
-
"Build a course
|
202
|
+
"Build a course using a CSV of lesson repos, names, modules, and types") do |csv_build|
|
205
203
|
options[:csv_build] = csv_build
|
206
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
|
207
209
|
|
208
210
|
|
209
211
|
end.parse!
|
@@ -288,14 +290,15 @@ end
|
|
288
290
|
if options[:map]
|
289
291
|
GithubToCanvas.new(mode: 'map',
|
290
292
|
file_to_convert: options[:map],
|
291
|
-
urls_only: !!options[:urls_only]
|
293
|
+
urls_only: !!options[:urls_only],
|
294
|
+
csv: !!options[:csv])
|
292
295
|
abort
|
293
296
|
end
|
294
297
|
|
295
|
-
if options[:csv]
|
296
|
-
|
297
|
-
|
298
|
-
end
|
298
|
+
# if options[:csv]
|
299
|
+
# GithubToCanvas.new(mode: 'csv', file_to_convert: options[:csv])
|
300
|
+
# abort
|
301
|
+
# end
|
299
302
|
|
300
303
|
if options[:csv_build]
|
301
304
|
GithubToCanvas.new(mode: 'csv_build',
|
@@ -311,6 +314,20 @@ if options[:csv_build]
|
|
311
314
|
abort
|
312
315
|
end
|
313
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
|
+
|
314
331
|
if options[:build_course]
|
315
332
|
GithubToCanvas.new(mode: 'build_course',
|
316
333
|
file_to_convert: options[:build_course],
|
data/lib/github-to-canvas.rb
CHANGED
@@ -215,6 +215,47 @@ class GithubToCanvas
|
|
215
215
|
puts "Creating lesson - #{options[:name]}"
|
216
216
|
response = CanvasInterface.add_to_module(options[:course_id], created_module_info, created_lesson_info)
|
217
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
|
+
|
218
259
|
}
|
219
260
|
else
|
220
261
|
puts VERSION
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'rest-client'
|
3
3
|
require 'yaml'
|
4
|
+
require 'byebug'
|
4
5
|
class CanvasInterface
|
5
6
|
|
6
7
|
def self.create_course(course_info)
|
@@ -94,14 +95,15 @@ class CanvasInterface
|
|
94
95
|
if options[:type] == 'page' || options[:type] == 'Page'
|
95
96
|
response = RestClient.get(url, headers)
|
96
97
|
lesson_info = JSON.parse(response)
|
98
|
+
lesson_info = lesson_info[0] if lesson_info.kind_of?(Array)
|
97
99
|
url = url.sub(/[^\/]+$/, lesson_info["page_id"].to_s)
|
98
100
|
end
|
101
|
+
|
99
102
|
response = RestClient.put(url, payload, headers)
|
100
103
|
rescue
|
101
104
|
puts "Something went wrong while pushing lesson #{options[:id]} to course #{options[:course_id]}"
|
102
105
|
puts "Make sure you are working on lessons that are not locked"
|
103
106
|
abort
|
104
|
-
""
|
105
107
|
end
|
106
108
|
JSON.parse(response.body)
|
107
109
|
end
|
@@ -279,8 +281,9 @@ class CanvasInterface
|
|
279
281
|
lesson["repository"] = repo
|
280
282
|
else
|
281
283
|
lesson["repository"] = "https://github.com/learn-co-curriculum/" + repo
|
282
|
-
puts lesson["repository"] if options[:urls_only]
|
283
284
|
end
|
285
|
+
puts lesson["repository"] if options[:urls_only]
|
286
|
+
puts "#{lesson["repository"]}, #{lesson["title"]}, #{mod[:name]}, #{lesson["type"].downcase}, , #{lesson["id"]}, #{course_info[:id]}" if options[:csv]
|
284
287
|
end
|
285
288
|
sleep(1)
|
286
289
|
lesson
|
@@ -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)
|
@@ -154,7 +162,7 @@ class RepositoryConverter
|
|
154
162
|
remote = GithubInterface.git_remote(filepath)
|
155
163
|
end
|
156
164
|
raw_remote = remote.gsub("git@github.com:","https://raw.githubusercontent.com/")
|
157
|
-
raw_remote =
|
165
|
+
raw_remote = raw_remo te.gsub("https://github.com/","https://raw.githubusercontent.com/")
|
158
166
|
raw_remote = raw_remote.gsub(/\/blob\/master\/.*$/,"")
|
159
167
|
raw_remote = raw_remote.gsub(/\/blob\/main\/.*$/,"")
|
160
168
|
raw_remote = raw_remote.gsub(/.git$/,"")
|