github-to-canvas 0.0.20 → 0.0.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9a4f7a0afcf69fa3c6a3b2c06eb36d73e3bfaef2691653202478bab81c2db709
4
- data.tar.gz: 975fb0c2f4cd1a19628da5f641f9b057852b3f2f5efa7ffdcc0868119bef3912
3
+ metadata.gz: a4ebf48161f0c0ac7ad012460961650eba100d006aa84a945a863278238a27a5
4
+ data.tar.gz: 1316e7036aa3032cbe4fa0d883b32f9c2bb142f585915d3045acbcb884e326b5
5
5
  SHA512:
6
- metadata.gz: d4fa7f6eee1eb0e7e30d21a47602df34e323daab0237fd85fcd1b7cdb613ab1ca7b2b68a7939ece0c91b9c840bd3ed7554f404839b45c95a843bb5f0e5df9fd8
7
- data.tar.gz: f2c98036eedb4d14ebade41064091c8c85f093bd6434e8769d6a952536916de03d96cf7ab08d21ff5be8336fe183915bc6570f7a5305ff95d8341a2682e0dc88
6
+ metadata.gz: a7005054aae77a3c0212c6be57e9ecd1a6c6066d3882a25ef2fef6bafd96abf71b2ad2283bde23a80830379adfffb5dd56913d56709d8ed4ecd9b4c7aa5a745f
7
+ data.tar.gz: d3516690ddcbec8c8df013530c399a38f8d8ddb4f69513385dc1339eb1a04dac141446931000a6aa37daea1b74905fafa8793657107aea9075d41c1d6bf1d988
@@ -18,19 +18,27 @@ 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]
22
+ github-to-canvas --create COURSE [--fis-links] [--remove-header-and-footer]
21
23
  github-to-canvas --align
24
+ github-to-canvas --align [--branch BRANCH]
25
+ github-to-canvas --align [--branch BRANCH] [--fis-links]
22
26
  github-to-canvas --version
27
+
23
28
 
24
29
  Run these commands from inside a local GitHub repository. This gem is built for Flatiron School's internal use.
25
30
  Some default behaviors assume this, like the default Canvas API path.
26
31
 
27
32
  Example usage:
28
33
 
29
- github-to-canvas --create 154 -> Creates a lesson in course 154, deriving the name and type from the local repo
30
- 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
34
+ github-to-canvas --create 154 -> Creates a lesson in course 154, derives the name and type from the local repo
35
+ github-to-canvas --create 154 --name "Fetch Lab" -> Creates a lesson in course 154 with the provided name, derives the type from the local repo
31
36
  github-to-canvas --create 154 --name "Fetch Lab" --type assignment -> Creates an assignment in course 154 with the provided name
32
- 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 --create 154 --name "Fetch Lab" --branch solution -> Creates a lesson in course 154 with the provided name, uses the repository's solution branch and derives the type from the local repo
38
+ github-to-canvas --align -> Patches existing lessons in Canvas based on the .canvas file
39
+ github-to-canvas --align --fis-links -> Patches existing lessons in Canvas based on the .canvas file, adds addition Flatiron School specific HTML
40
+ github-to-canvas --align --remove-header-and-footer -> Patches existing lessons in Canvas based on the .canvas file, removes top lesson header before converting to HTML
41
+
34
42
  EOBANNER
35
43
 
36
44
  opts.on("-cCOURSE", "--create COURSE",
@@ -48,7 +56,7 @@ OptionParser.new do |opts|
48
56
  end
49
57
  opts.on("-tTYPE", "--type TYPE",
50
58
  "Sets the type Canvas lesson to be created (page or assignment). If no type, type decided based on repository structure") do |type|
51
- if type == 'page' || type == 'assignment'
59
+ if type == 'page' || type == 'assignment' || type == 'discussion'
52
60
  options[:type] = type
53
61
  else
54
62
  puts "Invalid type. Defaulting to page"
@@ -64,9 +72,17 @@ OptionParser.new do |opts|
64
72
  options[:version] = true
65
73
  end
66
74
  opts.on("-d", "--dry-run",
67
- "Runs through creation without pushing to Canvas or GitHub") do |v|
75
+ "Runs through creation without pushing to Canvas or GitHub") do |d|
68
76
  options[:dry] = true
69
77
  end
78
+ opts.on("-f", "--fis-links",
79
+ "Adds additional Flatiron School HTML after markdown conversion") do |f|
80
+ options[:fis] = true
81
+ end
82
+ opts.on("-r", "--remove-header-and-footer",
83
+ "Removes top lesson header and any Learn.co specific footer links before converting to HTML") do |r|
84
+ options[:remove_header_and_footer] = true
85
+ end
70
86
 
71
87
  end.parse!
72
88
 
