docrb 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 74814d0dca672ec2099fcb9092660f198b93ccb3b454979201ad18be4db5fb25
4
- data.tar.gz: 34660996e9148eebe8a1757f04f0be4c2f19300d9de1fd43f793e3d7e97502c6
3
+ metadata.gz: 6f0802ce2c22dc5e953086dc6a7ceb943f2698123aa218b84ffe0c12979cf6d8
4
+ data.tar.gz: e6ffe294b8f3ca2aea65b8a29295c69597241a7369356e48a655dcc4267da2ff
5
5
  SHA512:
6
- metadata.gz: 6f53696d60c6bf4634dd2c2fe093c24a786b1f6cd9e87432a73e8ca4c5298d2f9c868cd8b8640dbd65bfc67b130272d2708ea6e7cdd01da142da33278dae0625
7
- data.tar.gz: a98ca47316bdc564de37a6144dfa8613f49717313d7dee5424ce5feca10f6e91f80353a0078233461d3f6dd4202ce0ecb3635ef6641326b3e325f28b6234562c
6
+ metadata.gz: a5186508c23d6da130f52ca66e704f049c9545ac486faf0da9f93bd72620d5139a4e9835955e419062cbd4a2eeb29c417523253c27e74927a7a29408b151588f
7
+ data.tar.gz: 8d8c70b0bcacfedea85f401abd53901c3b1835ceadcfc9f8f089a1fef74ec6f1dcb83cc5fb83983f76fc9e9db6c9d8087472717e096099c5f85c2ecb93e677e0
data/.rubocop.yml CHANGED
@@ -1,8 +1,7 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 3.2
3
+ SuggestExtensions: false
3
4
  NewCops: enable
4
- Exclude:
5
- - spec/**/*
6
5
 
7
6
  Style/StringLiterals:
8
7
  Enabled: true
@@ -12,59 +11,50 @@ Style/StringLiteralsInInterpolation:
12
11
  Enabled: true
13
12
  EnforcedStyle: double_quotes
14
13
 
15
- Style/Documentation:
16
- Exclude:
17
- - lib/docrb/module_extensions.rb
18
-
19
14
  Layout/LineLength:
20
15
  Max: 120
21
- Exclude:
22
- - exe/*
23
- - lib/docrb/comment_parser.rb
24
- - lib/docrb/ruby_parser.rb
25
16
 
26
- Metrics/ClassLength:
27
- Enabled: false
17
+ Layout/FirstHashElementIndentation:
18
+ EnforcedStyle: consistent
28
19
 
29
- Metrics/MethodLength:
20
+ Layout/EndAlignment:
21
+ EnforcedStyleAlignWith: start_of_line
22
+
23
+ Layout/MultilineMethodCallIndentation:
24
+ EnforcedStyle: indented
25
+
26
+ Style/Documentation:
30
27
  Enabled: false
31
28
 
32
- Naming/MethodParameterName:
33
- Exclude:
34
- - spec/**/*
29
+ Layout/CaseIndentation:
30
+ EnforcedStyle: end
31
+
32
+ Layout/FirstArgumentIndentation:
33
+ EnforcedStyle: consistent_relative_to_receiver
34
+
35
+ Layout/ArgumentAlignment:
36
+ EnforcedStyle: with_fixed_indentation
37
+
38
+ Style/EmptyCaseCondition:
39
+ Enabled: false
35
40
 
36
41
  Metrics/BlockLength:
