leg 0.0.1 → 0.0.2

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.
Files changed (78) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +10 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +34 -0
  6. data/LICENSE +21 -0
  7. data/README.md +59 -0
  8. data/Rakefile +11 -0
  9. data/TUTORIAL.md +243 -0
  10. data/bin/console +9 -0
  11. data/bin/setup +6 -0
  12. data/exe/leg +6 -0
  13. data/leg.gemspec +31 -0
  14. data/lib/leg.rb +27 -0
  15. data/lib/leg/cli.rb +42 -0
  16. data/lib/leg/commands.rb +19 -0
  17. data/lib/leg/commands/amend.rb +49 -0
  18. data/lib/leg/commands/base_command.rb +99 -0
  19. data/lib/leg/commands/build.rb +126 -0
  20. data/lib/leg/commands/commit.rb +48 -0
  21. data/lib/leg/commands/diff.rb +29 -0
  22. data/lib/leg/commands/help.rb +43 -0
  23. data/lib/leg/commands/init.rb +46 -0
  24. data/lib/leg/commands/reset.rb +26 -0
  25. data/lib/leg/commands/resolve.rb +31 -0
  26. data/lib/leg/commands/save.rb +31 -0
  27. data/lib/leg/commands/status.rb +54 -0
  28. data/lib/leg/commands/step.rb +31 -0
  29. data/lib/leg/config.rb +42 -0
  30. data/lib/leg/default_templates.rb +340 -0
  31. data/lib/leg/diff.rb +151 -0
  32. data/lib/leg/diff_transformers.rb +11 -0
  33. data/lib/leg/diff_transformers/base_transformer.rb +13 -0
  34. data/lib/leg/diff_transformers/fold_sections.rb +89 -0
  35. data/lib/leg/diff_transformers/omit_adjacent_removals.rb +38 -0
  36. data/lib/leg/diff_transformers/syntax_highlight.rb +32 -0
  37. data/lib/leg/diff_transformers/trim_blank_lines.rb +25 -0
  38. data/lib/leg/line.rb +83 -0
  39. data/lib/leg/markdown.rb +20 -0
  40. data/lib/leg/page.rb +27 -0
  41. data/lib/leg/representations.rb +9 -0
  42. data/lib/leg/representations/base_representation.rb +42 -0
  43. data/lib/leg/representations/git.rb +388 -0
  44. data/lib/leg/representations/litdiff.rb +85 -0
  45. data/lib/leg/step.rb +16 -0
  46. data/lib/leg/template.rb +95 -0
  47. data/lib/leg/tutorial.rb +49 -0
  48. data/lib/leg/version.rb +3 -0
  49. metadata +112 -38
  50. data/bin/leg +0 -9
  51. data/lib/snaptoken.rb +0 -24
  52. data/lib/snaptoken/cli.rb +0 -61
  53. data/lib/snaptoken/commands.rb +0 -13
  54. data/lib/snaptoken/commands/amend.rb +0 -27
  55. data/lib/snaptoken/commands/base_command.rb +0 -92
  56. data/lib/snaptoken/commands/build.rb +0 -107
  57. data/lib/snaptoken/commands/commit.rb +0 -27
  58. data/lib/snaptoken/commands/help.rb +0 -38
  59. data/lib/snaptoken/commands/resolve.rb +0 -27
  60. data/lib/snaptoken/commands/status.rb +0 -21
  61. data/lib/snaptoken/commands/step.rb +0 -35
  62. data/lib/snaptoken/default_templates.rb +0 -287
  63. data/lib/snaptoken/diff.rb +0 -180
  64. data/lib/snaptoken/diff_line.rb +0 -54
  65. data/lib/snaptoken/diff_transformers.rb +0 -9
  66. data/lib/snaptoken/diff_transformers/base_transformer.rb +0 -9
  67. data/lib/snaptoken/diff_transformers/fold_sections.rb +0 -85
  68. data/lib/snaptoken/diff_transformers/omit_adjacent_removals.rb +0 -28
  69. data/lib/snaptoken/diff_transformers/trim_blank_lines.rb +0 -21
  70. data/lib/snaptoken/markdown.rb +0 -18
  71. data/lib/snaptoken/page.rb +0 -64
  72. data/lib/snaptoken/representations.rb +0 -8
  73. data/lib/snaptoken/representations/base_representation.rb +0 -38
  74. data/lib/snaptoken/representations/git.rb +0 -262
  75. data/lib/snaptoken/representations/litdiff.rb +0 -81
  76. data/lib/snaptoken/step.rb +0 -27
  77. data/lib/snaptoken/template.rb +0 -53
  78. data/lib/snaptoken/tutorial.rb +0 -64