@@ -74,10 +90,12 @@ if options[:version]
74
90
  GithubToCanvas.new(mode: 'version', course: nil)
75
91
  end
76
92
 
77
- if Dir.glob("**/*/").empty? && !options[:type]
78
- options[:type] = "page"
79
- else
80
- options[:type] = "assignment"
93
+ if !options[:type]
94
+ if Dir.glob("**/*/").empty?
95
+ options[:type] = "page"
96
+ else
97
+ options[:type] = "assignment"
98
+ end
81
99
  end
82
100
 
83
101
  if !options[:branch]
@@ -89,9 +107,25 @@ if !options[:name]
89
107
  end
90
108
 
91
109
  if options[:create]
92
- GithubToCanvas.new(mode: "create", course: options[:course], filepath: Dir.pwd, branch: options[:branch], name: options[:name], type: options[:type], dry: !!options[:dry])
110
+ GithubToCanvas.new(mode: "create",
111
+ course: options[:course],
112
+ filepath: Dir.pwd,
113
+ branch: options[:branch],
114
+ name: options[:name],
115
+ type: options[:type],
116
+ dry: !!options[:dry],
117
+ fis_links: !!options[:fis],
118
+ remove_header_and_footer: !!options[:remove_header_and_footer])
93
119
  end
94
120
 
95
121
  if options[:align]
96
- GithubToCanvas.new(mode: "align", course: nil, filepath: Dir.pwd, branch: options[:branch], name: options[:name], type: options[:type], dry: !!options[:dry])
122
+ GithubToCanvas.new(mode: "align",
123
+ course: nil,
124
+ filepath: Dir.pwd,
125
+ branch: options[:branch],
126
+ name: options[:name],
127
+ type: options[:type],
128
+ dry: !!options[:dry],
129
+ fis_links: !!options[:fis],
130
+ remove_header_and_footer: !!options[:remove_header_and_footer])
97
131
  end
@@ -9,7 +9,16 @@ 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:,
13
+ course:,
14
+ filepath:Dir.pwd,
15
+ branch:'master',
16
+ name:File.basename(Dir.getwd),
17
+ type:"page",
18
+ dry:false,
19
+ fis_links:false,
20
+ remove_header_and_footer:false)
21
+
13
22
  if mode == 'version'
14
23
  puts VERSION
15
24
  return
@@ -17,12 +26,12 @@ class GithubToCanvas
17
26
 
18
27
  if mode == 'create'
19
28
  puts "github-to-canvas will now create a Canvas lesson based on the current repo"
20
- CreateCanvasLesson.new(course, filepath, branch, name, type, dry)
29
+ CreateCanvasLesson.new(course, filepath, branch, name, type, dry, fis_links, remove_header_and_footer)
21
30
  end
22
31
 
23
32
  if mode == 'align'
24
33
  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)
34
+ UpdateCanvasLesson.new(filepath, branch, name, type, dry, fis_links, remove_header_and_footer)
26
35
  end
27
36
  end
28
37
 
@@ -17,20 +17,31 @@ class CanvasInterface
17
17
  end
18
18
 
19
19
  def self.push_to_canvas(course_id, type, name, new_readme)
20
- url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s"
20
+ if type == 'discussion'
21
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}_topics"
22
+ else
23
+ url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s"
24
+ end
21
25
  payload = self.build_payload(type, name, new_readme)
22
-
23
- RestClient.post(url, payload, headers={
24
- "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
25
- })
26
+ begin
27
+ RestClient.post(url, payload, headers={
28
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
29
+ })
30
+ rescue
31
+ puts "Something went wrong while pushing lesson #{id} to course #{course_id}"
32
+ end
26
33
  end
27
34
 
28
35
  def self.update_existing_lesson(course_id, id, type, name, new_readme, dry_run)
29
36
  url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/#{type}s/#{id}"
30
37
  payload = self.build_payload(type, name, new_readme)
31
- RestClient.put(url, payload, headers={
32
- "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
33
- })
38
+ begin
39
+ RestClient.put(url, payload, headers={
40
+ "Authorization" => "Bearer #{ENV['CANVAS_API_KEY']}"
41
+ })
42
+ rescue
43
+ puts "Something went wrong while pushing lesson #{id} to course #{course_id}"
44
+ end
34
45
  end
35
46
 
36
47
  def self.build_payload(type, name, new_readme)
@@ -39,6 +50,11 @@ class CanvasInterface
39
50
  'assignment[name]' => name,
40
51
  'assignment[description]' => new_readme
41
52
  }
53
+ elsif type == "discussion"
54
+ payload = {
55
+ 'title' => name,
56
+ 'message' => new_readme
57
+ }
42
58
  else
43
59
  payload = {
44
60
  'wiki_page[title]' => name,
@@ -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, remove_header_and_footer)
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, remove_header_and_footer)
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, remove_header_and_footer)
14
14
  GithubInterface.get_updated_repo(filepath, branch)