37
- Exclude:
38
- - exe/*
39
- - lib/docrb/ruby_parser.rb
42
+ Enabled: false
40
43
 
41
- Metrics/PerceivedComplexity:
42
- Exclude:
43
- - exe/*
44
- - lib/docrb/doc_compiler/base_container.rb
45
- - lib/docrb/doc_compiler/base_container/computations.rb
46
- - lib/docrb/doc_compiler/object_container.rb
47
- - lib/docrb/resolvable.rb
48
- - lib/docrb/ruby_parser.rb
44
+ Metrics/ClassLength:
45
+ Enabled: false
49
46
 
50
- Metrics/CyclomaticComplexity:
51
- Exclude:
52
- - exe/*
53
- - lib/docrb/doc_compiler/base_container.rb
54
- - lib/docrb/doc_compiler/base_container/computations.rb
55
- - lib/docrb/doc_compiler/object_container.rb
56
- - lib/docrb/resolvable.rb
57
- - lib/docrb/ruby_parser.rb
58
-
59
- Lint/ShadowingOuterLocalVariable:
60
- Exclude:
61
- - exe/*
47
+ Metrics/ModuleLength:
48
+ Enabled: false
49
+
50
+ Metrics/MethodLength:
51
+ Enabled: false
62
52
 
63
53
  Metrics/AbcSize:
64
54
  Enabled: false
65
55
 
66
- Metrics/ModuleLength:
56
+ Metrics/CyclomaticComplexity:
67
57
  Enabled: false
68
58
 
69
- Lint/BooleanSymbol:
59
+ Metrics/PerceivedComplexity:
70
60
  Enabled: false
data/Gemfile CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "docrb-html", path: "../docrb-html"
6
+
7
+ gem "docrb-parser", path: "../docrb-parser"
8
+
5
9
  # Specify your gem's dependencies in docrb.gemspec
6
10
  gemspec
7
11
 
@@ -10,7 +14,7 @@ group :development do
10
14
 
11
15
  gem "rspec", "~> 3.0"
12
16
 
13
- gem "rubocop", "~> 1.8"
17
+ gem "rubocop", "~> 1.21"
14
18
 
15
19
  gem "byebug"
16
20
 
data/Gemfile.lock CHANGED
@@ -1,11 +1,24 @@
1
1
  PATH
2
- remote: .
2
+ remote: ../docrb-html
3
3
  specs:
4
- docrb (0.2.0)
5
- docrb-html (~> 0.2)
6
- parser (~> 3.2)
4
+ docrb-html (0.3.0)
5
+ nokogiri (~> 1.14)
7
6
  redcarpet (~> 3.6)
8
7
  rouge (~> 4.1)
8
+ sassc (~> 2.4)
9
+
10
+ PATH
11
+ remote: ../docrb-parser
12
+ specs:
13
+ docrb-parser (0.1.0)
14
+ prism (~> 0.13)
15
+
16
+ PATH
17
+ remote: .
18
+ specs:
19
+ docrb (0.3.0)
20
+ docrb-html (~> 0.3)
21
+ docrb-parser (~> 0.1)
9
22
 
10
23
  GEM
11
24
  remote: https://rubygems.org/
@@ -14,25 +27,23 @@ GEM
14
27
  awesome_print (1.9.2)
15
28
  byebug (11.1.3)
16
29
  diff-lcs (1.5.0)
17
- docrb-html (0.2.5)
18
- nokogiri (~> 1.14)
19
- sassc (~> 2.4)
20
- ffi (1.15.5)
30
+ ffi (1.16.3)
21
31
  json (2.6.3)
22
- nokogiri (1.14.2-arm64-darwin)
32
+ nokogiri (1.15.4-arm64-darwin)
23
33
  racc (~> 1.4)
24
- nokogiri (1.14.2-x86_64-darwin)
34
+ nokogiri (1.15.4-x86_64-darwin)
25
35
  racc (~> 1.4)
26
36
  parallel (1.22.1)
27
37
  parser (3.2.1.0)
28
38
  ast (~> 2.4.1)
29
- racc (1.6.2)
39
+ prism (0.14.0)
40
+ racc (1.7.1)
30
41
  rainbow (3.1.1)
31
42
  rake (13.0.6)
32
43
  redcarpet (3.6.0)
33
44
  regexp_parser (2.7.0)
34
45
  rexml (3.2.5)
35
- rouge (4.1.0)
46
+ rouge (4.2.0)
36
47
  rspec (3.12.0)
37
48
  rspec-core (~> 3.12.0)
38
49
  rspec-expectations (~> 3.12.0)
@@ -65,15 +76,19 @@ GEM
65
76
 
66
77
  PLATFORMS
67
78
  arm64-darwin-22
79
+ arm64-darwin-23
68
80
  x86_64-darwin-20
81
+ x86_64-darwin-22
69
82
 
70
83
  DEPENDENCIES
71
84
  awesome_print
72
85
  byebug
73
86
  docrb!
87
+ docrb-html!
88
+ docrb-parser!
74
89
  rake (~> 13.0)
75
90
  rspec (~> 3.0)
76
- rubocop (~> 1.8)
91
+ rubocop (~> 1.21)
77
92
 
78
93
  BUNDLED WITH
79
94
  2.2.22
data/docrb.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
18
  spec.metadata["source_code_uri"] = "#{spec.homepage}/tree/trunk/lib/docrb"
19
19
  spec.metadata["changelog_uri"] = spec.homepage
20
+ spec.metadata["rubygems_mfa_required"] = "true"
20
21
 
21
22
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
23
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
@@ -25,9 +26,6 @@ Gem::Specification.new do |spec|
25
26
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
26
27
  spec.require_paths = ["lib"]
27
28
 
28
- spec.add_dependency "docrb-html", "~> 0.2"
29
- spec.add_dependency "parser", "~> 3.2"
30
- spec.add_dependency "redcarpet", "~> 3.6"
31
- spec.add_dependency "rouge", "~> 4.1"
32
- spec.metadata["rubygems_mfa_required"] = "true"
29
+ spec.add_dependency "docrb-html", "~> 0.3"
30
+ spec.add_dependency "docrb-parser", "~> 0.1"
33
31
  end
data/exe/docrb CHANGED
@@ -7,12 +7,11 @@ require "fileutils"
7
7
  require "optparse"
8
8
  require "open3"
9
9
  require "tmpdir"
10
- require "renderer"
11
10
 
12
11
  require "docrb"
13
12
 
14
- def exec(cmd, *args, **kwargs)
15
- _, stdout_and_err, wait_thread = Open3.popen2e(cmd, *args, **kwargs)
13
+ def exec(cmd, *, **)
14
+ _, stdout_and_err, wait_thread = Open3.popen2e(cmd, *, **)
16
15
  status = wait_thread.value
17
16
  {
18
17
  code: status.exitstatus,
@@ -20,57 +19,55 @@ def exec(cmd, *args, **kwargs)
20
19
  }
21
20
  end
22
21
 
23
- def git(*args, **kwargs)
24
- exec("git", *args, **kwargs)
25
- end
26
-
27
- def render_html(*args, **kwargs)
28
- exec("docrb-html", *args, **kwargs)
29
- end
22
+ def git(*, **) = exec("git", *, **)
30
23
 
31
24
  def run
32
25
  options = {}
33
- opts = OptionParser.new do |opts|
34
- opts.banner = "Usage: bin/docrb [options] [input directory] [output directory]"
35
- gemspec_info = "When omitted, Docrb attempts to extract information from a .gemspec file in the provided input directory."
26
+ opts = OptionParser.new do |opt|
27
+ opt.banner = "Usage: bin/docrb [options] [input directory] [output directory]"
28
+ gemspec_info = "When omitted, Docrb attempts to extract information from " \
29
+ "a .gemspec file in the provided input directory."
36
30
 
37
- opts.on("--help", "Prints this help") do
38
- puts opts
31
+ opt.on("--help", "Prints this help") do
32
+ puts opt
39
33
  exit
40
34
  end
41
35
 
42
- opts.on("-bPATH", "--base=PATH",
43
- "Base directory to search for source files. Defaults to the provided input directory.") do |b|
36
+ opt.on("-bPATH", "--base=PATH",
37
+ "Base directory to search for source files. Defaults to the provided input directory.") do |b|
44
38
  options[:base] = b
45
39
  end
46
40
 
47
- opts.on("-rPATH", "--readme=PATH",
48
- "Path for README.md file. When omitted, Docrb searches for a README.md file in the provided input directory.") do |r|
41
+ opt.on("-rPATH", "--readme=PATH",
42
+ "Path for README.md file. When omitted, Docrb searches for a README.md " \
43
+ "file in the provided input directory.") do |r|
49
44
  options[:readme] = r
50
45
  end
51
46
 
52
- opts.on("-nNAME", "--name=NAME", "Name of the project being documented. #{gemspec_info}") do |n|
47
+ opt.on("-nNAME", "--name=NAME", "Name of the project being documented. #{gemspec_info}") do |n|
53
48
  options[:name] = n
54
49
  end
55
50
 
56
- opts.on("-sSUMMARY", "--summary=SUMMARY", "Short summary of the project being documented. #{gemspec_info}") do |d|
51
+ opt.on("-sSUMMARY", "--summary=SUMMARY", "Short summary of the project being documented. #{gemspec_info}") do |d|
57
52
  options[:summary] = d
58
53
  end
59
54
 
60
- opts.on("-hURL", "--host=URL", "URL for the gem's hosted URL. #{gemspec_info}") do |u|
55
+ opt.on("-hURL", "--host=URL", "URL for the gem's hosted URL. #{gemspec_info}") do |u|
61
56
  options[:host_url] = u
62
57
  end
63
58
 
64
- opts.on("-gURL", "--git-repo=URL",
65
- "URL for the repository containing the documented project. When omitted, Docrb attempts to extract this information from the .git directory present in the provided input directory, if any.") do |u|
59
+ opt.on("-gURL", "--git-repo=URL",
60
+ "URL for the repository containing the documented project. When " \
61
+ "omitted, Docrb attempts to extract this information from the " \
62
+ ".git directory present in the provided input directory, if any.") do |u|
66
63
  options[:git_url] = u
67
64
  end
68
65
 
69
- opts.on("--authors a,b,c", "List of name of project authors. #{gemspec_info}") do |list|
66
+ opt.on("--authors a,b,c", "List of name of project authors. #{gemspec_info}") do |list|
70
67
  options[:authors] = list
71
68
  end
72
69
 
73
- opts.on("-lLICENSE", "--license=LICENSE", "The project's license. #{gemspec_info}") do |license|
70
+ opt.on("-lLICENSE", "--license=LICENSE", "The project's license. #{gemspec_info}") do |license|
74
71
  options[:license] = license
75
72
  end
76
73
  end
@@ -104,10 +101,6 @@ def run
104
101
  end
105
102
  end
106
103
 
107
- tmp_output = Dir.mktmpdir
108
- data_path = File.join(tmp_output, "data.json")
109
- markdown_path = File.join(tmp_output, "readme.html")
110
- metadata_path = File.join(tmp_output, "metadata.json")
111
104
  readme_path = File.join(input, "README.md")
112
105
  base_path = input
113
106
 
@@ -119,7 +112,16 @@ def run
119
112
  end
120
113
  end
121
114
 
122
- spec = Docrb::Spec.parse_folder(input) || {}
115
+ if options[:base]
116
+ path = File.join(input, options[:base])
117
+ unless File.exist? path
118
+ puts "--base was provided, but #{path} does not exist."
119
+ exit(1)
120
+ end
121
+ base_path = path
122
+ end
123
+
124
+ source, spec = Docrb.parse_folder(base_path, input)
123
125
 
124
126
  %i[name summary host_url git_url authors license].each do |k|
125
127
  spec[k] = options[k] if options.key? k
@@ -131,25 +133,17 @@ def run
131
133
  end
132
134
 
133
135
  if spec[:summary] == "" || spec[:summary].nil?
134
- puts "Docrb could not detect the project's summary. Please check your .gemspec, or provide one manually using --summary."
136
+ puts "Docrb could not detect the project's summary. Please check your " \
137
+ ".gemspec, or provide one manually using --summary."
135
138
  exit(1)
136
139
  end
137
140
 
138
- if options[:base]
139
- path = File.join(input, options[:base])
140
- unless File.exist? path
141
- puts "--base was provided, but #{path} does not exist."
142
- exit(1)
143
- end
144
- base_path = path
145
- end
146
-
147
141
  git_tip = nil
148
142
  git_root = nil
149
143
  git_status = git("status", "--porcelain", chdir: input)
150
144
  if (git_status[:code]).zero?
151
145
  if git_status[:output].length.positive?
152
- puts "WARNING: Your local git copy seems to be dirty. Consider commiting your changes before generating docs."
146
+ puts "WARNING: Your local git copy seems to be dirty. Consider committing your changes before generating docs."
153
147
  end
154
148
  tip_data = git("rev-parse", "HEAD", chdir: input)
155
149
  if tip_data[:code] != 0
@@ -179,27 +173,15 @@ def run
179
173
  spec[:timestamp] = Time.now.utc.strftime("%A, %d %b %Y %l:%M %p GMT")
180
174
  spec[:version] = Docrb::VERSION
181
175
 
182
- data = Docrb.parse_folder(base_path)
183
- compiler = Docrb::DocCompiler.new
184
- data.each { |f| compiler.append(f) }
185
-
186
- File.write(data_path, compiler.to_h.to_json)
187
- puts "Created: #{data_path}"
188
-
189
176
  if File.exist? readme_path
190
- puts "Found #{readme_path}"
191
177
  md = File.read(readme_path).to_s
192
- result = Docrb::Markdown.render(md)
193
- File.write(markdown_path, result)
194
- puts "Created #{markdown_path}"
178
+ spec[:readme] = md
195
179
  else
196
180
  puts "#{readme_path} does not exist. Skipping..."
197
181
  end
198
- File.write(metadata_path, spec.to_json)
199
- puts "Created #{metadata_path}"
200
182
 
201
- puts "Generating HTML into #{output}"
202
- Renderer.new(tmp_output, output).render
183
+ compiler = Docrb::DocCompiler.new(source, spec, output)
184
+ compiler.run!
203
185
  end
204
186
 
205
187
  run
@@ -1,55 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Docrb
4
- # DocCompiler implements utilities to post-process documentation data
5
- # generated by RubyParser.
6
- class DocCompiler < Resolvable
7
- autoload :FileRef, "docrb/doc_compiler/file_ref"
8
- autoload :BaseContainer, "docrb/doc_compiler/base_container"
9
- autoload :DocClass, "docrb/doc_compiler/doc_class"
10
- autoload :DocModule, "docrb/doc_compiler/doc_module"
11
- autoload :DocMethod, "docrb/doc_compiler/doc_method"
12
- autoload :DocAttribute, "docrb/doc_compiler/doc_attribute"
13
- autoload :ObjectContainer, "docrb/doc_compiler/object_container"
14
- autoload :DocBlocks, "docrb/doc_compiler/doc_blocks"
15
-
16
- attr_reader :classes, :modules, :methods, :parent
17
-
18
- def initialize
19
- super
20
- @classes = ObjectContainer.new(self, DocClass)
21
- @modules = ObjectContainer.new(self, DocModule)
22
- @methods = ObjectContainer.new(self, DocMethod)
23
- @parent = nil
24
- end
25
-
26
- # Appends a given object to the compiler collection. Raises ArgumentError in
27
- # case the object cannot be appended to the current container.
28
- #
29
- # obj - Object to be appended
30
- def append(obj)
31
- filename = obj[:filename]
32
- target = case obj[:type]
33
- when :module
34
- @modules
35
- when :class
36
- @classes
37
- when :def, :defs
38
- @methods
39
- end
40
-
41
- raise ArgumentError, "cannot append obj of type #{obj[:type]}" if target.nil?
42
-
43
- target.push(filename, obj)
4
+ class DocCompiler
5
+ def initialize(source, spec, output)
6
+ @source = source
7
+ @spec = spec
8
+ @output = output
44
9
  end
45
10
 
46
- # Transforms the content's of the parser into a Hash representation
47
- def to_h
48
- {
49
- modules: @modules.map(&:to_h),
50
- classes: @classes.map(&:to_h),
51
- methods: @methods.map(&:to_h)
52
- }
11
+ def run!
12
+ Renderer.new(@source, @spec, @output).render
53
13
  end
54
14
  end
55
15
  end
data/lib/docrb/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Docrb
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/docrb.rb CHANGED
@@ -1,71 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parser/current"
4
- require "forwardable"
5
3
  require "json"
6
- require "redcarpet"
7
- require "rouge"
8
- require "rouge/plugins/redcarpet"
9
4
  require "rubygems"
10
5
 
11
- Parser::Builders::Default.emit_lambda = true
12
- Parser::Builders::Default.emit_procarg0 = true
13
- Parser::Builders::Default.emit_encoding = true
14
- Parser::Builders::Default.emit_index = true
15
- Parser::Builders::Default.emit_arg_inside_procarg0 = true
16
- Parser::Builders::Default.emit_forward_arg = true
17
- Parser::Builders::Default.emit_kwargs = true
18
- Parser::Builders::Default.emit_match_pattern = true
6
+ require "docrb-html"
7
+ require "docrb-parser"
19
8
 
20
- require_relative "docrb/version"
21
- require_relative "docrb/ruby_parser"
22
- require_relative "docrb/module_extensions"
9
+ require_relative "docrb/spec"
10
+ require_relative "docrb/doc_compiler"
23
11
 
24
12
  # Docrb implements a source and documentation parser for Ruby projects
25
13
  module Docrb
26
14
  # Error class from which all other Docrb errors derive from
27
15
  class Error < StandardError; end
28
16
 
29
- autoload :CommentParser, "docrb/comment_parser"
30
- autoload :DocCompiler, "docrb/doc_compiler"
31
- autoload :Resolvable, "docrb/resolvable"
32
- autoload :Markdown, "docrb/markdown"
33
- autoload :Spec, "docrb/spec"
34
-
35
- # Public: Parses a single file under a provided path
36
- #
37
- # path - Path to the file to be parsed
38
- #
39
- # Returns an object representing the parsed source and documentation
40
- def self.parse(path)
41
- inst = RubyParser.new(path)
42
- inst.parse
43
- inst
44
- end
45
-
46
- # Public: Parses a given input folder recursivelly and returns all sources
17
+ # Public: Parses a given input folder recursively and returns all sources
47
18
  # and documentations
48
19
  #
49
- # inp - Folder to be parsed. Finds all .rb files recursivelly from this path.
20
+ # inp - Folder to be parsed. Finds all .rb files recursively from this path.
50
21
  #
51
- # Returns an array with all parsed files
52
- def self.parse_folder(inp)
53
- output = []
54
- Dir["#{inp}/**/*.rb"].each do |f|
55
- inst = parse(f)
56
- inst.classes.each do |c|
57
- c[:filename] = f
58
- output << c
59
- end
60
- inst.modules.each do |c|
61
- c[:filename] = f
62
- output << c
63
- end
64
- inst.methods.each do |c|
65
- c[:filename] = f
66
- output << c
67
- end
68
- end
69
- output
22
+ # Returns a NodeArray with parsed nodes.
23
+ def self.parse_folder(base, input)
24
+ source = Docrb::Parser
25
+ .new
26
+ .tap { |parser| Dir["#{base}/**/*.rb"].each { parser.parse(_1) } }
27
+ .tap(&:finalize)
28
+ spec = Spec.parse_folder(input)
29
+
30
+ [source, spec]
70
31
  end
71
32
  end