mvz-dnote 1.7.2 → 1.10.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 +5 -5
- data/HISTORY.rdoc +18 -0
- data/README.md +116 -0
- data/bin/dnote +10 -1
- data/lib/dnote/core_ext.rb +11 -67
- data/lib/dnote/format.rb +59 -83
- data/lib/dnote/note.rb +25 -49
- data/lib/dnote/notes.rb +83 -210
- data/lib/dnote/notes_collection.rb +73 -0
- data/lib/dnote/options.rb +125 -0
- data/lib/dnote/rake/dnotetask.rb +55 -57
- data/lib/dnote/session.rb +49 -152
- data/lib/dnote/version.rb +3 -15
- data/lib/dnote.rb +4 -2
- metadata +128 -26
- data/README.rdoc +0 -113
- data/lib/dnote.yml +0 -1
- data/try/sample.bas +0 -7
- data/try/sample.js +0 -11
- data/try/sample.rb +0 -11
data/lib/dnote/rake/dnotetask.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rspec/core/rake_task"
|
2
4
|
|
5
|
+
module DNote
|
3
6
|
# = Developmer's Notes Rake Task
|
4
7
|
#
|
5
8
|
class RakeTask < Rake::TaskLib
|
6
|
-
|
7
|
-
require 'rake/clean'
|
9
|
+
require "rake/clean"
|
8
10
|
|
9
11
|
# Default note labels to looked for in source code.
|
10
|
-
DEFAULT_LABELS = [
|
12
|
+
DEFAULT_LABELS = %w[TODO FIXME OPTIMIZE DEPRECATE].freeze
|
11
13
|
|
12
14
|
# File paths to search.
|
13
15
|
attr_accessor :files
|
@@ -26,91 +28,87 @@ module DNote
|
|
26
28
|
|
27
29
|
# Output directory to save notes file. Defaults to <tt>dnote/</tt> under
|
28
30
|
# the project log directory (eg. <tt>log/dnote/</tt>).
|
29
|
-
|
31
|
+
attr_reader :output
|
30
32
|
|
31
33
|
# Title to use if temaplte can use it.
|
32
34
|
attr_accessor :title
|
33
35
|
|
34
|
-
#
|
35
36
|
def output=(path)
|
36
37
|
@output = Pathname.new(path)
|
37
38
|
end
|
38
39
|
|
39
|
-
#
|
40
40
|
def init
|
41
|
-
require
|
42
|
-
require
|
43
|
-
@files
|
44
|
-
@output
|
45
|
-
@formats = [
|
46
|
-
@labels
|
41
|
+
require "dnote"
|
42
|
+
require "dnote/format"
|
43
|
+
@files = "**/*.rb"
|
44
|
+
@output = "log/dnote"
|
45
|
+
@formats = ["index"]
|
46
|
+
@labels = nil
|
47
47
|
end
|
48
48
|
|
49
|
-
#
|
50
49
|
def define
|
51
50
|
desc "Collect Developer's Notes"
|
52
|
-
task
|
51
|
+
task "dnote" do
|
53
52
|
document
|
54
53
|
end
|
55
|
-
task
|
54
|
+
task "dnote:clobber" do
|
56
55
|
clean
|
57
56
|
end
|
58
|
-
task :
|
57
|
+
task clobber: ["dnote:clobber"]
|
59
58
|
end
|
60
59
|
|
61
60
|
# Generate notes document(s).
|
62
61
|
def document
|
63
62
|
abort "dnote: #{output} is not a directory" unless output.directory?
|
64
63
|
|
65
|
-
session =
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
s.labels = labels #|| DEFAULT_LABELS
|
70
|
-
s.title = title
|
71
|
-
s.output = output
|
72
|
-
s.dryrun = application.options.dryrun #trial?
|
64
|
+
session = new_session
|
65
|
+
|
66
|
+
formats.each do |format|
|
67
|
+
generate_document_for_format(session, format)
|
73
68
|
end
|
69
|
+
end
|
74
70
|
|
71
|
+
# Remove output files.
|
72
|
+
def clean
|
75
73
|
formats.each do |format|
|
76
|
-
|
77
|
-
session.format = 'html'
|
78
|
-
session.output = File.join(self.output, 'index.html')
|
79
|
-
else
|
80
|
-
session.format = format
|
81
|
-
end
|
82
|
-
session.run
|
83
|
-
report "Updated #{output.to_s.sub(Dir.pwd+'/','')}" unless trial?
|
74
|
+
clean_format format
|
84
75
|
end
|
85
76
|
end
|
86
77
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
78
|
+
private
|
79
|
+
|
80
|
+
def new_session
|
81
|
+
::DNote::Session.new do |s|
|
82
|
+
s.paths = files
|
83
|
+
s.exclude = exclude
|
84
|
+
s.ignore = ignore
|
85
|
+
s.labels = labels
|
86
|
+
s.title = title
|
87
|
+
s.output = output
|
88
|
+
s.dryrun = application.options.dryrun # trial?
|
89
|
+
end
|
93
90
|
end
|
94
91
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
end
|
105
|
-
rm(file)
|
106
|
-
report "Removed #{output}"
|
107
|
-
end
|
108
|
-
#else
|
109
|
-
# rm(output)
|
110
|
-
# report "Removed #{output}"
|
111
|
-
#end
|
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
|
98
|
+
end
|
99
|
+
session.run
|
100
|
+
report "Updated #{output.to_s.sub("#{Dir.pwd}/", "")}" unless trial?
|
112
101
|
end
|
113
102
|
|
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
|
109
|
+
end
|
110
|
+
rm(file)
|
111
|
+
report "Removed #{output}"
|
112
|
+
end
|
114
113
|
end
|
115
|
-
|
116
114
|
end
|
data/lib/dnote/session.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require "dnote/core_ext"
|
4
|
+
require "dnote/notes"
|
5
|
+
require "dnote/format"
|
6
|
+
require "dnote/options"
|
6
7
|
|
8
|
+
module DNote
|
7
9
|
# User session which is used by commandline interface.
|
8
10
|
#
|
9
11
|
# By making this a class it makes it easy for external
|
@@ -11,13 +13,12 @@ module DNote
|
|
11
13
|
# calling the commandline, but without the need to shellout.
|
12
14
|
#
|
13
15
|
class Session
|
14
|
-
|
15
16
|
# Directory relative to this script. This is used
|
16
17
|
# to lookup the available format templates.
|
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"
|
@@ -59,7 +60,7 @@ module DNote
|
|
59
60
|
|
60
61
|
# String template for line URLs (mainly for HTML format). For example,
|
61
62
|
# DNote uses GitHub so we could use a link template:
|
62
|
-
#
|
63
|
+
#
|
63
64
|
# "https://github.com/rubyworks/dnote/blob/master/%s#L%s"
|
64
65
|
#
|
65
66
|
attr_accessor :url
|
@@ -67,31 +68,31 @@ module DNote
|
|
67
68
|
# Number of lines of context to display. The default is zero.
|
68
69
|
attr_accessor :context
|
69
70
|
|
70
|
-
|
71
|
+
private
|
71
72
|
|
72
73
|
# New Session.
|
73
|
-
def initialize(options={})
|
74
|
+
def initialize(options = {})
|
74
75
|
options ||= {}
|
75
76
|
initialize_defaults
|
76
|
-
options.each{ |k,v| __send__("#{k}=", v) }
|
77
|
+
options.each { |k, v| __send__("#{k}=", v) }
|
77
78
|
yield(self) if block_given?
|
78
79
|
end
|
79
80
|
|
80
81
|
# Set default values for attributes.
|
81
82
|
def initialize_defaults
|
82
|
-
@paths
|
83
|
-
@labels
|
83
|
+
@paths = []
|
84
|
+
@labels = []
|
84
85
|
@exclude = []
|
85
|
-
@ignore
|
86
|
-
@format
|
87
|
-
@title
|
88
|
-
@dryrun
|
89
|
-
@marker
|
90
|
-
@url
|
86
|
+
@ignore = []
|
87
|
+
@format = DEFAULT_FORMAT
|
88
|
+
@title = DEFAULT_TITLE
|
89
|
+
@dryrun = false
|
90
|
+
@marker = nil
|
91
|
+
@url = nil
|
91
92
|
@context = 0
|
92
93
|
end
|
93
94
|
|
94
|
-
|
95
|
+
public
|
95
96
|
|
96
97
|
# Set exclude list ensuring that the value is an array.
|
97
98
|
def exclude=(list)
|
@@ -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,150 +126,41 @@ 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
|
-
list
|
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
|
|
131
|
-
# Collect the file glob of each path given. If
|
137
|
+
# Collect the file glob of each path given. If
|
132
138
|
# a path is a directory, inclue all content.
|
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
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
#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)
|
157
|
+
end
|
158
|
+
end
|
154
159
|
|
155
160
|
# Commandline interface.
|
156
161
|
def self.main(*argv)
|
157
|
-
|
158
|
-
|
159
|
-
session = Session.new
|
160
|
-
|
161
|
-
opts = OptionParser.new do |opt|
|
162
|
-
opt.banner = "DNote v#{DNote::VERSION}"
|
163
|
-
|
164
|
-
opt.separator(" ")
|
165
|
-
opt.separator("USAGE:\n dnote [OPTIONS] path1 [path2 ...]")
|
166
|
-
|
167
|
-
opt.separator(" ")
|
168
|
-
opt.separator("OUTPUT FORMAT: (choose one)")
|
169
|
-
|
170
|
-
opt.on("--format", "-f NAME", "select a format [text]") do |format|
|
171
|
-
session.format = format
|
172
|
-
end
|
173
|
-
|
174
|
-
opt.on("--custom", "-C FILE", "use a custom ERB template") do |file|
|
175
|
-
session.format = 'custom'
|
176
|
-
session.template = file
|
177
|
-
end
|
178
|
-
|
179
|
-
opt.on("--file", "shortcut for text/file format") do
|
180
|
-
session.format = 'text/file'
|
181
|
-
end
|
182
|
-
|
183
|
-
opt.on("--list", "shortcut for text/list format") do
|
184
|
-
session.format = 'text/list'
|
185
|
-
end
|
186
|
-
|
187
|
-
opt.separator(" ")
|
188
|
-
opt.separator("OTHER OPTIONS:")
|
189
|
-
|
190
|
-
opt.on("--label", "-l LABEL", "labels to collect") do |lbl|
|
191
|
-
session.labels.concat(lbl.split(':'))
|
192
|
-
end
|
193
|
-
|
194
|
-
opt.on("--[no-]colon", "match labels with/without colon suffix") do |val|
|
195
|
-
session.colon = val
|
196
|
-
end
|
197
|
-
|
198
|
-
opt.on("--marker", "-m MARK", "alternative remark marker") do |mark|
|
199
|
-
session.marker = mark
|
200
|
-
end
|
201
|
-
|
202
|
-
opt.on("--url", "-u TEMPLATE", "url template for line entries (for HTML)") do |url|
|
203
|
-
session.url = url
|
204
|
-
end
|
205
|
-
|
206
|
-
opt.on("--context", "-c INTEGER", "number of lines of context to display") do |int|
|
207
|
-
session.context = int.to_i
|
208
|
-
end
|
209
|
-
|
210
|
-
opt.on("--exclude", "-x PATH", "exclude file or directory") do |path|
|
211
|
-
session.exclude << path
|
212
|
-
end
|
213
|
-
|
214
|
-
opt.on("--ignore", "-i NAME", "ignore file based on any part of pathname") do |name|
|
215
|
-
session.ignore << name
|
216
|
-
end
|
217
|
-
|
218
|
-
opt.on("--title", "-t TITLE", "title to use in header") do |title|
|
219
|
-
session.title = title
|
220
|
-
end
|
221
|
-
|
222
|
-
opt.on("--output", "-o PATH", "save to file or directory") do |path|
|
223
|
-
session.output = path
|
224
|
-
end
|
225
|
-
|
226
|
-
opt.on("--dryrun", "-n", "do not actually write to disk") do
|
227
|
-
session.dryrun = true
|
228
|
-
end
|
229
|
-
|
230
|
-
opt.on("--debug", "debug mode") do
|
231
|
-
$DEBUG = true
|
232
|
-
$VERBOSE = true
|
233
|
-
end
|
234
|
-
|
235
|
-
opt.separator(" ")
|
236
|
-
opt.separator("COMMAND OPTIONS:")
|
237
|
-
|
238
|
-
opt.on_tail('--templates', "-T", "list available format templates") do
|
239
|
-
tdir = File.join(DIR, 'templates')
|
240
|
-
tfiles = Dir[File.join(tdir, '**/*.erb')]
|
241
|
-
tnames = tfiles.map{ |tname| tname.sub(tdir+'/', '').chomp('.erb') }
|
242
|
-
groups = tnames.group_by{ |tname| tname.split('/').first }
|
243
|
-
groups.sort.each do |(type, names)|
|
244
|
-
puts("%-18s " * names.size % names.sort)
|
245
|
-
end
|
246
|
-
exit
|
247
|
-
end
|
248
|
-
|
249
|
-
opt.on_tail('--help', '-h', "show this help information") do
|
250
|
-
puts opt
|
251
|
-
exit
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
begin
|
256
|
-
opts.parse!(argv)
|
257
|
-
session.paths.replace(argv)
|
258
|
-
session.run
|
259
|
-
rescue => err
|
260
|
-
raise err if $DEBUG
|
261
|
-
puts err
|
262
|
-
exit 1
|
263
|
-
end
|
162
|
+
session = Options.parse(*argv)
|
163
|
+
session.run
|
264
164
|
end
|
265
|
-
|
266
165
|
end
|
267
|
-
|
268
166
|
end
|
269
|
-
|
data/lib/dnote/version.rb
CHANGED
@@ -1,17 +1,5 @@
|
|
1
|
-
|
2
|
-
VERSION = '1.7.2'
|
3
|
-
|
4
|
-
#
|
5
|
-
def self.metadata
|
6
|
-
@metadata ||= (
|
7
|
-
require 'yaml'
|
8
|
-
YAML.load_file(File.dirname(__FILE__) + '/../dnote.yml')
|
9
|
-
)
|
10
|
-
end
|
11
|
-
|
12
|
-
#
|
13
|
-
def self.const_missing(name)
|
14
|
-
metadata[name.to_s.downcase] || super(name)
|
15
|
-
end
|
1
|
+
# frozen_string_literal: true
|
16
2
|
|
3
|
+
module DNote
|
4
|
+
VERSION = "1.10.0"
|
17
5
|
end
|
data/lib/dnote.rb
CHANGED