mvz-dnote 1.8.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.rdoc +9 -0
- data/README.md +0 -3
- data/bin/dnote +4 -4
- data/lib/dnote/core_ext.rb +2 -2
- data/lib/dnote/format.rb +37 -41
- data/lib/dnote/note.rb +8 -7
- data/lib/dnote/notes.rb +64 -150
- data/lib/dnote/notes_collection.rb +73 -0
- data/lib/dnote/options.rb +125 -0
- data/lib/dnote/rake/dnotetask.rb +45 -31
- data/lib/dnote/session.rb +32 -114
- data/lib/dnote/version.rb +1 -1
- data/lib/dnote.rb +2 -2
- metadata +113 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63a1703569a00e121051d24aa575d670c35a073d2ad3bb297ac21d9962df74c4
|
4
|
+
data.tar.gz: bb4a5b8e4af7345fd785a99437894558fde1db23afec33483fba5cc80a48bf2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42983874e4878d69f6e6611a5498ca3fa8fe69432970430851375a42d7c8380c2a30c3dcdd7a72b867c570b35dcd9c7dcee47236608cff0869fa85ddc20e6fb2
|
7
|
+
data.tar.gz: 4818f542b9c8ff57c1764ab33e54d938777d23c24b78713f45d19cb6b84c55d5705bbe0cdbf907475d81486e9ae917b296b554382ff35fef0dcc72b7aed24719
|
data/HISTORY.rdoc
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
= RELEASE HISTORY
|
2
2
|
|
3
|
+
== Unreleased
|
4
|
+
|
5
|
+
== 1.9.0 / 2021-09-17
|
6
|
+
|
7
|
+
* Drop support for Ruby 2.3 and 2.4
|
8
|
+
* Officially support Ruby 2.7 and 3.0
|
9
|
+
* Update development dependencies
|
10
|
+
* Improve code quality
|
11
|
+
|
3
12
|
== 1.8.0 / 2018-12-29
|
4
13
|
|
5
14
|
* Officially support CRuby 2.5 and 2.6
|
data/README.md
CHANGED
@@ -5,9 +5,6 @@
|
|
5
5
|
* [Source Code](http://github.com/rubyworks/dnote)
|
6
6
|
|
7
7
|
[![Gem Version](https://badge.fury.io/rb/mvz-dnote.svg)](https://badge.fury.io/rb/mvz-dnote)
|
8
|
-
[![Build Status](https://travis-ci.org/mvz/mvz-dnote.svg?branch=master)](https://travis-ci.org/mvz/mvz-dnote)
|
9
|
-
[![Coverage Status](https://coveralls.io/repos/github/mvz/mvz-dnote/badge.svg?branch=master)](https://coveralls.io/github/mvz/mvz-dnote?branch=master)
|
10
|
-
[![Dependency Status](https://gemnasium.com/badges/github.com/mvz/mvz-dnote.svg)](https://gemnasium.com/github.com/mvz/mvz-dnote)
|
11
8
|
[![Maintainability](https://api.codeclimate.com/v1/badges/608621bbad5de3a98e3b/maintainability)](https://codeclimate.com/github/mvz/dnote/maintainability)
|
12
9
|
|
13
10
|
## DESCRIPTION
|
data/bin/dnote
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
4
|
+
require "dnote"
|
5
5
|
|
6
6
|
begin
|
7
7
|
DNote::Session.main(*ARGV)
|
8
|
-
rescue StandardError =>
|
9
|
-
raise
|
8
|
+
rescue StandardError => e
|
9
|
+
raise e if $DEBUG
|
10
10
|
|
11
|
-
puts
|
11
|
+
puts e
|
12
12
|
exit 1
|
13
13
|
end
|
data/lib/dnote/core_ext.rb
CHANGED
data/lib/dnote/format.rb
CHANGED
@@ -9,35 +9,27 @@ module DNote
|
|
9
9
|
# TODO: Need XSL?
|
10
10
|
#++
|
11
11
|
class Format
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
|
17
|
-
EXTENSIONS = {
|
18
|
-
|
19
|
-
attr_reader :notes
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def initialize(notes, options = {})
|
34
|
-
@notes = notes
|
35
|
-
@format = 'text'
|
36
|
-
@subtype = 'label'
|
37
|
-
@title = "Developer's Notes"
|
38
|
-
@dryrun = false
|
39
|
-
options.each { |k, v| __send__("#{k}=", v) if v }
|
40
|
-
yield(self) if block_given?
|
12
|
+
require "fileutils"
|
13
|
+
require "erb"
|
14
|
+
require "rexml/text"
|
15
|
+
require "dnote/core_ext"
|
16
|
+
|
17
|
+
EXTENSIONS = { "text" => "txt", "soap" => "xml", "xoxo" => "xml" }.freeze
|
18
|
+
|
19
|
+
attr_reader :notes, :format, :output, :template, :title, :dryrun
|
20
|
+
|
21
|
+
def initialize(notes,
|
22
|
+
format: "text",
|
23
|
+
title: "Developer's Notes",
|
24
|
+
template: nil,
|
25
|
+
output: nil,
|
26
|
+
dryrun: false)
|
27
|
+
@notes = notes
|
28
|
+
@format = format
|
29
|
+
@title = title
|
30
|
+
@dryrun = dryrun
|
31
|
+
@template = template
|
32
|
+
@output = output
|
41
33
|
end
|
42
34
|
|
43
35
|
def render
|
@@ -45,7 +37,7 @@ module DNote
|
|
45
37
|
$stderr << "No #{notes.labels.join(', ')} notes.\n"
|
46
38
|
else
|
47
39
|
case format
|
48
|
-
when
|
40
|
+
when "custom"
|
49
41
|
render_custom
|
50
42
|
else
|
51
43
|
render_template
|
@@ -53,6 +45,8 @@ module DNote
|
|
53
45
|
end
|
54
46
|
end
|
55
47
|
|
48
|
+
private
|
49
|
+
|
56
50
|
# C U S T O M
|
57
51
|
|
58
52
|
def render_custom
|
@@ -63,15 +57,13 @@ module DNote
|
|
63
57
|
# T E M P L A T E
|
64
58
|
|
65
59
|
def render_template
|
66
|
-
template = File.join(File.dirname(__FILE__),
|
60
|
+
template = File.join(File.dirname(__FILE__), "templates", "#{format}.erb")
|
67
61
|
raise "No such format - #{format}" unless File.exist?(template)
|
68
62
|
|
69
63
|
result = erb(template)
|
70
64
|
publish(result)
|
71
65
|
end
|
72
66
|
|
73
|
-
private
|
74
|
-
|
75
67
|
def erb(file)
|
76
68
|
scope = ErbScope.new(notes: notes, title: title)
|
77
69
|
scope.render(file)
|
@@ -83,12 +75,12 @@ module DNote
|
|
83
75
|
else
|
84
76
|
puts(result)
|
85
77
|
end
|
86
|
-
$stderr <<
|
78
|
+
$stderr << "(#{notes.counts.map { |l, n| "#{n} #{l}s" }.join(', ')})\n"
|
87
79
|
end
|
88
80
|
|
89
81
|
def write(result, fname = nil)
|
90
|
-
if output.to_s[-1, 1] ==
|
91
|
-
fmt = format.split(
|
82
|
+
if output.to_s[-1, 1] == "/" || File.directory?(output)
|
83
|
+
fmt = format.split("/").first
|
92
84
|
ext = EXTENSIONS[fmt] || fmt
|
93
85
|
file = File.join(output, fname || "notes.#{ext}")
|
94
86
|
else
|
@@ -100,7 +92,7 @@ module DNote
|
|
100
92
|
else
|
101
93
|
dir = File.dirname(file)
|
102
94
|
fu.mkdir(dir) unless File.exist?(dir)
|
103
|
-
File.open(file,
|
95
|
+
File.open(file, "w") { |f| f << result }
|
104
96
|
end
|
105
97
|
file
|
106
98
|
end
|
@@ -114,7 +106,7 @@ module DNote
|
|
114
106
|
end
|
115
107
|
|
116
108
|
def fu
|
117
|
-
@fu ||=
|
109
|
+
@fu ||=
|
118
110
|
if dryrun? && debug?
|
119
111
|
FileUtils::DryRun
|
120
112
|
elsif dryrun?
|
@@ -124,7 +116,6 @@ module DNote
|
|
124
116
|
else
|
125
117
|
FileUtils
|
126
118
|
end
|
127
|
-
end
|
128
119
|
end
|
129
120
|
|
130
121
|
# Evaluation scope for ERB templates
|
@@ -134,7 +125,12 @@ module DNote
|
|
134
125
|
end
|
135
126
|
|
136
127
|
def render(file)
|
137
|
-
|
128
|
+
contents = File.read(file)
|
129
|
+
erb = if RUBY_VERSION >= "2.6"
|
130
|
+
ERB.new(contents, trim_mode: "<>")
|
131
|
+
else
|
132
|
+
ERB.new(contents, nil, "<>")
|
133
|
+
end
|
138
134
|
erb.result(binding)
|
139
135
|
end
|
140
136
|
|
@@ -150,7 +146,7 @@ module DNote
|
|
150
146
|
end
|
151
147
|
|
152
148
|
def respond_to_missing?(method)
|
153
|
-
@data.key?
|
149
|
+
@data.key?(method.to_sym) || super
|
154
150
|
end
|
155
151
|
end
|
156
152
|
end
|
data/lib/dnote/note.rb
CHANGED
@@ -31,7 +31,6 @@ module DNote
|
|
31
31
|
# Initialize new Note instance.
|
32
32
|
def initialize(notes, file, label, line, text, mark)
|
33
33
|
@notes = notes
|
34
|
-
|
35
34
|
@file = file
|
36
35
|
@label = label
|
37
36
|
@line = line
|
@@ -52,13 +51,13 @@ module DNote
|
|
52
51
|
|
53
52
|
# Remove newlines from note text.
|
54
53
|
def textline
|
55
|
-
text.tr("\n",
|
54
|
+
text.tr("\n", " ")
|
56
55
|
end
|
57
56
|
|
58
57
|
# Sort by file name and line number.
|
59
58
|
def <=>(other)
|
60
59
|
s = file <=> other.file
|
61
|
-
return s unless s
|
60
|
+
return s unless s == 0
|
62
61
|
|
63
62
|
line <=> other.line
|
64
63
|
end
|
@@ -69,12 +68,12 @@ module DNote
|
|
69
68
|
# TODO: Add +code+? Problem is that xml needs code in CDATA.
|
70
69
|
#++
|
71
70
|
def to_h
|
72
|
-
{
|
71
|
+
{ "label" => label, "text" => textline, "file" => file, "line" => line }
|
73
72
|
end
|
74
73
|
|
75
74
|
# Convert to Hash, leaving the note text verbatim.
|
76
75
|
def to_h_raw
|
77
|
-
{
|
76
|
+
{ "label" => label, "text" => text, "file" => file, "line" => line, "code" => code }
|
78
77
|
end
|
79
78
|
|
80
79
|
# Convert to JSON.
|
@@ -89,6 +88,8 @@ module DNote
|
|
89
88
|
|
90
89
|
# Return line URL based on URL template. If no template was set, then
|
91
90
|
# returns the file.
|
91
|
+
#
|
92
|
+
# FIXME: Move out of Note so we can drop the reference to notes
|
92
93
|
def url
|
93
94
|
if notes.url
|
94
95
|
format(notes.url, file, line)
|
@@ -112,13 +113,13 @@ module DNote
|
|
112
113
|
def unindent(lines)
|
113
114
|
dents = []
|
114
115
|
lines.each do |line|
|
115
|
-
if (md = /^(
|
116
|
+
if (md = /^(\ *)/.match(line))
|
116
117
|
dents << md[1]
|
117
118
|
end
|
118
119
|
end
|
119
120
|
dent = dents.min_by(&:size)
|
120
121
|
lines.map do |line|
|
121
|
-
line.sub(dent,
|
122
|
+
line.sub(dent, "")
|
122
123
|
end
|
123
124
|
end
|
124
125
|
end
|
data/lib/dnote/notes.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "pathname"
|
4
|
+
require "dnote/note"
|
5
|
+
require "dnote/notes_collection"
|
5
6
|
|
6
7
|
module DNote
|
7
8
|
# = Developer Notes
|
@@ -18,31 +19,29 @@ module DNote
|
|
18
19
|
# have a outline format, rather then the single line.
|
19
20
|
#++
|
20
21
|
class Notes
|
21
|
-
include Enumerable
|
22
|
-
|
23
22
|
# Default paths (all ruby scripts).
|
24
|
-
DEFAULT_PATHS = [
|
23
|
+
DEFAULT_PATHS = ["**/*.rb"].freeze
|
25
24
|
|
26
25
|
# Default note labels to look for in source code. (NOT CURRENTLY USED!)
|
27
26
|
DEFAULT_LABELS = %w(TODO FIXME OPTIMIZE THINK DEPRECATE).freeze
|
28
27
|
|
29
28
|
# Files to search for notes.
|
30
|
-
|
29
|
+
attr_reader :files
|
31
30
|
|
32
31
|
# Labels to document. Defaults are: +TODO+, +FIXME+, +OPTIMIZE+ and +DEPRECATE+.
|
33
|
-
|
32
|
+
attr_reader :labels
|
34
33
|
|
35
34
|
# Require label colon? Default is +true+.
|
36
|
-
|
35
|
+
attr_reader :colon
|
37
36
|
|
38
37
|
# Specific remark marker (+nil+ for auto).
|
39
|
-
|
38
|
+
attr_reader :marker
|
40
39
|
|
41
40
|
# Link template.
|
42
|
-
|
41
|
+
attr_reader :url
|
43
42
|
|
44
43
|
# Number of lines of context to show.
|
45
|
-
|
44
|
+
attr_reader :context
|
46
45
|
|
47
46
|
# New set of notes for give +files+ and optional special labels.
|
48
47
|
def initialize(files, options = {})
|
@@ -52,34 +51,13 @@ module DNote
|
|
52
51
|
@marker = options[:marker]
|
53
52
|
@url = options[:url]
|
54
53
|
@context = options[:context] || 0
|
55
|
-
|
56
54
|
@remark = {}
|
57
55
|
|
58
56
|
parse
|
59
57
|
end
|
60
58
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
# Notes counts by label.
|
65
|
-
def counts
|
66
|
-
@counts ||= begin
|
67
|
-
h = {}
|
68
|
-
by_label.each do |label, notes|
|
69
|
-
h[label] = notes.size
|
70
|
-
end
|
71
|
-
h
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# Iterate through notes.
|
76
|
-
def each(&block)
|
77
|
-
notes.each(&block)
|
78
|
-
end
|
79
|
-
|
80
|
-
# No notes?
|
81
|
-
def empty?
|
82
|
-
notes.empty?
|
59
|
+
def notes_collection
|
60
|
+
@notes_collection ||= NotesCollection.new(@notes)
|
83
61
|
end
|
84
62
|
|
85
63
|
# Gather notes.
|
@@ -89,42 +67,45 @@ module DNote
|
|
89
67
|
def parse
|
90
68
|
records = []
|
91
69
|
files.each do |fname|
|
92
|
-
|
70
|
+
records += parse_file(fname)
|
71
|
+
end
|
93
72
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
73
|
+
@notes = records.sort
|
74
|
+
end
|
75
|
+
|
76
|
+
def parse_file(fname)
|
77
|
+
return [] unless File.file?(fname)
|
78
|
+
|
79
|
+
records = []
|
80
|
+
mark = remark(fname)
|
81
|
+
lineno = 0
|
82
|
+
note = nil
|
83
|
+
text = nil
|
84
|
+
capt = nil
|
85
|
+
File.readlines(fname).each do |line|
|
86
|
+
lineno += 1
|
87
|
+
note = match(line, lineno, fname)
|
88
|
+
if note
|
89
|
+
text = note.text
|
90
|
+
capt = note.capture
|
91
|
+
records << note
|
92
|
+
elsif text
|
93
|
+
case line
|
94
|
+
when /^\s*#{mark}+\s*$/, /^\s*#{mark}--/, /^\s*#{mark}\+\+/
|
95
|
+
text.strip!
|
96
|
+
text = nil
|
97
|
+
when /^\s*#{mark}/
|
98
|
+
text << "\n" unless text[-1, 1] == "\n"
|
99
|
+
text << line.gsub(/^\s*#{mark}\s*/, "")
|
100
|
+
else
|
101
|
+
text.strip!
|
102
|
+
text = nil
|
123
103
|
end
|
104
|
+
elsif !/^\s*#{mark}/.match?(line)
|
105
|
+
capt << line if capt && capt.size < context
|
124
106
|
end
|
125
107
|
end
|
126
|
-
|
127
|
-
@notes = records.sort
|
108
|
+
records
|
128
109
|
end
|
129
110
|
|
130
111
|
# Is this line a note?
|
@@ -148,15 +129,13 @@ module DNote
|
|
148
129
|
rec
|
149
130
|
end
|
150
131
|
|
151
|
-
#--
|
152
|
-
# TODO: ruby-1.9.1-p378 reports: `match': invalid byte sequence in UTF-8
|
153
|
-
#++
|
154
132
|
def match_special_regex(label, file)
|
155
133
|
mark = remark(file)
|
134
|
+
label = Regexp.escape(label)
|
156
135
|
if colon
|
157
|
-
/#{mark}\s*#{
|
136
|
+
/#{mark}\s*#{label}:\s+(.*?)$/
|
158
137
|
else
|
159
|
-
/#{mark}\s*#{
|
138
|
+
/#{mark}\s*#{label}:?\s+(.*?)$/
|
160
139
|
end
|
161
140
|
end
|
162
141
|
|
@@ -176,83 +155,18 @@ module DNote
|
|
176
155
|
def match_general_regex(file)
|
177
156
|
mark = remark(file)
|
178
157
|
if colon
|
179
|
-
/#{mark}\s*([A-Z]+)
|
158
|
+
/#{mark}\s*([A-Z]+):\s+(.*?)$/
|
180
159
|
else
|
181
160
|
/#{mark}\s*([A-Z]+)\s+(.*?)$/
|
182
161
|
end
|
183
162
|
end
|
184
163
|
|
185
|
-
# Organize notes into a hash with labels for keys.
|
186
|
-
def by_label
|
187
|
-
@by_label ||= begin
|
188
|
-
list = {}
|
189
|
-
notes.each do |note|
|
190
|
-
list[note.label] ||= []
|
191
|
-
list[note.label] << note
|
192
|
-
list[note.label].sort
|
193
|
-
end
|
194
|
-
list
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
# Organize notes into a hash with filename for keys.
|
199
|
-
def by_file
|
200
|
-
@by_file ||= begin
|
201
|
-
list = {}
|
202
|
-
notes.each do |note|
|
203
|
-
list[note.file] ||= []
|
204
|
-
list[note.file] << note
|
205
|
-
list[note.file].sort!
|
206
|
-
end
|
207
|
-
list
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
# Organize notes into a hash with labels for keys, followed
|
212
|
-
# by a hash with filename for keys.
|
213
|
-
def by_label_file
|
214
|
-
@by_label_file ||= begin
|
215
|
-
list = {}
|
216
|
-
notes.each do |note|
|
217
|
-
list[note.label] ||= {}
|
218
|
-
list[note.label][note.file] ||= []
|
219
|
-
list[note.label][note.file] << note
|
220
|
-
list[note.label][note.file].sort!
|
221
|
-
end
|
222
|
-
list
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
# Organize notes into a hash with filenames for keys, followed
|
227
|
-
# by a hash with labels for keys.
|
228
|
-
def by_file_label
|
229
|
-
@by_file_label ||= begin
|
230
|
-
list = {}
|
231
|
-
notes.each do |note|
|
232
|
-
list[note.file] ||= {}
|
233
|
-
list[note.file][note.label] ||= []
|
234
|
-
list[note.file][note.label] << note
|
235
|
-
list[note.file][note.label].sort!
|
236
|
-
end
|
237
|
-
list
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
# Convert to an array of hashes.
|
242
|
-
def to_a
|
243
|
-
notes.map(&:to_h)
|
244
|
-
end
|
245
|
-
|
246
|
-
# Same as #by_label.
|
247
|
-
def to_h
|
248
|
-
by_label
|
249
|
-
end
|
250
|
-
|
251
164
|
def remark(file)
|
252
|
-
@remark[File.extname(file)] ||=
|
253
|
-
|
254
|
-
|
255
|
-
|
165
|
+
@remark[File.extname(file)] ||=
|
166
|
+
begin
|
167
|
+
mark = guess_marker(file)
|
168
|
+
Regexp.escape(mark)
|
169
|
+
end
|
256
170
|
end
|
257
171
|
|
258
172
|
# Guess marker based on file extension. Fallsback to '#'
|
@@ -263,16 +177,16 @@ module DNote
|
|
263
177
|
return @marker if @marker # forced marker
|
264
178
|
|
265
179
|
case File.extname(file)
|
266
|
-
when
|
267
|
-
|
268
|
-
when
|
180
|
+
when ".js", ".c", "cpp", ".css"
|
181
|
+
"//"
|
182
|
+
when ".bas"
|
269
183
|
"'"
|
270
|
-
when
|
271
|
-
|
272
|
-
when
|
273
|
-
|
184
|
+
when ".sql", ".ada"
|
185
|
+
"--"
|
186
|
+
when ".asm"
|
187
|
+
";"
|
274
188
|
else
|
275
|
-
|
189
|
+
"#"
|
276
190
|
end
|
277
191
|
end
|
278
192
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DNote
|
4
|
+
# = Notes Collection
|
5
|
+
#
|
6
|
+
# This class contains a collection of Note objects and can group them in
|
7
|
+
# several ways.
|
8
|
+
#
|
9
|
+
class NotesCollection
|
10
|
+
include Enumerable
|
11
|
+
|
12
|
+
def initialize(notes)
|
13
|
+
@notes = notes
|
14
|
+
end
|
15
|
+
|
16
|
+
# Array of notes.
|
17
|
+
attr_reader :notes
|
18
|
+
|
19
|
+
# Notes counts by label.
|
20
|
+
def counts
|
21
|
+
@counts ||=
|
22
|
+
begin
|
23
|
+
h = {}
|
24
|
+
by_label.each do |label, notes|
|
25
|
+
h[label] = notes.size
|
26
|
+
end
|
27
|
+
h
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Iterate through notes.
|
32
|
+
def each(&block)
|
33
|
+
notes.each(&block)
|
34
|
+
end
|
35
|
+
|
36
|
+
# No notes?
|
37
|
+
def empty?
|
38
|
+
notes.empty?
|
39
|
+
end
|
40
|
+
|
41
|
+
# Organize notes into a hash with labels for keys.
|
42
|
+
def by_label
|
43
|
+
@by_label ||= notes.group_by(&:label)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Organize notes into a hash with filename for keys.
|
47
|
+
def by_file
|
48
|
+
@by_file ||= notes.group_by(&:file)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Organize notes into a hash with labels for keys, followed
|
52
|
+
# by a hash with filename for keys.
|
53
|
+
def by_label_file
|
54
|
+
@by_label_file ||= by_label.transform_values { |notes| notes.group_by(&:file) }
|
55
|
+
end
|
56
|
+
|
57
|
+
# Organize notes into a hash with filenames for keys, followed
|
58
|
+
# by a hash with labels for keys.
|
59
|
+
def by_file_label
|
60
|
+
@by_file_label ||= by_file.transform_values { |notes| notes.group_by(&:label) }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Convert to an array of hashes.
|
64
|
+
def to_a
|
65
|
+
notes.map(&:to_h)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Same as #by_label.
|
69
|
+
def to_h
|
70
|
+
by_label
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dnote/core_ext"
|
4
|
+
require "dnote/notes"
|
5
|
+
require "dnote/format"
|
6
|
+
require "optparse"
|
7
|
+
|
8
|
+
module DNote
|
9
|
+
# Option parser
|
10
|
+
class Options
|
11
|
+
def self.parse(*argv)
|
12
|
+
new(argv).parse
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(argv)
|
16
|
+
@argv = argv
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
session = Session.new
|
21
|
+
|
22
|
+
opts = OptionParser.new do |opt|
|
23
|
+
opt.banner = "DNote v#{DNote::VERSION}"
|
24
|
+
|
25
|
+
opt.separator(" ")
|
26
|
+
opt.separator("USAGE:\n dnote [OPTIONS] path1 [path2 ...]")
|
27
|
+
|
28
|
+
add_output_format_options(session, opt)
|
29
|
+
add_other_options(session, opt)
|
30
|
+
add_command_options(session, opt)
|
31
|
+
end
|
32
|
+
|
33
|
+
opts.parse!(@argv)
|
34
|
+
session.paths.replace(@argv)
|
35
|
+
session
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_command_options(session, opt)
|
39
|
+
opt.separator(" ")
|
40
|
+
opt.separator("COMMAND OPTIONS:")
|
41
|
+
|
42
|
+
opt.on_tail("--templates", "-T", "list available format templates") do
|
43
|
+
session.list_templates
|
44
|
+
exit
|
45
|
+
end
|
46
|
+
|
47
|
+
opt.on_tail("--help", "-h", "show this help information") do
|
48
|
+
puts opt
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_output_format_options(session, opt)
|
54
|
+
opt.separator(" ")
|
55
|
+
opt.separator("OUTPUT FORMAT: (choose one)")
|
56
|
+
|
57
|
+
opt.on("--format", "-f NAME", "select a format [text]") do |format|
|
58
|
+
session.format = format
|
59
|
+
end
|
60
|
+
|
61
|
+
opt.on("--custom", "-C FILE", "use a custom ERB template") do |file|
|
62
|
+
session.format = "custom"
|
63
|
+
session.template = file
|
64
|
+
end
|
65
|
+
|
66
|
+
opt.on("--file", "shortcut for text/file format") do
|
67
|
+
session.format = "text/file"
|
68
|
+
end
|
69
|
+
|
70
|
+
opt.on("--list", "shortcut for text/list format") do
|
71
|
+
session.format = "text/list"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def add_other_options(session, opt)
|
76
|
+
opt.separator(" ")
|
77
|
+
opt.separator("OTHER OPTIONS:")
|
78
|
+
|
79
|
+
opt.on("--label", "-l LABEL", "labels to collect") do |lbl|
|
80
|
+
session.labels.concat(lbl.split(":"))
|
81
|
+
end
|
82
|
+
|
83
|
+
opt.on(:colon, "--[no-]colon", "match labels with/without colon suffix") do |val|
|
84
|
+
session.colon = val
|
85
|
+
end
|
86
|
+
|
87
|
+
opt.on("--marker", "-m MARK", "alternative remark marker") do |mark|
|
88
|
+
session.marker = mark
|
89
|
+
end
|
90
|
+
|
91
|
+
opt.on("--url", "-u TEMPLATE", "url template for line entries (for HTML)") do |url|
|
92
|
+
session.url = url
|
93
|
+
end
|
94
|
+
|
95
|
+
opt.on("--context", "-c INTEGER", "number of lines of context to display") do |int|
|
96
|
+
session.context = int.to_i
|
97
|
+
end
|
98
|
+
|
99
|
+
opt.on("--exclude", "-x PATH", "exclude file or directory") do |path|
|
100
|
+
session.exclude << path
|
101
|
+
end
|
102
|
+
|
103
|
+
opt.on("--ignore", "-i NAME", "ignore file based on any part of pathname") do |name|
|
104
|
+
session.ignore << name
|
105
|
+
end
|
106
|
+
|
107
|
+
opt.on("--title", "-t TITLE", "title to use in header") do |title|
|
108
|
+
session.title = title
|
109
|
+
end
|
110
|
+
|
111
|
+
opt.on("--output", "-o PATH", "save to file or directory") do |path|
|
112
|
+
session.output = path
|
113
|
+
end
|
114
|
+
|
115
|
+
opt.on("--dryrun", "-n", "do not actually write to disk") do
|
116
|
+
session.dryrun = true
|
117
|
+
end
|
118
|
+
|
119
|
+
opt.on("--debug", "debug mode") do
|
120
|
+
$DEBUG = true
|
121
|
+
$VERBOSE = true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/lib/dnote/rake/dnotetask.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "rspec/core/rake_task"
|
4
4
|
|
5
5
|
module DNote
|
6
6
|
# = Developmer's Notes Rake Task
|
7
7
|
#
|
8
8
|
class RakeTask < Rake::TaskLib
|
9
|
-
require
|
9
|
+
require "rake/clean"
|
10
10
|
|
11
11
|
# Default note labels to looked for in source code.
|
12
12
|
DEFAULT_LABELS = %w(TODO FIXME OPTIMIZE DEPRECATE).freeze
|
@@ -38,30 +38,47 @@ module DNote
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def init
|
41
|
-
require
|
42
|
-
require
|
43
|
-
@files =
|
44
|
-
@output =
|
45
|
-
@formats = [
|
41
|
+
require "dnote"
|
42
|
+
require "dnote/format"
|
43
|
+
@files = "**/*.rb"
|
44
|
+
@output = "log/dnote"
|
45
|
+
@formats = ["index"]
|
46
46
|
@labels = nil
|
47
47
|
end
|
48
48
|
|
49
49
|
def define
|
50
50
|
desc "Collect Developer's Notes"
|
51
|
-
task
|
51
|
+
task "dnote" do
|
52
52
|
document
|
53
53
|
end
|
54
|
-
task
|
54
|
+
task "dnote:clobber" do
|
55
55
|
clean
|
56
56
|
end
|
57
|
-
task clobber: [
|
57
|
+
task clobber: ["dnote:clobber"]
|
58
58
|
end
|
59
59
|
|
60
60
|
# Generate notes document(s).
|
61
61
|
def document
|
62
62
|
abort "dnote: #{output} is not a directory" unless output.directory?
|
63
63
|
|
64
|
-
session =
|
64
|
+
session = new_session
|
65
|
+
|
66
|
+
formats.each do |format|
|
67
|
+
generate_document_for_format(session, format)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Remove output files.
|
72
|
+
def clean
|
73
|
+
formats.each do |format|
|
74
|
+
clean_format format
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def new_session
|
81
|
+
::DNote::Session.new do |s|
|
65
82
|
s.paths = files
|
66
83
|
s.exclude = exclude
|
67
84
|
s.ignore = ignore
|
@@ -70,31 +87,28 @@ module DNote
|
|
70
87
|
s.output = output
|
71
88
|
s.dryrun = application.options.dryrun # trial?
|
72
89
|
end
|
90
|
+
end
|
73
91
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
session.run
|
82
|
-
report "Updated #{output.to_s.sub(Dir.pwd + '/', '')}" unless trial?
|
92
|
+
def generate_document_for_format(session, format)
|
93
|
+
if format == "index"
|
94
|
+
session.format = "html"
|
95
|
+
session.output = File.join(output, "index.html")
|
96
|
+
else
|
97
|
+
session.format = format
|
83
98
|
end
|
99
|
+
session.run
|
100
|
+
report "Updated #{output.to_s.sub("#{Dir.pwd}/", '')}" unless trial?
|
84
101
|
end
|
85
102
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
ext = ::DNote::Format::EXTENSIONS[format] || format
|
93
|
-
file = (output + "notes.#{ext}").to_s
|
94
|
-
end
|
95
|
-
rm(file)
|
96
|
-
report "Removed #{output}"
|
103
|
+
def clean_format(format)
|
104
|
+
if format == "index"
|
105
|
+
file = "#{output}index.html".to_s
|
106
|
+
else
|
107
|
+
ext = ::DNote::Format::EXTENSIONS[format] || format
|
108
|
+
file = (output + "notes.#{ext}").to_s
|
97
109
|
end
|
110
|
+
rm(file)
|
111
|
+
report "Removed #{output}"
|
98
112
|
end
|
99
113
|
end
|
100
114
|
end
|
data/lib/dnote/session.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "dnote/core_ext"
|
4
|
+
require "dnote/notes"
|
5
|
+
require "dnote/format"
|
6
|
+
require "dnote/options"
|
6
7
|
|
7
8
|
module DNote
|
8
9
|
# User session which is used by commandline interface.
|
@@ -17,7 +18,7 @@ module DNote
|
|
17
18
|
DIR = File.dirname(__FILE__)
|
18
19
|
|
19
20
|
# Default format.
|
20
|
-
DEFAULT_FORMAT =
|
21
|
+
DEFAULT_FORMAT = "text"
|
21
22
|
|
22
23
|
# Default title.
|
23
24
|
DEFAULT_TITLE = "Developer's Notes"
|
@@ -105,13 +106,18 @@ module DNote
|
|
105
106
|
|
106
107
|
# Run session.
|
107
108
|
def run
|
108
|
-
notes = Notes.new(files,
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
109
|
+
notes = Notes.new(files,
|
110
|
+
labels: labels,
|
111
|
+
colon: colon,
|
112
|
+
marker: marker,
|
113
|
+
url: url,
|
114
|
+
context: context)
|
115
|
+
collection = notes.notes_collection
|
116
|
+
formatter = Format.new(collection,
|
117
|
+
format: format,
|
118
|
+
template: template,
|
119
|
+
title: title,
|
120
|
+
output: output)
|
115
121
|
formatter.render
|
116
122
|
end
|
117
123
|
|
@@ -120,11 +126,11 @@ module DNote
|
|
120
126
|
# compile the list of files.
|
121
127
|
def files
|
122
128
|
list = [paths].flatten.compact
|
123
|
-
list = [
|
129
|
+
list = ["**/*.rb"] if list.empty?
|
124
130
|
list = glob(list)
|
125
131
|
list -= glob(exclude)
|
126
132
|
list.reject do |path|
|
127
|
-
path.split(
|
133
|
+
path.split("/").any? { |part| ignore.any? { |ig| File.fnmatch?(ig, part) } }
|
128
134
|
end
|
129
135
|
end
|
130
136
|
|
@@ -133,115 +139,27 @@ module DNote
|
|
133
139
|
def glob(paths)
|
134
140
|
paths.map do |path|
|
135
141
|
if File.directory?(path)
|
136
|
-
Dir.glob(File.join(path,
|
142
|
+
Dir.glob(File.join(path, "**/*"))
|
137
143
|
else
|
138
144
|
Dir.glob(path)
|
139
145
|
end
|
140
146
|
end.flatten.uniq
|
141
147
|
end
|
142
148
|
|
143
|
-
#
|
144
|
-
def
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
opt.separator(' ')
|
153
|
-
opt.separator("USAGE:\n dnote [OPTIONS] path1 [path2 ...]")
|
154
|
-
|
155
|
-
opt.separator(' ')
|
156
|
-
opt.separator('OUTPUT FORMAT: (choose one)')
|
157
|
-
|
158
|
-
opt.on('--format', '-f NAME', 'select a format [text]') do |format|
|
159
|
-
session.format = format
|
160
|
-
end
|
161
|
-
|
162
|
-
opt.on('--custom', '-C FILE', 'use a custom ERB template') do |file|
|
163
|
-
session.format = 'custom'
|
164
|
-
session.template = file
|
165
|
-
end
|
166
|
-
|
167
|
-
opt.on('--file', 'shortcut for text/file format') do
|
168
|
-
session.format = 'text/file'
|
169
|
-
end
|
170
|
-
|
171
|
-
opt.on('--list', 'shortcut for text/list format') do
|
172
|
-
session.format = 'text/list'
|
173
|
-
end
|
174
|
-
|
175
|
-
opt.separator(' ')
|
176
|
-
opt.separator('OTHER OPTIONS:')
|
177
|
-
|
178
|
-
opt.on('--label', '-l LABEL', 'labels to collect') do |lbl|
|
179
|
-
session.labels.concat(lbl.split(':'))
|
180
|
-
end
|
181
|
-
|
182
|
-
opt.on('--[no-]colon', 'match labels with/without colon suffix') do |val|
|
183
|
-
session.colon = val
|
184
|
-
end
|
185
|
-
|
186
|
-
opt.on('--marker', '-m MARK', 'alternative remark marker') do |mark|
|
187
|
-
session.marker = mark
|
188
|
-
end
|
189
|
-
|
190
|
-
opt.on('--url', '-u TEMPLATE', 'url template for line entries (for HTML)') do |url|
|
191
|
-
session.url = url
|
192
|
-
end
|
193
|
-
|
194
|
-
opt.on('--context', '-c INTEGER', 'number of lines of context to display') do |int|
|
195
|
-
session.context = int.to_i
|
196
|
-
end
|
197
|
-
|
198
|
-
opt.on('--exclude', '-x PATH', 'exclude file or directory') do |path|
|
199
|
-
session.exclude << path
|
200
|
-
end
|
201
|
-
|
202
|
-
opt.on('--ignore', '-i NAME', 'ignore file based on any part of pathname') do |name|
|
203
|
-
session.ignore << name
|
204
|
-
end
|
205
|
-
|
206
|
-
opt.on('--title', '-t TITLE', 'title to use in header') do |title|
|
207
|
-
session.title = title
|
208
|
-
end
|
209
|
-
|
210
|
-
opt.on('--output', '-o PATH', 'save to file or directory') do |path|
|
211
|
-
session.output = path
|
212
|
-
end
|
213
|
-
|
214
|
-
opt.on('--dryrun', '-n', 'do not actually write to disk') do
|
215
|
-
session.dryrun = true
|
216
|
-
end
|
217
|
-
|
218
|
-
opt.on('--debug', 'debug mode') do
|
219
|
-
$DEBUG = true
|
220
|
-
$VERBOSE = true
|
221
|
-
end
|
222
|
-
|
223
|
-
opt.separator(' ')
|
224
|
-
opt.separator('COMMAND OPTIONS:')
|
225
|
-
|
226
|
-
opt.on_tail('--templates', '-T', 'list available format templates') do
|
227
|
-
tdir = File.join(DIR, 'templates')
|
228
|
-
tfiles = Dir[File.join(tdir, '**/*.erb')]
|
229
|
-
tnames = tfiles.map { |tname| tname.sub(tdir + '/', '').chomp('.erb') }
|
230
|
-
groups = tnames.group_by { |tname| tname.split('/').first }
|
231
|
-
groups.sort.each do |(_type, names)|
|
232
|
-
puts('%-18s ' * names.size % names.sort)
|
233
|
-
end
|
234
|
-
exit
|
235
|
-
end
|
236
|
-
|
237
|
-
opt.on_tail('--help', '-h', 'show this help information') do
|
238
|
-
puts opt
|
239
|
-
exit
|
240
|
-
end
|
149
|
+
# List availble format templates
|
150
|
+
def list_templates
|
151
|
+
tdir = File.join(DIR, "templates")
|
152
|
+
tfiles = Dir[File.join(tdir, "**/*.erb")]
|
153
|
+
tnames = tfiles.map { |tname| tname.sub("#{tdir}/", "").chomp(".erb") }
|
154
|
+
groups = tnames.group_by { |tname| tname.split("/").first }
|
155
|
+
groups.sort.each do |(_type, names)|
|
156
|
+
puts("%-18s " * names.size % names.sort)
|
241
157
|
end
|
158
|
+
end
|
242
159
|
|
243
|
-
|
244
|
-
|
160
|
+
# Commandline interface.
|
161
|
+
def self.main(*argv)
|
162
|
+
session = Options.parse(*argv)
|
245
163
|
session.run
|
246
164
|
end
|
247
165
|
end
|
data/lib/dnote/version.rb
CHANGED
data/lib/dnote.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mvz-dnote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Sawyer
|
8
8
|
- Matijs van Zuijlen
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-09-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aruba
|
@@ -17,42 +17,70 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0
|
20
|
+
version: '2.0'
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0
|
27
|
+
version: '2.0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: cucumber
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '7.0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '7.0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: pry
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.14.0
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.14.0
|
42
56
|
- !ruby/object:Gem::Dependency
|
43
57
|
name: rake
|
44
58
|
requirement: !ruby/object:Gem::Requirement
|
45
59
|
requirements:
|
46
60
|
- - "~>"
|
47
61
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
62
|
+
version: '13.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '13.0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rake-manifest
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.2.0
|
49
77
|
type: :development
|
50
78
|
prerelease: false
|
51
79
|
version_requirements: !ruby/object:Gem::Requirement
|
52
80
|
requirements:
|
53
81
|
- - "~>"
|
54
82
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
83
|
+
version: 0.2.0
|
56
84
|
- !ruby/object:Gem::Dependency
|
57
85
|
name: rspec
|
58
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,23 +95,79 @@ dependencies:
|
|
67
95
|
- - "~>"
|
68
96
|
- !ruby/object:Gem::Version
|
69
97
|
version: '3.5'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rubocop
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 1.21.0
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 1.21.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rubocop-packaging
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.5.0
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.5.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rubocop-performance
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 1.11.0
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 1.11.0
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: rubocop-rspec
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - "~>"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 2.4.0
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - "~>"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: 2.4.0
|
70
154
|
- !ruby/object:Gem::Dependency
|
71
155
|
name: simplecov
|
72
156
|
requirement: !ruby/object:Gem::Requirement
|
73
157
|
requirements:
|
74
158
|
- - "~>"
|
75
159
|
- !ruby/object:Gem::Version
|
76
|
-
version: 0.
|
160
|
+
version: 0.21.0
|
77
161
|
type: :development
|
78
162
|
prerelease: false
|
79
163
|
version_requirements: !ruby/object:Gem::Requirement
|
80
164
|
requirements:
|
81
165
|
- - "~>"
|
82
166
|
- !ruby/object:Gem::Version
|
83
|
-
version: 0.
|
84
|
-
description: |
|
85
|
-
|
86
|
-
|
167
|
+
version: 0.21.0
|
168
|
+
description: |
|
169
|
+
DNote makes it easy to extract developer's notes from source code,
|
170
|
+
and supports almost any language.
|
87
171
|
email:
|
88
172
|
- matijs@matijs.net
|
89
173
|
executables:
|
@@ -103,6 +187,8 @@ files:
|
|
103
187
|
- lib/dnote/format.rb
|
104
188
|
- lib/dnote/note.rb
|
105
189
|
- lib/dnote/notes.rb
|
190
|
+
- lib/dnote/notes_collection.rb
|
191
|
+
- lib/dnote/options.rb
|
106
192
|
- lib/dnote/rake/dnotetask.rb
|
107
193
|
- lib/dnote/session.rb
|
108
194
|
- lib/dnote/templates/html.erb
|
@@ -143,25 +229,31 @@ files:
|
|
143
229
|
- lib/dnote/templates/yaml/list.erb
|
144
230
|
- lib/dnote/version.rb
|
145
231
|
homepage: https://github.com/mvz/dnote
|
146
|
-
licenses:
|
147
|
-
|
148
|
-
|
149
|
-
|
232
|
+
licenses:
|
233
|
+
- BSD-2-Clause
|
234
|
+
metadata:
|
235
|
+
homepage_uri: https://github.com/mvz/dnote
|
236
|
+
source_code_uri: https://github.com/mvz/dnote
|
237
|
+
changelog_uri: https://github.com/mvz/dnote/blob/master/HISTORY.rdoc
|
238
|
+
post_install_message:
|
239
|
+
rdoc_options:
|
240
|
+
- "--main"
|
241
|
+
- README.md
|
150
242
|
require_paths:
|
151
243
|
- lib
|
152
244
|
required_ruby_version: !ruby/object:Gem::Requirement
|
153
245
|
requirements:
|
154
246
|
- - ">="
|
155
247
|
- !ruby/object:Gem::Version
|
156
|
-
version: 2.
|
248
|
+
version: 2.5.0
|
157
249
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
250
|
requirements:
|
159
251
|
- - ">="
|
160
252
|
- !ruby/object:Gem::Version
|
161
253
|
version: '0'
|
162
254
|
requirements: []
|
163
|
-
rubygems_version: 3.
|
164
|
-
signing_key:
|
255
|
+
rubygems_version: 3.2.22
|
256
|
+
signing_key:
|
165
257
|
specification_version: 4
|
166
258
|
summary: Extract developer's notes from source code.
|
167
259
|
test_files: []
|