readme_yard 0.1.2 → 0.2.0

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: 3d5cd63671c91ee41af8ce37e33ae8a2cb1e2b71a70c2a9c6b5063128a635fce
4
- data.tar.gz: 910ee77105320c38974f621d750719b43c33f3b2f2dadd7ec66a16b616303f28
3
+ metadata.gz: e70847a5ff6d1679d77cc14a1f61154d1c43bd4f54087cca2cef1ecfa3288130
4
+ data.tar.gz: a78c652849586570a7fc15d8f327db4b57458bb230ec46c325ed6d207d7fcd9a
5
5
  SHA512:
6
- metadata.gz: bad866d4aa2dcc18b21ea1af011fcb5374614dd1961e187d84b24873611466a4099d36aca44da03ece1f9dda8f6ebef54c3f94cbc0312365f6fb20fa8dc526e8
7
- data.tar.gz: 467924c84db446676b5c0d3002a815646e2976c3aec76258075f2104158d064eac450b2a57a6763c5947cac145be808346e97469a47a52e920cacb2a8fb407d1
6
+ metadata.gz: 2d185d882b7be9a813841ec178a9ad1cf91c0b7ca48801ccf892500096cb5fb9295c5859bb17ad8356bf8c12d9a52741ef73e7ffe768f58377c5a92f18b567d0
7
+ data.tar.gz: 71205b0dce3be4c060af8b941a7f03fd47d7c40871c3941fbdefc572e214b2d8409eb4830a0dc5101538754e39c0ce14a433e10f18935360e4d12fb1f9fa54b7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## 0.2.0 - 2021-08-08
4
+
5
+ - Add new readme tag types - `comment`, `source`, and `object`. Log warnings and raise errors when helpful. Update README. 51997f24d5209fd8f0e5e11511352f6457bb9dbe
6
+
3
7
  ## 0.1.2 - 2021-08-06
4
8
 
5
9
  - Fix error message markdown parsing. 0f1c3fa4f39c6d7a1628f81e1ea41489b7021254
data/Gemfile.lock CHANGED
@@ -1,9 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- readme_yard (0.1.2)
4
+ readme_yard (0.2.0)
5
5
  tty-markdown (~> 0.7)
6
- yard-readme (~> 0.1)
6
+ yard-readme (~> 0.3)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
@@ -31,7 +31,7 @@ GEM
31
31
  unicode-display_width (2.0.0)
32
32
  unicode_utils (1.4.0)
33
33
  yard (0.9.26)
34
- yard-readme (0.1.1)
34
+ yard-readme (0.3.0)
35
35
  yard (~> 0.9.26)
36
36
 
37
37
  PLATFORMS