@@ -1,81 +0,0 @@
1
- class Snaptoken::Representations::Litdiff < Snaptoken::Representations::BaseRepresentation
2
- def save!(options = {})
3
- FileUtils.mkdir_p(path)
4
- FileUtils.rm_rf(File.join(path, "."), secure: true)
5
-
6
- step_num = 1
7
- @tutorial.pages.each.with_index do |page, page_idx|
8
- output = ""
9
- page.steps.each do |step|
10
- output << step.text << "\n\n" unless step.text.empty?
11
- output << "~~~ #{step.summary}\n"
12
- output << step.to_patch(unchanged_char: "|") << "\n"
13
-
14
- yield step_num if block_given?
15
- step_num += 1
16
- end
17
- output << page.footer_text << "\n" if page.footer_text
18
-
19
- filename = page.filename + ".litdiff"
20
- filename = "%02d.%s" % [page_idx + 1, filename] if @tutorial.pages.length > 1
21
-
22
- File.write(File.join(path, filename), output)
23
- end
24
- end
25
-
26
- def load!(options = {})
27
- step_num = 1
28
- @tutorial.clear
29
- Dir[File.join(path, "*.litdiff")].sort_by { |f| File.basename(f).to_i }.each do |diff_path|
30
- filename = File.basename(diff_path).sub(/\.litdiff$/, "").sub(/^\d+\./, "")
31
- page = Snaptoken::Page.new(filename)
32
- File.open(diff_path, "r") do |f|
33
- cur_text = ""
34
- cur_diff = nil
35
- cur_summary = nil
36
- while line = f.gets
37
- if line.start_with? "~~~"
38
- cur_summary = (line[3..-1] || "").strip
39
- cur_diff = ""
40
- elsif cur_diff
41
- if line.chomp.empty?
42
- step_diffs = Snaptoken::Diff.parse(cur_diff)
43
- page << Snaptoken::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
44
-
45
- yield step_num if block_given?
46
- step_num += 1
47
-
48
- cur_text = ""
49
- cur_summary = nil
50
- cur_diff = nil
51
- else
52
- cur_diff << line.sub(/^\|/, " ")
53
- end
54
- else
55
- cur_text << line
56
- end
57
- end
58
- if cur_diff
59
- step_diffs = Snaptoken::Diff.parse(cur_diff)
60
- page << Snaptoken::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
61
- elsif !cur_text.strip.empty?
62
- page.footer_text = cur_text.strip
63
- end
64
- end
65
- @tutorial << page
66
- end
67
- @tutorial
68
- end
69
-
70
- def path
71
- File.join(@tutorial.config[:path], "doc")
72
- end
73
-
74
- private
75
-
76
- def modified_at
77
- if File.exist? path
78
- Dir[File.join(path, "**/*")].map { |f| File.mtime(f) }.max
79
- end
80
- end
81
- end
@@ -1,27 +0,0 @@
1
- class Snaptoken::Step
2
- attr_accessor :number, :summary, :text, :diffs
3
-
4
- def initialize(number, summary, text, diffs)
5
- @number = number
6
- @summary = summary.strip
7
- @text = text.strip
8
- @diffs = diffs
9
- end
10
-
11
- def to_html(tutorial, offline)
12
- Snaptoken::Template.new(tutorial.step_template, tutorial,
13
- offline: offline,
14
- number: @number,
15
- summary: @summary,
16
- diffs: @diffs
17
- ).render_template
18
- end
19
-
20
- def to_patch(options = {})
21
- @diffs.map { |diff| diff.to_patch(options) }.join("\n")
22
- end
23
-
24
- def syntax_highlight!
25
- @diffs.each(&:syntax_highlight!)
26
- end
27
- end
@@ -1,53 +0,0 @@
1
- class Snaptoken::Template
2
- attr_reader :tutorial
3
-
4
- def initialize(template_source, tutorial, params)
5
- @template_source = template_source
6
- @tutorial = tutorial
7
- @params = params
8
- end
9
-
10
- def render_template
11
- b = binding
12
- @tutorial.config.merge(@params).each do |name, value|
13
- b.local_variable_set(name, value)
14
- end
15
- ERB.new(@template_source).result(b)
16
- end
17
-
18
- def render(path)
19
- if !path.end_with? ".md"
20
- raise ArgumentError, "Only .md files are supported by render() at the moment."
21
- end
22
-
23
- contents = File.read(path)
24
- Snaptoken::Markdown.render(contents)
25
- end
26
-
27
- def markdown(source)
28
- Snaptoken::Markdown.render(source)
29
- end
30
-
31
- def pages
32
- @tutorial.pages
33
- end
34
-
35
- def step(number)
36
- step = @tutorial.step(number)
37
- step.syntax_highlight!
38
- step.to_html(@tutorial, @params[:offline])
39
- end
40
-
41
- def syntax_highlighting_css(scope)
42
- syntax_theme = @tutorial.config[:syntax_theme] || "github"
43
- if syntax_theme.is_a? String
44
- theme = Rouge::Theme.find(syntax_theme)
45
- elsif syntax_theme.is_a? Hash
46
- theme = Class.new(Rouge::Themes::Base16)
47
- theme.name "base16.custom"
48
- theme.palette syntax_theme
49
- end
50
-
51
- theme.render(scope: scope)
52
- end
53
- end
@@ -1,64 +0,0 @@
1
- class Snaptoken::Tutorial
2
- attr_accessor :config
3
- attr_accessor :page_template, :step_template
4
- attr_reader :pages
5
-
6
- def initialize(config = {})
7
- @config = config
8
- @page_template = Snaptoken::DefaultTemplates::PAGE
9
- @step_template = Snaptoken::DefaultTemplates::STEP
10
- @pages = []
11
- end
12
-
13
- def <<(page)
14
- @pages << page
15
- self
16
- end
17
-
18
- def clear
19
- @pages.clear
20
- end
21
-
22
- def step(number)
23
- cur = 1
24
- @pages.each do |page|
25
- page.steps.each do |step|
26
- return step if cur == number
27
- cur += 1
28
- end
29
- end
30
- end
31
-
32
- def num_steps
33
- @pages.map(&:steps).map(&:length).sum
34
- end
35
-
36
- def transform_diffs(transformers, &progress_block)
37
- step_num = 1
38
- @pages.each do |page|
39
- page.steps.each do |step|
40
- step.diffs.map! do |diff|
41
- transformers.inject(diff) do |acc, transformer|
42
- transformer.transform(acc)
43
- end
44
- end
45
- progress_block.(step_num) if progress_block
46
- step_num += 1
47
- end
48
- end
49
- end
50
-
51
- def last_synced_at
52
- File.mtime(last_synced_path) if File.exist?(last_synced_path)
53
- end
54
-
55
- def synced!
56
- FileUtils.touch(last_synced_path)
57
- end
58
-
59
- private
60
-
61
- def last_synced_path
62
- File.join(@config[:path], ".leg/last_synced")
63
- end
64
- end