15
- new_readme = RepositoryConverter.convert(filepath, readme, branch)
15
+ new_readme = RepositoryConverter.convert(filepath, readme, branch, remove_header_and_footer)
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.cd_into_and(filepath, command)
10
- cmd = "cd #{filepath} && #{command}"
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
- branch = self.cd_into_and(filepath, "git checkout #{branch}")
17
- if branch.to_s.strip.empty?
20
+ self.cd_into_and(filepath, "git checkout #{branch}")
21
+ current_branch = self.get_current_branch(filepath)
22
+ puts "Current branch #{current_branch.strip}"
23
+ if !current_branch.match(branch)
18
24
  puts "#{branch} branch not found. Exiting..."
19
25
  abort
20
26
  end
@@ -1,11 +1,23 @@
1
1
  require 'redcarpet'
2
2
  class RepositoryConverter
3
3
 
4
- def self.convert(filepath, readme, branch)
4
+ def self.convert(filepath, readme, branch, remove_header_and_footer)
5
+ if remove_header_and_footer
6
+ readme = self.remove_header(readme)
7
+ readme = self.remove_footer(readme)
8
+ end
5
9
  self.fix_local_images(filepath, readme, branch)
6
10
  self.convert_to_html(filepath, readme)
7
11
  end
8
12
 
13
+ def self.remove_header(readme)
14
+ readme.gsub(/^# .+\n\n/,"")
15
+ end
16
+
17
+ def self.remove_footer(readme)
18
+ readme.gsub(/<p (.+?)<\/p>/,"")
19
+ end
20
+
9
21
  def self.fix_local_images(filepath, readme, branch)
10
22
  raw_remote_url = self.set_raw_image_remote_url(filepath)
11
23
  self.adjust_local_markdown_images(readme, raw_remote_url, branch)
@@ -20,6 +32,13 @@ class RepositoryConverter
20
32
  remote.strip!
21
33
  end
22
34
 
35
+ def self.get_repo_url(filepath)
36
+ remote = GithubInterface.git_remote(filepath)
37
+ remote.gsub!("git@github.com:","https://github.com/")
38
+ remote.gsub!(/.git$/,"")
39
+ remote.strip!
40
+ end
41
+
23
42
  def self.adjust_local_markdown_images(readme, raw_remote_url, branch)
24
43
  readme.gsub!(/\!\[.+\]\(.+\)/) {|image|
25
44
  if !image.match('amazonaws.com') && !image.match('https://') && !image.match('youtube')
@@ -52,4 +71,16 @@ class RepositoryConverter
52
71
  redcarpet.render(readme)
53
72
  end
54
73
 
74
+ def self.add_fis_links(filepath, readme)
75
+ repo = self.get_repo_url(filepath)
76
+ github_repo_link = "<a class='fis-git-link' href='#{repo}' target='_blank' rel='noopener'><img id='repo-img' title='Open GitHub Repo' alt='GitHub Repo' /></a>"
77
+ github_issue_link = "<a class='fis-git-link' href='#{repo}/issues/new' target='_blank' rel='noopener'><img id='issue-img' title='Create New Issue' alt='Create New Issue' /></a>"
78
+ thumbs_up_link = "<a id='thumbs-up' data-repository='#{repo.split('/')[-1]}'><img title='Thumbs up!' alt='thumbs up' /></a>"
79
+ thumbs_down_link = "<a id='thumbs-down' data-repository='#{repo.split('/')[-1]}'><img title='Thumbs down!' alt='thumbs down' /></a>"
80
+ feedback_link = "<h5>Have specific feedback? <a href='#{repo}/issues/new'>Tell us here!</a></h5>"
81
+ header = "<header class='fis-header' style='visibility: hidden;'>#{github_repo_link}#{github_issue_link}</header>"
82
+ footer = "<footer class='fis-footer' style='visibility: hidden;'><div class='fis-feedback'><h5>How do you feel about this lesson?</h5>#{thumbs_up_link}#{thumbs_down_link}</div>#{feedback_link}</footer>"
83
+ header + readme + footer
84
+ end
85
+
55
86
  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, remove_header_and_footer)
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, remove_header_and_footer)
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, remove_header_and_footer)
14
14
  GithubInterface.get_updated_repo(filepath, branch)
15
- new_readme = RepositoryConverter.convert(filepath, readme, branch)
15
+ new_readme = RepositoryConverter.convert(filepath, readme, branch, remove_header_and_footer)
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)
@@ -1,3 +1,3 @@
1
1
  class GithubToCanvas
2
- VERSION = "0.0.20"
2
+ VERSION = "0.0.25"
3
3
  end
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.0.20
4
+ version: 0.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - maxwellbenton