data/README.md CHANGED
@@ -2,19 +2,45 @@
2
2
  [![Gem Version](https://badge.fury.io/rb/readme_yard.svg)](https://badge.fury.io/rb/readme_yard)
3
3
  [![Maintainability](https://api.codeclimate.com/v1/badges/9fe0012930c3886dbe00/maintainability)](https://codeclimate.com/github/mattruzicka/readme_yard/maintainability)
4
4
 
5
- An experiment in building a better README with
6
- [YARD](https://yardoc.org).
7
- Take a look at [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md)
8
- to see the template from which the README for this project was generated.
5
+ Build a better README with [YARD](https://yardoc.org),
6
+ one that summarizes and contextualizes the code and documentation,
7
+ without duplicating them.
9
8
 
9
+ This gem aims to minimize the effort needed to keep
10
+ your code, docs, and README useful, syncd, and correct.
11
+
12
+ For a glimpse of how it works, check out the [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md)
13
+ template from which this gem's README was generated.
10
14
  If you're reading the README, that means this text is here
11
- because `{@readme ReadmeYard}` is in
12
- [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md)
15
+ because `{@readme ReadmeYard}` is in the README_YARD file
13
16
  and someone ran `readme build` at the command line.
14
17
 
15
- If you're looking at the [source code](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb) or
16
- [documentation](https://rubydoc.info/github/mattruzicka/readme_yard),
17
- _welcome_ to readme yard!
18
+ Here's the [full documentation](https://rubydoc.info/github/mattruzicka/readme_yard).
19
+
20
+
21
+ ---
22
+
23
+ ## Table of Contents
24
+ - [Installation](#installation)
25
+ - [Getting Started](#getting-started)
26
+ - [Command Line Usage](#command-line-usage)
27
+ - [Tag Usage](#tag-usage)
28
+ - [Readme Tag](#readme-tag)
29
+ - [Readme YARD Tags](#readme-yard-tags)
30
+ - [Example Tag](#example-tag)
31
+ - [Contributing](#contributing)
32
+
33
+ ---
34
+
35
+ ## Installation
36
+
37
+ Add [gem "readme_yard"](https://rubygems.org/gems/readme_yard) to your application's Gemfile and run `bundle install` or install it yourself with: `gem install readme_yard`
38
+
39
+ ## Getting Started
40
+
41
+ Run `readme build` at the command line. That will create a README_YARD.md file if there isn’t one by copying your exisiting README.md file.
42
+
43
+ README_YARD.md is the template from which `readme build` generates the README. It augments your markdown with tagging capabilities as described in the section on [Tag Usage](#tag-usage).
18
44
 
19
45
  ---
20
46
 
@@ -26,85 +52,137 @@ _welcome_ to readme yard!
26
52
 
27
53
  `readme doc` - Same as `readme build` + generates yard docs.
28
54
 
55
+
29
56
  ---
30
57
 
31
- ## Getting Started
58
+ ## Tag Usage
59
+
60
+ Readme Yard uses **README tags** and **YARD tags** in order to find, format, and embed Ruby source code inside README.md.
61
+
62
+ **README tags** live inside README_YARD.md.
63
+
64
+ **YARD tags** live inside Ruby source code.
32
65
 
33
- Add [gem "readme_yard"](https://rubygems.org/gems/readme_yard) to your application's Gemfile and run `bundle install` or install it yourself with `gem install readme_yard`.
66
+ When the Readme Yard build process encounters a tag in README_YARD.md, it searches the Ruby source code for its YARD tag counterpart, formats the output, and embeds it in the README file.
67
+
68
+ ### Examples
69
+
70
+ This project's [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md) has `{@readme ReadmeYard.hello_world}` just below this paragraph, unless you're looking at the [README]((https://github.com/mattruzicka/readme_yard/blob/main/README.md)) where you should instead see a code example which was generated from running `readme build`.
71
+
72
+ ```ruby
73
+ #
74
+ # @example
75
+ # ReadmeYard.hello_world #=> "Hello 🌎 🌍 🌏"
76
+ #
77
+ ```
34
78
 
35
- Next run `readme build` at the command line. This creates a README_YARD.md file if there isn’t one by copying the README file if it exists. It then parses README_YARD.md and writes the result to README.md.
36
79
 
37
- In addition to being able to use tags as documented in the next section, you can edit the README_YARD file just as you would edit any README. Then to see changes made to README_YARD reflected in the README, run `readme build`.
80
+ The README tag tells Readme Yard to parse the `@readme` YARD tag located above the `hello_world` class method located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
81
+
82
+ To use another "meta" example, `{@readme ReadmeYard}` is used at the top of this project's README_YARD.md file to generate the first few sentences of this README. `ReadmeYard` references the class located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
83
+
84
+ Last one, `{@readme ReadmeYard#command_line_usage}` is used to generate the "Command Line Usage" section above from the comments located above. `ReadmeYard#command_line_usage` references the instance method `command_line_usage` located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
38
85
 
39
86
  ---
40
87
 
41
- ## Usage
88
+ ## Readme Tag
89
+
90
+ **README Tag** syntax: `{@readme ObjectPath}`
42
91
 
43
- The following tags can be used in README_YARD.md to generate YARD documentation inside your README.
92
+ **YARD Tag** syntax: `@example <name>`
44
93
 
45
- ### @readme
94
+ By default, only the text nested under the @readme tag
95
+ will be embedded in the final output.
46
96
 
47
- Usage: `{@readme ObjectPath}`
97
+ Different embed options are provided via the following
98
+ name options: `comment`, `source`, and `object`.
48
99
 
49
- `{@readme ReadmeYard}` is used at the top of this project's README_YARD.md file to generate this README's title and description. `ReadmeYard` references the class located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
50
100
 
51
- `{@readme ReadmeYard#command_line_usage}` is used to generate the "Command Line Usage" section above from the comments located above. `ReadmeYard#command_line_usage` references the instance method `command_line_usage` located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
101
+ The above two sentences were generated via `{@readme ReadmeYard::ReadmeTag}` in README_YARD.md and the @readme tag at the top of [ReadmeYard::ReadmeTag class](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/readme_tag.rb).
52
102
 
53
- `{@readme ReadmeYard.hello_world}` - This object only exists so that you can read this in the README. `ReadmeYard.hello_world` references
54
- the class method located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
103
+ ## Readme YARD Tags
55
104
 
56
- ### @example
57
105
 
58
- Usage: `{@example ObjectPath}`
106
+ ### Comment Tag
59
107
 
60
- The below example code is generated from placing `{@example ReadmeYard.hello_world}` in README_YARD.md.
108
+ ```@readme comment``` - Embeds the comment.
109
+
110
+
111
+ [This @readme comment YARD tag](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/comment_tag.rb) embeds the below code snippet because `{@readme ReadmeYard::CommentTag.format_tag_markdown}` is in README_YARD.md.
61
112
 
62
113
  ```ruby
63
- ReadmeYard.hello_world => "Hello 🌎 🌍 🌏"
114
+ #
115
+ # This comment is in the README because `@readme comment`
116
+ # is below, in the source code.
117
+ #
64
118
  ```
65
119
 
66
- ---
67
120
 
68
- ## Inspiration
121
+ ### Source Tag
69
122
 
70
- The desire to have the code, README, and documentation for [Evolvable](https://github.com/mattruzicka/evolvable) be useful, synced, and correct as I work on documenting the [1.1.0 Release](https://github.com/mattruzicka/evolvable/pull/8).
123
+ ```@readme source``` - Embeds the source.
71
124
 
72
- I want a README that summarizes and contextualizes the code and documentation, without duplicating them, so as to make keeping it up-to-date easier. Laziness!
73
125
 
74
- ---
126
+ [This @readme source YARD tag](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/readme_tag.rb) embeds the below code snippet because `{@readme ReadmeYard::SourceTag.format_tag_markdown}` is in README_YARD.md.
127
+
128
+ ```ruby
129
+ def format_tag_markdown(yard_object, _tag)
130
+ ExampleTag.format_ruby(yard_object.source)
131
+ end
132
+ ```
133
+
75
134
 
76
- ## Ideas
77
135
 
78
- - Embed whole doc string if @readme tag is found, but there’s no text.
136
+ ### Object Tag
79
137
 
80
- - Embed whole method if @example tag is found, but no text.
138
+ ```@readme object``` - Embeds the comment and source.
81
139
 
82
- - `readme tags` - Prints usage and a list of all tags
83
140
 
84
- - `readme tags -v` - Prints docstrings of all tags
141
+ [This @readme object YARD tag](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/readme_tag.rb) embeds the below code snippet because `{@readme ReadmeYard::ObjectTag.format_tag_markdown}` is in README_YARD.md.
85
142
 
86
- - `readme tags <tag>` - Prints list of matching tags
143
+ ```ruby
144
+ #
145
+ # This method's comment and code is in the README because
146
+ # because `@readme object` is below, in the actual source code.
147
+ #
148
+ def format_tag_markdown(yard_object, _tag)
149
+ text = CommentTag.format_docstring_as_comment(yard_object)
150
+ text << "\n#{yard_object.source}"
151
+ ExampleTag.format_ruby(text)
152
+ end
153
+ ```
87
154
 
88
- - `readme tags <tag>` - Prints list of matching tag docstrings
89
155
 
90
- - Improve linking. At the moment, there's lots of room for error when adding links in the YARD documentation.
91
156
 
92
- - Support @todo tags or any other native YARD tags that might be useful.
157
+ ---
93
158
 
94
- - Add ability to target a particular tag in a doc string from README_YARD.md. Maybe via a tag directive?
159
+ ## Example Tag
95
160
 
96
- - Follow @see links to find tags
161
+ **README Tag** syntax: `{@example ObjectPath}`
97
162
 
98
- - Integrate something like https://github.com/lsegal/yard-examples/blob/master/doctest/doctest.rb to add red/green test status to code example. Maybe via some sort of tag directive?
163
+ **YARD Tag** example: `@example`
99
164
 
100
- - Be able to customize the name of the source and target files.
165
+ ```ruby
166
+ #
167
+ # @example
168
+ # ReadmeYard.hello_world #=> "Hello 🌎 🌍 🌏"
169
+ #
170
+ ```
101
171
 
102
- - Integrate with the YARD server so that changes to documentation or README_YARD.md automatically regenerate the README
103
172
 
104
- - Be able to register regexes for matching tags and running given blocks. Use to create functionality for tagging GitHub source.
173
+ Given that the above comment is for the `hello_world` class method, the below example code is generated from placing `{@example ReadmeYard.hello_world}` in README_YARD.md.
174
+
175
+ ```ruby
176
+ ReadmeYard.hello_world #=> "Hello 🌎 🌍 🌏"
177
+ ```
178
+
105
179
 
106
180
  ---
107
181
 
108
182
  ## Contributing
109
183
 
110
184
  Bug reports and pull requests are welcome on GitHub at https://github.com/mattruzicka/yard-readme.
185
+
186
+ Thanks for taking the time to think about me, the README.
187
+
188
+ 🌿 🥏 🌱 ⚽
data/README_YARD.md CHANGED
@@ -6,84 +6,117 @@
6
6
 
7
7
  ---
8
8
 
9
- {@readme ReadmeYard#command_line_usage}
9
+ ## Table of Contents
10
+ - [Installation](#installation)
11
+ - [Getting Started](#getting-started)
12
+ - [Command Line Usage](#command-line-usage)
13
+ - [Tag Usage](#tag-usage)
14
+ - [Readme Tag](#readme-tag)
15
+ - [Readme YARD Tags](#readme-yard-tags)
16
+ - [Example Tag](#example-tag)
17
+ - [Contributing](#contributing)
10
18
 
11
19
  ---
12
20
 
21
+ ## Installation
22
+
23
+ Add [gem "readme_yard"](https://rubygems.org/gems/readme_yard) to your application's Gemfile and run `bundle install` or install it yourself with: `gem install readme_yard`
24
+
13
25
  ## Getting Started
14
26
 
15
- Add [gem "readme_yard"](https://rubygems.org/gems/readme_yard) to your application's Gemfile and run `bundle install` or install it yourself with `gem install readme_yard`.
27
+ Run `readme build` at the command line. That will create a README_YARD.md file if there isn’t one by copying your exisiting README.md file.
16
28
 
17
- Next run `readme build` at the command line. This creates a README_YARD.md file if there isn’t one by copying the README file if it exists. It then parses README_YARD.md and writes the result to README.md.
29
+ README_YARD.md is the template from which `readme build` generates the README. It augments your markdown with tagging capabilities as described in the section on [Tag Usage](#tag-usage).
18
30
 
19
- In addition to being able to use tags as documented in the next section, you can edit the README_YARD file just as you would edit any README. Then to see changes made to README_YARD reflected in the README, run `readme build`.
31
+ ---
32
+
33
+ {@readme ReadmeYard#command_line_usage}
20
34
 
21
35
  ---
22
36
 
23
- ## Usage
37
+ ## Tag Usage
24
38
 
25
- The following tags can be used in README_YARD.md to generate YARD documentation inside your README.
39
+ Readme Yard uses **README tags** and **YARD tags** in order to find, format, and embed Ruby source code inside README.md.
26
40
 
27
- ### @readme
41
+ **README tags** live inside README_YARD.md.
28
42
 
29
- Usage: `{@readme ObjectPath}`
43
+ **YARD tags** live inside Ruby source code.
30
44
 
31
- `{@readme ReadmeYard}` is used at the top of this project's README_YARD.md file to generate this README's title and description. `ReadmeYard` references the class located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
45
+ When the Readme Yard build process encounters a tag in README_YARD.md, it searches the Ruby source code for its YARD tag counterpart, formats the output, and embeds it in the README file.
32
46
 
33
- `{@readme ReadmeYard#command_line_usage}` is used to generate the "Command Line Usage" section above from the comments located above. `ReadmeYard#command_line_usage` references the instance method `command_line_usage` located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
47
+ ### Examples
34
48
 
35
- `{@readme ReadmeYard.hello_world}` - {@readme ReadmeYard.hello_world}
49
+ This project's [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md) has `{@readme ReadmeYard.hello_world}` just below this paragraph, unless you're looking at the [README]((https://github.com/mattruzicka/readme_yard/blob/main/README.md)) where you should instead see a code example which was generated from running `readme build`.
36
50
 
37
- ### @example
51
+ {@readme ReadmeYard.hello_world}
38
52
 
39
- Usage: `{@example ObjectPath}`
53
+ The README tag tells Readme Yard to parse the `@readme` YARD tag located above the `hello_world` class method located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
40
54
 
41
- The below example code is generated from placing `{@example ReadmeYard.hello_world}` in README_YARD.md.
55
+ To use another "meta" example, `{@readme ReadmeYard}` is used at the top of this project's README_YARD.md file to generate the first few sentences of this README. `ReadmeYard` references the class located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
42
56
 
43
- {@example ReadmeYard.hello_world}
57
+ Last one, `{@readme ReadmeYard#command_line_usage}` is used to generate the "Command Line Usage" section above from the comments located above. `ReadmeYard#command_line_usage` references the instance method `command_line_usage` located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
44
58
 
45
59
  ---
46
60
 
47
- ## Inspiration
61
+ ## Readme Tag
48
62
 
49
- The desire to have the code, README, and documentation for [Evolvable](https://github.com/mattruzicka/evolvable) be useful, synced, and correct as I work on documenting the [1.1.0 Release](https://github.com/mattruzicka/evolvable/pull/8).
63
+ **README Tag** syntax: `{@readme ObjectPath}`
50
64
 
51
- I want a README that summarizes and contextualizes the code and documentation, without duplicating them, so as to make keeping it up-to-date easier. Laziness!
65
+ **YARD Tag** syntax: `@example <name>`
52
66
 
53
- ---
67
+ {@readme ReadmeYard::ReadmeTag}
68
+
69
+ The above two sentences were generated via `{@readme ReadmeYard::ReadmeTag}` in README_YARD.md and the @readme tag at the top of [ReadmeYard::ReadmeTag class](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/readme_tag.rb).
54
70
 
55
- ## Ideas
71
+ ## Readme YARD Tags
56
72
 
57
- - Embed whole doc string if @readme tag is found, but there’s no text.
58
73
 
59
- - Embed whole method if @example tag is found, but no text.
74
+ ### Comment Tag
60
75
 
61
- - `readme tags` - Prints usage and a list of all tags
76
+ {@readme ReadmeYard::CommentTag}
62
77
 
63
- - `readme tags -v` - Prints docstrings of all tags
78
+ [This @readme comment YARD tag](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/comment_tag.rb) embeds the below code snippet because `{@readme ReadmeYard::CommentTag.format_tag_markdown}` is in README_YARD.md.
64
79
 
65
- - `readme tags <tag>` - Prints list of matching tags
80
+ {@readme ReadmeYard::CommentTag.format_tag_markdown}
66
81
 
67
- - `readme tags <tag>` - Prints list of matching tag docstrings
82
+ ### Source Tag
68
83
 
69
- - Improve linking. At the moment, there's lots of room for error when adding links in the YARD documentation.
84
+ {@readme ReadmeYard::SourceTag}
70
85
 
71
- - Support @todo tags or any other native YARD tags that might be useful.
86
+ [This @readme source YARD tag](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/readme_tag.rb) embeds the below code snippet because `{@readme ReadmeYard::SourceTag.format_tag_markdown}` is in README_YARD.md.
72
87
 
73
- - Add ability to target a particular tag in a doc string from README_YARD.md. Maybe via a tag directive?
88
+ {@readme ReadmeYard::SourceTag.format_tag_markdown}
74
89
 
75
- - Follow @see links to find tags
76
90
 
77
- - Integrate something like https://github.com/lsegal/yard-examples/blob/master/doctest/doctest.rb to add red/green test status to code example. Maybe via some sort of tag directive?
91
+ ### Object Tag
78
92
 
79
- - Be able to customize the name of the source and target files.
93
+ {@readme ReadmeYard::ObjectTag}
80
94
 
81
- - Integrate with the YARD server so that changes to documentation or README_YARD.md automatically regenerate the README
95
+ [This @readme object YARD tag](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard/readme_tag.rb) embeds the below code snippet because `{@readme ReadmeYard::ObjectTag.format_tag_markdown}` is in README_YARD.md.
96
+
97
+ {@readme ReadmeYard::ObjectTag.format_tag_markdown}
82
98
 
83
- - Be able to register regexes for matching tags and running given blocks. Use to create functionality for tagging GitHub source.
99
+
100
+ ---
101
+
102
+ ## Example Tag
103
+
104
+ **README Tag** syntax: `{@example ObjectPath}`
105
+
106
+ **YARD Tag** example: `@example`
107
+
108
+ {@readme ReadmeYard.hello_world}
109
+
110
+ Given that the above comment is for the `hello_world` class method, the below example code is generated from placing `{@example ReadmeYard.hello_world}` in README_YARD.md.
111
+
112
+ {@example ReadmeYard.hello_world}
84
113
 
85
114
  ---
86
115
 
87
116
  ## Contributing
88
117
 
89
118
  Bug reports and pull requests are welcome on GitHub at https://github.com/mattruzicka/yard-readme.
119
+
120
+ Thanks for taking the time to think about me, the README.
121
+
122
+ 🌿 🥏 🌱 ⚽
data/lib/readme_yard.rb CHANGED
@@ -2,44 +2,39 @@
2
2
 
3
3
  require "yard-readme"
4
4
  require_relative "readme_yard/version"
5
+ require_relative "readme_yard/error"
6
+ require_relative "readme_yard/logger"
7
+ require_relative "readme_yard/readme_tag"
8
+ require_relative "readme_yard/example_tag"
9
+ require_relative "readme_yard/comment_tag"
10
+ require_relative "readme_yard/source_tag"
11
+ require_relative "readme_yard/object_tag"
12
+
13
+ YARDReadme::DocstringParser.readme_tag_names = %w[comment source object]
5
14
 
6
15
  #
7
16
  # @readme
8
- # An experiment in building a better README with
9
- # [YARD](https://yardoc.org).
10
- # Take a look at [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md)
11
- # to see the template from which the README for this project was generated.
17
+ # Build a better README with [YARD](https://yardoc.org),
18
+ # one that summarizes and contextualizes the code and documentation,
19
+ # without duplicating them.
20
+ #
21
+ # This gem aims to minimize the effort needed to keep
22
+ # your code, docs, and README useful, syncd, and correct.
12
23
  #
24
+ # For a glimpse of how it works, check out the [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md)
25
+ # template from which this gem's README was generated.
13
26
  # If you're reading the README, that means this text is here
14
- # because `{@readme ReadmeYard}` is in
15
- # [README_YARD.md](https://github.com/mattruzicka/readme_yard/blob/main/README_YARD.md)
27
+ # because `{@readme ReadmeYard}` is in the README_YARD file
16
28
  # and someone ran `readme build` at the command line.
17
29
  #
18
- # If you're looking at the [source code](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb) or
19
- # [documentation](https://rubydoc.info/github/mattruzicka/readme_yard),
20
- # _welcome_ to readme yard!
30
+ # Here's the [full documentation](https://rubydoc.info/github/mattruzicka/readme_yard).
21
31
  #
22
32
  class ReadmeYard
23
- class Error < StandardError
24
- class << self
25
- # TODO: Look for instance method with same name if
26
- # class method and vise versa to give a more helpful error.
27
- # Also, look for the object path in other scopes.
28
- def object_not_found(tag_name, object_path)
29
- new("`#{object_path}` could not be found. Perhaps" \
30
- " the `@#{tag_name}` tag was moved, mispelled," \
31
- " or the `.yardopts` YARD file is missing the file path.")
32
- end
33
- end
34
- end
35
-
36
33
  #
37
- # @readme
38
- # This object only exists so that you can read this in the README. `ReadmeYard.hello_world` references
39
- # the class method located in [lib/readme_yard.rb](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb).
34
+ # @readme comment
40
35
  #
41
36
  # @example
42
- # ReadmeYard.hello_world => "Hello 🌎 🌍 🌏"
37
+ # ReadmeYard.hello_world #=> "Hello 🌎 🌍 🌏"
43
38
  #
44
39
  def self.hello_world
45
40
  "Hello 🌎 🌍 🌏"
@@ -63,6 +58,16 @@ class ReadmeYard
63
58
  puts TTY::Markdown.parse(e.message)
64
59
  end
65
60
 
61
+ TAG_CLASS_LOOKUP = { "readme" => ReadmeTag,
62
+ "example" => ExampleTag,
63
+ "source" => SourceTag,
64
+ "comment" => CommentTag,
65
+ "object" => ObjectTag }.freeze
66
+
67
+ def self.lookup_tag_class(tag_name)
68
+ TAG_CLASS_LOOKUP[tag_name]
69
+ end
70
+
66
71
  def initialize
67
72
  @readme_path = "./README.md"
68
73
  @readme_yard_path = "./README_YARD.md"
@@ -85,8 +90,8 @@ class ReadmeYard
85
90
  def command_line_usage
86
91
  yard_parse_this_file
87
92
  yard_object = YARD::Registry.at("#{self.class.name}##{__method__}")
88
- tags = yard_object.tags(:readme)
89
- "\n#{format_readme_tags(tags)}\n\n"
93
+ yard_tags = yard_object.tags(:readme)
94
+ "\n#{ReadmeTag.format_markdown(yard_object, yard_tags)}\n\n"
90
95
  end
91
96
 
92
97
  #
@@ -100,6 +105,7 @@ class ReadmeYard
100
105
  # `-q` silence yardoc output statements
101
106
  #
102
107
  def build(options: "-nq")
108
+ find_or_upsert_yardopts
103
109
  run_yardoc(options: options)
104
110
  File.write(readme_path, gsub_tags!(readme_yard_md))
105
111
  end
@@ -107,12 +113,12 @@ class ReadmeYard
107
113
  #
108
114
  # @readme Same as "build" + generates yard docs.
109
115
  #
110
- def doc(options: "-q --markup markdown")
111
- build(options: options || "-q --markup markdown")
116
+ def doc(options: "-q")
117
+ build(options: options || "-q")
112
118
  end
113
119
 
114
120
  def run_yardoc(options: "-nq")
115
- YARD::CLI::Yardoc.run("#{options || "-nq"} --plugin readme")
121
+ YARD::CLI::Yardoc.run(options || "-nq")
116
122
  end
117
123
 
118
124
  private
@@ -130,22 +136,6 @@ class ReadmeYard
130
136
  new_readme_yard_md
131
137
  end
132
138
 
133
- #
134
- # This method adds the below paragraph to a project's
135
- # README file, if it doesn't already have one when running
136
- # `readme build` for the first time.
137
- #
138
- # @readme
139
- # This is a quick example of using a readme tag in README_YARD.md
140
- #
141
- # > {@readme ReadmeYard#default_readme_yard_md}
142
- #
143
- # to copy a `@readme` comment from
144
- # [source code](https://github.com/mattruzicka/readme_yard/blob/main/lib/readme_yard.rb)
145
- # and paste it into the README file.
146
- #
147
- # 🌱 ⚽
148
- #
149
139
  def default_readme_yard_md
150
140
  yard_parse_this_file
151
141
  +"Welcome to the README_YARD 🌿 🥏\n\n" \
@@ -154,24 +144,70 @@ class ReadmeYard
154
144
  " for usage.\n\n{@readme ReadmeYard#default_readme_yard_md}"
155
145
  end
156
146
 
147
+ YARDOPTS_FILE = ".yardopts"
148
+
149
+ def find_or_upsert_yardopts
150
+ File.exist?(YARDOPTS_FILE) ? update_yardopts_file : create_yardopts_file
151
+ end
152
+
153
+ def update_yardopts_file
154
+ text = File.read(YARDOPTS_FILE)
155
+ text_addition = build_yardopts_text_addition(text)
156
+ File.open(YARDOPTS_FILE, "a") { |f| f.write(text_addition) } if text_addition
157
+ end
158
+
159
+ def build_yardopts_text_addition(yardopts_text)
160
+ return if yardopts_text.match?(/\s*--plugin\s+readme\W/)
161
+
162
+ readme_plugin_opts = default_readme_plugin_opts(yardopts_text)
163
+ case yardopts_text
164
+ when /\s*--markup\s+markdown/, /\s*-m\s+markdown/
165
+ readme_plugin_opts
166
+ when /\s*--markup\s/, /\s*-m\s/
167
+ warn_about_supported_markdown
168
+ readme_plugin_opts
169
+ else
170
+ readme_plugin_opts << "--markup markdown\n"
171
+ end
172
+ end
173
+
174
+ def default_readme_plugin_opts(yardopts_text)
175
+ readme_opts = +""
176
+ readme_opts << "\n" unless yardopts_text.lines.last.include?("\n")
177
+ readme_opts << "--plugin readme\n"
178
+ end
179
+
180
+ def create_yardopts_file
181
+ File.write(YARDOPTS_FILE, "--plugin readme\n--markup markdown\n")
182
+ end
183
+
157
184
  def gsub_tags!(markdown)
158
- markdown.gsub!(/([^`]|^)(\{@\w+\s.+\})/) { |string| format_tag(string) }
185
+ markdown.gsub!(/([^`]|^)(\{@\w+\s.+\})/) { |string| format_tag_markdown(string) }
159
186
  markdown
160
187
  end
161
188
 
162
- def format_tag(string)
189
+ def format_tag_markdown(string)
163
190
  first_char = string[0]
164
191
  return string if first_char == "`"
165
192
 
166
193
  tag_name = extract_tag_name(string)
167
194
  object_path = extract_object_path(string)
168
- code_object = YARD::Registry.at(object_path)
169
- raise Error.tag_not_found(tag_name, object_path) unless code_object
195
+ yard_object = YARD::Registry.at(object_path)
196
+ raise Error.object_not_found(object_path, tag_name) unless yard_object
170
197
 
171
- tags = code_object.tags(tag_name)
172
- return string if tags.empty?
198
+ yard_tags_markdown = format_yard_tags_markdown(yard_object, tag_name, string)
199
+ "#{first_char if first_char != "{"}#{yard_tags_markdown}"
200
+ end
173
201
 
174
- "#{first_char if first_char != "{"}#{send("format_#{tag_name}_tags", tags)}"
202
+ def format_yard_tags_markdown(yard_object, tag_name, string)
203
+ yard_tags = yard_object.tags(tag_name)
204
+ if yard_tags.empty?
205
+ warn_about_yard_tags_not_found(yard_object, tag_name)
206
+ string
207
+ else
208
+ tag_class = self.class.lookup_tag_class(tag_name)
209
+ tag_class.format_markdown(yard_object, yard_tags)
210
+ end
175
211
  end
176
212
 
177
213
  def extract_tag_name(tag_string)
@@ -182,17 +218,18 @@ class ReadmeYard
182
218
  tag_string.match(/\s(\b.+)}/).captures.first
183
219
  end
184
220
 
185
- def format_readme_tags(tags)
186
- tags.map(&:text).join
187
- end
188
-
189
- def format_example_tags(tags)
190
- tags.map { |tag| "```ruby\n#{tag.text}\n```" }.join("\n")
191
- end
192
-
193
221
  def yard_parse_this_file
194
222
  gem_spec = Gem::Specification.find_by_name("readme_yard")
195
223
  current_file_path = File.join(gem_spec.full_gem_path, "lib", "readme_yard.rb")
196
224
  YARD.parse(current_file_path)
197
225
  end
226
+
227
+ def warn_about_supported_markdown
228
+ Logger.warn "\n*Readme Yard* works best with markdown." \
229
+ "\nConsider adding `--markup markdown` to your `.yardopts` file.\n\n"
230
+ end
231
+
232
+ def warn_about_yard_tags_not_found(yard_object, tag_name)
233
+ Logger.warn "The `@#{tag_name}` *Readme Yard* tag is missing from #{yard_object}."
234
+ end
198
235
  end
@@ -0,0 +1,41 @@
1
+ class ReadmeYard
2
+ #
3
+ # @readme
4
+ # ```@readme comment``` - Embeds the comment.
5
+ #
6
+ class CommentTag
7
+ class << self
8
+ #
9
+ # This comment is in the README because `@readme comment`
10
+ # is below, in the source code.
11
+ #
12
+ # @readme comment
13
+ #
14
+ def format_tag_markdown(yard_object, _tag)
15
+ comment = format_docstring_as_comment(yard_object)
16
+ ExampleTag.format_ruby(comment)
17
+ end
18
+
19
+ #
20
+ # @see https://rubydoc.info/gems/yard/YARD%2FDocstring:to_raw
21
+ #
22
+ def format_docstring_as_comment(yard_object)
23
+ comment = +""
24
+ docstring = yard_object.docstring.all
25
+ docstring.gsub!(named_readme_tag_regex, "")
26
+ docstring.lines.each do |line|
27
+ comment << "#"
28
+ comment << " " unless line[0] == "\n"
29
+ comment << line
30
+ end
31
+ last_line = yard_object.docstring.all.lines.last
32
+ comment << "#" if last_line.match?(/\n$/)
33
+ comment
34
+ end
35
+
36
+ def named_readme_tag_regex
37
+ @named_readme_tag_regex ||= /(\n|^)@readme\s(#{YARDReadme::DocstringParser.readme_tag_names.join("|")})\n/
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ class ReadmeYard
2
+ class Error < StandardError
3
+ class << self
4
+ #
5
+ # @todo
6
+ # Look for instance method with same name if
7
+ # class method and vise versa to give a more helpful error.
8
+ # Look for the object path in other scopes.
9
+ #
10
+ def object_not_found(object_path, tag_name)
11
+ new("*Readme Yard* could not find `#{object_path}`. Perhaps" \
12
+ " the `@#{tag_name}` tag was moved, mispelled," \
13
+ " or the `.yardopts` YARD file is missing the file path.")
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ class ReadmeYard
2
+ class ExampleTag
3
+ class << self
4
+ def format_markdown(yard_object, yard_tags)
5
+ yard_tags.map { |tag| format_tag_markdown(yard_object, tag) }.join("\n")
6
+ end
7
+
8
+ def format_tag_markdown(yard_object, tag)
9
+ text = tag.text.empty? ? yard_object.source : tag.text
10
+ format_ruby(text)
11
+ end
12
+
13
+ def format_ruby(text)
14
+ "```ruby\n#{text}\n```\n"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ class ReadmeYard
2
+ class Logger
3
+ class << self
4
+ def warn(msg)
5
+ puts TTY::Markdown.parse(msg)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ class ReadmeYard
2
+ #
3
+ # @readme
4
+ # ```@readme object``` - Embeds the comment and source.
5
+ #
6
+ class ObjectTag
7
+ class << self
8
+ #
9
+ # This method's comment and code is in the README because
10
+ # because `@readme object` is below, in the actual source code.
11
+ #
12
+ # @readme object
13
+ #
14
+ def format_tag_markdown(yard_object, _tag)
15
+ text = CommentTag.format_docstring_as_comment(yard_object)
16
+ text << "\n#{yard_object.source}"
17
+ ExampleTag.format_ruby(text)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ class ReadmeYard
2
+ #
3
+ # @readme
4
+ # By default, only the text nested under the @readme tag
5
+ # will be embedded in the final output.
6
+ #
7
+ # Different embed options are provided via the following
8
+ # name options: `comment`, `source`, and `object`.
9
+ #
10
+ # @see ReadmeYard::CommentTag
11
+ # @see ReadmeYard::SourceTag
12
+ # @see ReadmeYard::ObjectTag
13
+ #
14
+ class ReadmeTag
15
+ class << self
16
+ def format_markdown(yard_object, yard_tags)
17
+ md = +""
18
+ yard_tags.each do |tag|
19
+ res = format_yard_tag(yard_object, tag)
20
+ md << res if res
21
+ end
22
+ md
23
+ end
24
+
25
+ def format_tag_markdown(_yard_object, tag)
26
+ "#{tag.text}\n"
27
+ end
28
+
29
+ private
30
+
31
+ def format_yard_tag(yard_object, tag)
32
+ if tag.name && !tag.name.empty?
33
+ tag_class = ReadmeYard.lookup_tag_class(tag.name)
34
+ tag_class&.format_tag_markdown(yard_object, tag)
35
+ elsif tag.text && !tag.text.empty?
36
+ format_tag_markdown(yard_object, tag)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,18 @@
1
+ class ReadmeYard
2
+ #
3
+ # @readme
4
+ # ```@readme source``` - Embeds the source.
5
+ #
6
+ class SourceTag
7
+ class << self
8
+ #
9
+ # The following tag embeds this method's source.
10
+ #
11
+ # @readme source
12
+ #
13
+ def format_tag_markdown(yard_object, _tag)
14
+ ExampleTag.format_ruby(yard_object.source)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ReadmeYard
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.0"
5
5
  end
data/readme_yard.gemspec CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  # Uncomment to register a new dependency of your gem
29
29
  spec.add_dependency "tty-markdown", "~> 0.7"
30
- spec.add_dependency "yard-readme", "~> 0.1"
30
+ spec.add_dependency "yard-readme", "~> 0.3"
31
31
 
32
32
  # For more information and examples about making a new gem, checkout our
33
33
  # guide at: https://bundler.io/guides/creating_gem.html
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: readme_yard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Ruzicka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-06 00:00:00.000000000 Z
11
+ date: 2021-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-markdown
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.1'
33
+ version: '0.3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.1'
40
+ version: '0.3'
41
41
  description:
42
42
  email:
43
43
  executables:
@@ -59,6 +59,13 @@ files:
59
59
  - bin/readme
60
60
  - bin/setup
61
61
  - lib/readme_yard.rb
62
+ - lib/readme_yard/comment_tag.rb
63
+ - lib/readme_yard/error.rb
64
+ - lib/readme_yard/example_tag.rb
65
+ - lib/readme_yard/logger.rb
66
+ - lib/readme_yard/object_tag.rb
67
+ - lib/readme_yard/readme_tag.rb
68
+ - lib/readme_yard/source_tag.rb
62
69
  - lib/readme_yard/version.rb
63
70
  - readme_yard.gemspec
64
71
  homepage: https://github.com/mattruzicka/readme_yard