github-to-canvas 0.0.21 → 0.0.22
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 +13 -3
- data/lib/github-to-canvas.rb +3 -3
- data/lib/github-to-canvas/canvas_interface.rb +14 -7
- data/lib/github-to-canvas/create_canvas_lesson.rb +6 -3
- data/lib/github-to-canvas/github_interface.rb +13 -7
- data/lib/github-to-canvas/repository_converter.rb +17 -0
- data/lib/github-to-canvas/update_canvas_lesson.rb +6 -3
- 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: 30ee9448d74c258ca7d0a142e4b2fa4bfa708b227014fd3ef9cd5daf483b0da7
|
4
|
+
data.tar.gz: 84d2710f793fcf93beea70c5693554920b14890c0260e7d20bb28dbf1d3723c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75c3662d1354d1c5ed0e83ec625eed59010dc254ec9fa5663a060d7f32e58cf937ead936dabf8debd1e3f3f2d07f26747c17945b3a99fc3054244fea9be518b2
|
7
|
+
data.tar.gz: cbc3df60cb990b5c7fffd58b04a0a575c1ec2e4b513f68f7d080b724ee6da94726e14e4d405b77a38389ad1fe470b7c7b2fb03b8f40f00835bdbfebefe52c795
|
data/bin/github-to-canvas
CHANGED
@@ -18,8 +18,12 @@ OptionParser.new do |opts|
|
|
18
18
|
github-to-canvas --create COURSE [--branch BRANCH] [--name NAME]
|
19
19
|
github-to-canvas --create COURSE [--branch BRANCH] [--name NAME] [--type TYPE]
|
20
20
|
github-to-canvas --create COURSE [--dry-run]
|
21
|
+
github-to-canvas --create COURSE [--fis-links]
|
21
22
|
github-to-canvas --align
|
23
|
+
github-to-canvas --align [--branch BRANCH]
|
24
|
+
github-to-canvas --align [--branch BRANCH] [--fis-links]
|
22
25
|
github-to-canvas --version
|
26
|
+
|
23
27
|
|
24
28
|
Run these commands from inside a local GitHub repository. This gem is built for Flatiron School's internal use.
|
25
29
|
Some default behaviors assume this, like the default Canvas API path.
|
@@ -30,7 +34,9 @@ OptionParser.new do |opts|
|
|
30
34
|
github-to-canvas --create 154 --name "Fetch Lab" -> Creates a lesson in course 154 with the provided name, deriving the type from the local repo
|
31
35
|
github-to-canvas --create 154 --name "Fetch Lab" --type assignment -> Creates an assignment in course 154 with the provided name
|
32
36
|
github-to-canvas --create 154 --name "Fetch Lab" --branch solution -> Creates a lesson in course 154 with the provided name, using the repositorie's solution branch and deriving the type from the local repo
|
33
|
-
|
37
|
+
github-to-canvas --align -> Patches existing lessons in Canvas based on the .canvas file
|
38
|
+
github-to-canvas --align --fis-links -> Patches existing lessons in Canvas based on the .canvas file, adding addition Flatiron School specific HTML
|
39
|
+
|
34
40
|
EOBANNER
|
35
41
|
|
36
42
|
opts.on("-cCOURSE", "--create COURSE",
|
@@ -67,6 +73,10 @@ OptionParser.new do |opts|
|
|
67
73
|
"Runs through creation without pushing to Canvas or GitHub") do |v|
|
68
74
|
options[:dry] = true
|
69
75
|
end
|
76
|
+
opts.on("-f", "--fis-links",
|
77
|
+
"Adds additional Flatiron School HTML after markdown conversion") do |v|
|
78
|
+
options[:fis] = true
|
79
|
+
end
|
70
80
|
|
71
81
|
end.parse!
|
72
82
|
|
@@ -91,9 +101,9 @@ if !options[:name]
|
|
91
101
|
end
|
92
102
|
|
93
103
|
if options[:create]
|
94
|
-
GithubToCanvas.new(mode: "create", course: options[:course], filepath: Dir.pwd, branch: options[:branch], name: options[:name], type: options[:type], dry: !!options[:dry])
|
104
|
+
GithubToCanvas.new(mode: "create", course: options[:course], filepath: Dir.pwd, branch: options[:branch], name: options[:name], type: options[:type], dry: !!options[:dry], fis_links: !!options[:fis])
|
95
105
|
end
|
96
106
|
|
97
107
|
if options[:align]
|
98
|
-
GithubToCanvas.new(mode: "align", course: nil, filepath: Dir.pwd, branch: options[:branch], name: options[:name], type: options[:type], dry: !!options[:dry])
|
108
|
+
GithubToCanvas.new(mode: "align", course: nil, filepath: Dir.pwd, branch: options[:branch], name: options[:name], type: options[:type], dry: !!options[:dry], fis_links: !!options[:fis])
|
99
109
|
end
|
data/lib/github-to-canvas.rb
CHANGED
@@ -9,7 +9,7 @@ require_relative './github-to-canvas/version'
|
|
9
9
|
|
10
10
|
class GithubToCanvas
|
11
11
|
|
12
|
-
def initialize(mode:, course:, filepath:Dir.pwd, branch:'master', name:File.basename(Dir.getwd), type:"page", dry:false)
|
12
|
+
def initialize(mode:, course:, filepath:Dir.pwd, branch:'master', name:File.basename(Dir.getwd), type:"page", dry:false, fis_links:false)
|
13
13
|
if mode == 'version'
|
14
14
|
puts VERSION
|
15
15
|
return
|
@@ -17,12 +17,12 @@ class GithubToCanvas
|
|
17
17
|
|
18
18
|
if mode == 'create'
|
19
19
|
puts "github-to-canvas will now create a Canvas lesson based on the current repo"
|
20
|
-
CreateCanvasLesson.new(course, filepath, branch, name, type, dry)
|
20
|
+
CreateCanvasLesson.new(course, filepath, branch, name, type, dry, fis_links)
|
21
21
|
end
|
22
22
|
|
23
23
|
if mode == 'align'
|
24
24
|
puts "github-to-canvas will now align any existing Canvas lessons based on the current repo. NOTE: .canvas file must be present"
|
25
|
-
UpdateCanvasLesson.new(filepath, branch, name, type, dry)
|
25
|
+
UpdateCanvasLesson.new(filepath, branch, name, type, dry, fis_links)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -19,18 +19,25 @@ class CanvasInterface
|
|
19
19
|
def self.push_to_canvas(course_id, type, name, new_readme)
|
20
20
|
url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s"
|
21
21
|
payload = self.build_payload(type, name, new_readme)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
begin
|
23
|
+
RestClient.post(url, payload, headers={
|
24
|
+
"Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
|
25
|
+
})
|
26
|
+
rescue
|
27
|
+
puts "Something went wrong while pushing lesson #{id} to course #{course_id}"
|
28
|
+
end
|
26
29
|
end
|
27
30
|
|
28
31
|
def self.update_existing_lesson(course_id, id, type, name, new_readme, dry_run)
|
29
32
|
url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s/#{id}"
|
30
33
|
payload = self.build_payload(type, name, new_readme)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
begin
|
35
|
+
RestClient.put(url, payload, headers={
|
36
|
+
"Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
|
37
|
+
})
|
38
|
+
rescue
|
39
|
+
puts "Something went wrong while pushing lesson #{id} to course #{course_id}"
|
40
|
+
end
|
34
41
|
end
|
35
42
|
|
36
43
|
def self.build_payload(type, name, new_readme)
|
@@ -1,18 +1,21 @@
|
|
1
1
|
class CreateCanvasLesson
|
2
2
|
|
3
|
-
def initialize(course, filepath, branch, name, type, dry_run)
|
3
|
+
def initialize(course, filepath, branch, name, type, dry_run, fis_links)
|
4
4
|
name = name.split(/[- _]/).map(&:capitalize).join(' ')
|
5
5
|
original_readme = File.read("#{filepath}/README.md")
|
6
6
|
if !original_readme
|
7
7
|
puts 'README.md not found in current directory. Exiting...'
|
8
8
|
abort
|
9
9
|
end
|
10
|
-
create_canvas_lesson(original_readme, course, filepath, branch, name, type, dry_run)
|
10
|
+
create_canvas_lesson(original_readme, course, filepath, branch, name, type, dry_run, fis_links)
|
11
11
|
end
|
12
12
|
|
13
|
-
def create_canvas_lesson(readme, course, filepath, branch, name, type, dry_run)
|
13
|
+
def create_canvas_lesson(readme, course, filepath, branch, name, type, dry_run, fis_links)
|
14
14
|
GithubInterface.get_updated_repo(filepath, branch)
|
15
15
|
new_readme = RepositoryConverter.convert(filepath, readme, branch)
|
16
|
+
if fis_links
|
17
|
+
new_readme = RepositoryConverter.add_fis_links(filepath, new_readme)
|
18
|
+
end
|
16
19
|
response = CanvasInterface.submit_to_canvas(course, type, name, new_readme, dry_run)
|
17
20
|
if dry_run
|
18
21
|
puts 'DRY RUN: Skipping dotfile creation and push to GitHub'
|
@@ -1,20 +1,26 @@
|
|
1
|
-
|
1
|
+
require 'byebug'
|
2
2
|
class GithubInterface
|
3
3
|
|
4
|
+
def self.cd_into_and(filepath, command)
|
5
|
+
cmd = "cd #{filepath} && #{command}"
|
6
|
+
puts cmd
|
7
|
+
`#{cmd}`
|
8
|
+
end
|
9
|
+
|
4
10
|
def self.get_updated_repo(filepath, branch)
|
5
11
|
self.git_co_branch(filepath, branch)
|
6
12
|
self.git_pull(filepath, branch)
|
7
13
|
end
|
8
14
|
|
9
|
-
def self.
|
10
|
-
|
11
|
-
puts cmd
|
12
|
-
`#{cmd}`
|
15
|
+
def self.get_current_branch(filepath)
|
16
|
+
self.cd_into_and(filepath, "git rev-parse --abbrev-ref HEAD")
|
13
17
|
end
|
14
18
|
|
15
19
|
def self.git_co_branch(filepath, branch)
|
16
|
-
|
17
|
-
|
20
|
+
self.cd_into_and(filepath, "git checkout #{branch}")
|
21
|
+
current_branch = self.get_current_branch(filepath)
|
22
|
+
|
23
|
+
if !current_branch.match(branch)
|
18
24
|
puts "#{branch} branch not found. Exiting..."
|
19
25
|
abort
|
20
26
|
end
|
@@ -20,6 +20,13 @@ class RepositoryConverter
|
|
20
20
|
remote.strip!
|
21
21
|
end
|
22
22
|
|
23
|
+
def self.get_repo_url(filepath)
|
24
|
+
remote = GithubInterface.git_remote(filepath)
|
25
|
+
remote.gsub!("git@github.com:","https://github.com/")
|
26
|
+
remote.gsub!(/.git$/,"")
|
27
|
+
remote.strip!
|
28
|
+
end
|
29
|
+
|
23
30
|
def self.adjust_local_markdown_images(readme, raw_remote_url, branch)
|
24
31
|
readme.gsub!(/\!\[.+\]\(.+\)/) {|image|
|
25
32
|
if !image.match('amazonaws.com') && !image.match('https://') && !image.match('youtube')
|
@@ -52,4 +59,14 @@ class RepositoryConverter
|
|
52
59
|
redcarpet.render(readme)
|
53
60
|
end
|
54
61
|
|
62
|
+
def self.add_fis_links(filepath, readme)
|
63
|
+
repo = self.get_repo_url(filepath)
|
64
|
+
github_repo_link = "<a style='text-decoration: none;' href='#{repo}' target='_blank' rel='noopener'><img style='width: 40px; height: 40px; margin: 2px;' title='Open GitHub Repo' src='https://curriculum-content.s3.amazonaws.com/git-logo-gray.png' alt='Link to GitHub Repo' /></a>"
|
65
|
+
github_issue_link = "<a style='text-decoration: none;' href='#{repo}/issues/new' target='_blank' rel='noopener'><img style='width: 40px; height: 40px; margin: 2px;' title='Create New Issue' src='https://curriculum-content.s3.amazonaws.com/flag-icon-gray.png' alt='Link to GitHub Repo Issue Form' /></a>"
|
66
|
+
|
67
|
+
html = "<p style='margin: 0; padding: 0; position: absolute; right: 5px; top: 5px; margin: 0; padding: 0;'>#{github_repo_link}#{github_issue_link}</p>"
|
68
|
+
|
69
|
+
readme + html
|
70
|
+
end
|
71
|
+
|
55
72
|
end
|
@@ -1,18 +1,21 @@
|
|
1
1
|
class UpdateCanvasLesson
|
2
2
|
|
3
|
-
def initialize(filepath, branch, name, type, dry_run)
|
3
|
+
def initialize(filepath, branch, name, type, dry_run, fis_links)
|
4
4
|
name = name.split(/[- _]/).map(&:capitalize).join(' ')
|
5
5
|
readme = File.read("#{filepath}/README.md")
|
6
6
|
if !readme
|
7
7
|
puts 'README.md not found in current directory. Exiting...'
|
8
8
|
abort
|
9
9
|
end
|
10
|
-
update_canvas_lesson(readme, filepath, branch, name, type, dry_run)
|
10
|
+
update_canvas_lesson(readme, filepath, branch, name, type, dry_run, fis_links)
|
11
11
|
end
|
12
12
|
|
13
|
-
def update_canvas_lesson(readme, filepath, branch, name, type, dry_run)
|
13
|
+
def update_canvas_lesson(readme, filepath, branch, name, type, dry_run, fis_links)
|
14
14
|
GithubInterface.get_updated_repo(filepath, branch)
|
15
15
|
new_readme = RepositoryConverter.convert(filepath, readme, branch)
|
16
|
+
if fis_links
|
17
|
+
new_readme = RepositoryConverter.add_fis_links(filepath, new_readme)
|
18
|
+
end
|
16
19
|
canvas_data = CanvasDotfile.read_canvas_data
|
17
20
|
canvas_data[:lessons].each { |lesson|
|
18
21
|
CanvasInterface.update_existing_lesson(lesson[:course_id], lesson[:id], type, name, new_readme, dry_run)
|