nandoc 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/README +5 -4
  2. data/Rakefile +1 -1
  3. data/bin/nandoc +2 -1
  4. data/doc/FAQ.md +3 -0
  5. data/doc/PROVISO.md +39 -0
  6. data/doc/commands/diff.md +49 -0
  7. data/doc/svg/less-fonts.svg +2 -2
  8. data/lib/nandoc/cli/README.md +6 -0
  9. data/lib/nandoc/cli/command-methods.rb +38 -0
  10. data/lib/nandoc/cli/option-methods/exclusive-options.rb +56 -0
  11. data/lib/nandoc/cli/option-methods/option-enum.rb +64 -0
  12. data/lib/nandoc/cli/option-methods.rb +35 -0
  13. data/lib/nandoc/cli.rb +3 -0
  14. data/lib/nandoc/commands/create-nandoc-site.rb +9 -12
  15. data/lib/nandoc/commands/diff.rb +14 -11
  16. data/lib/nandoc/commands.rb +9 -0
  17. data/lib/nandoc/{config.rb → core/config.rb} +18 -9
  18. data/lib/nandoc/core/project.rb +50 -0
  19. data/lib/nandoc/doc/hack-free-zone-defined.md +33 -0
  20. data/lib/nandoc/erb/agent.rb +5 -5
  21. data/lib/nandoc/{test/minitest-extlib.rb → extlib/minitest.rb} +1 -1
  22. data/lib/nandoc/filters/builtin-tags/fence/terminal.rb +24 -0
  23. data/lib/nandoc/filters/builtin-tags/fence-dispatcher.rb +43 -0
  24. data/lib/nandoc/filters/builtin-tags/fences.rb +4 -0
  25. data/lib/nandoc/filters/builtin-tags/see-test.rb +67 -0
  26. data/lib/nandoc/filters/builtin-tags.rb +11 -0
  27. data/lib/nandoc/filters/custom-tag.rb +43 -0
  28. data/lib/nandoc/filters/custom-tags.rb +19 -0
  29. data/lib/nandoc/filters/tag-parse-instance-methods.rb +11 -0
  30. data/lib/nandoc/filters/tag-parser.rb +206 -0
  31. data/lib/nandoc/filters.rb +11 -585
  32. data/lib/nandoc/{cri-hacks.rb → hacks/cri-hacks.rb} +4 -3
  33. data/lib/nandoc/{data-source.rb → hacks/data-source.rb} +5 -4
  34. data/lib/nandoc/{item-class-hacks.rb → hacks/item-class-hacks.rb} +3 -1
  35. data/lib/nandoc/hacks.rb +6 -0
  36. data/lib/nandoc/helpers/menu-bouncy.rb +1 -1
  37. data/lib/nandoc/helpers/site-map.rb +3 -0
  38. data/lib/nandoc/helpers.rb +1 -1
  39. data/lib/nandoc/html/tags.rb +65 -0
  40. data/lib/nandoc/html.rb +6 -0
  41. data/lib/nandoc/parse-readme.rb +4 -0
  42. data/lib/nandoc/spec-doc/agent-instance-methods.rb +24 -0
  43. data/lib/nandoc/spec-doc/code-snippet.rb +59 -0
  44. data/lib/nandoc/spec-doc/generic-agent.rb +40 -0
  45. data/lib/nandoc/spec-doc/mock-prompt.rb +3 -9
  46. data/lib/nandoc/spec-doc/parse-trace.rb +25 -0
  47. data/lib/nandoc/spec-doc/{mini-test/spec-instance-methods.rb → playback/html/foo-bar.rb} +0 -0
  48. data/lib/nandoc/spec-doc/playback/html.rb +2 -0
  49. data/lib/nandoc/spec-doc/playback/players/method.rb +64 -0
  50. data/lib/nandoc/spec-doc/playback/players/ruby.rb +158 -0
  51. data/lib/nandoc/spec-doc/playback/players/terminal.rb +93 -0
  52. data/lib/nandoc/spec-doc/playback/players.rb +4 -0
  53. data/lib/nandoc/spec-doc/playback/support/playback-methods.rb +44 -0
  54. data/lib/nandoc/spec-doc/playback/support/sexp-scanner.rb +61 -0
  55. data/lib/nandoc/spec-doc/playback/support.rb +3 -0
  56. data/lib/nandoc/spec-doc/playback/terminal/color-to-html.rb +100 -0
  57. data/lib/nandoc/spec-doc/playback.rb +3 -0
  58. data/lib/nandoc/spec-doc/recordings.rb +55 -0
  59. data/lib/nandoc/spec-doc/ruby2ruby-standin.rb +37 -0
  60. data/lib/nandoc/spec-doc/test-case-agent.rb +1 -1
  61. data/lib/nandoc/spec-doc/{mini-test.rb → test-framework/mini-test/proxy.rb} +9 -31
  62. data/lib/nandoc/spec-doc/{test-framework-proxy.rb → test-framework/proxy.rb} +27 -50
  63. data/lib/nandoc/spec-doc.rb +57 -13
  64. data/lib/nandoc/{test → support}/diff-to-string.rb +0 -0
  65. data/lib/nandoc/support/regexp-enhance.rb +6 -0
  66. data/lib/nandoc/support/regexp.rb +12 -0
  67. data/lib/nandoc/support/secret-parent.rb +21 -0
  68. data/lib/nandoc/support/shared-attr-reader.rb +32 -0
  69. data/lib/nandoc/support/site-merge.rb +1 -1
  70. data/lib/nandoc/support/site-methods.rb +4 -4
  71. data/lib/nandoc/support/stream-colorizer.rb +1 -1
  72. data/lib/nandoc/support/string-methods.rb +56 -0
  73. data/lib/nandoc.rb +12 -35
  74. data/proto/README.md +4 -2
  75. data/test/test.rb +1 -0
  76. metadata +58 -25
  77. data/doc/bar/baz.md +0 -4
  78. data/doc/bar/bliff.md +0 -8
  79. data/doc/foo.md +0 -5
  80. data/doc/getting-started.rb +0 -13
  81. data/lib/nandoc/spec-doc/support-modules.rb +0 -158
  82. data/lib/nandoc/spec-doc/test-framework-dispatcher.rb +0 -15
  83. data/lib/nandoc/support-modules.rb +0 -273
  84. data/lib/nandoc/treebis/NOGIT-DOCS/NEWS.md +0 -5
  85. data/lib/nandoc/treebis/NOGIT-README.md +0 -65
  86. data/lib/nandoc/treebis/nandoc.persistent.json +0 -3
@@ -1,273 +0,0 @@
1
- module NanDoc
2
- module CliCommandHelpers
3
- def command_name
4
- (/::([_a-z0-9]+)\Z/i =~ self.class.to_s and base = $1) or fail('no')
5
- base.gsub(/([a-z])([A-Z])/){ "#{$1}-#{$2}" }.downcase
6
- end
7
- def invite_to_more_command_help
8
- "see `nandoc help #{command_name}` for more information."
9
- end
10
- def invocation_name
11
- File.basename($PROGRAM_NAME)
12
- end
13
- end
14
- module StringFormatting; end
15
- module OptsNormalizer
16
- def normalize_opts opts
17
- opts = opts.dup
18
- opts.keys.select{|x| x.to_s.index('-') }.each do |k|
19
- opts[normalize_opt_key(k)] = opts.delete(k)
20
- end
21
- opts
22
- end
23
- def normalize_opt_key k
24
- k.to_s.gsub('-','_').to_sym
25
- end
26
- def unnormalize_opt_keys keys
27
- keys.map{|x| unnormalize_opt_key(x)}
28
- end
29
- def unnormalize_opt_key key
30
- "--#{key.to_s.gsub('_','-')}"
31
- end
32
-
33
- #
34
- # only call this if you are like a ::Cri::Command object with
35
- # all the nanDoc hacks. ick. This is a temprary hack. Trollop et al
36
- # do this better.
37
- #
38
- def exclusive_opt_flags opts, &block
39
- Exclusive.new(&block).parse(self, opts)
40
- end
41
-
42
- class Exclusive
43
- include OptsNormalizer
44
- def initialize &block
45
- @exclusive_flag_keys = nil
46
- @default_short = nil
47
- @default_key = nil
48
- @notice_stream = $stderr
49
- instance_eval(&block)
50
- fail('definition block needs at least flags()') unless
51
- @exclusive_flag_keys
52
- end
53
- def flags * exclusive_flag_keys
54
- @exclusive_flag_keys = exclusive_flag_keys
55
- end
56
- # params: [short_name_string] name_key
57
- def default *a
58
- if a.first.kind_of?(String)
59
- @default_short = a.shift
60
- end
61
- if a.first.kind_of?(Symbol)
62
- @default_key = a.shift
63
- else
64
- fail("bad args: #{a.first.inspect}")
65
- end
66
- fail("extra args: #{a.inspect}") if a.any?
67
- end
68
- def notice_stream mixed
69
- @notice_stream = mixed
70
- end
71
- def parse cmd, opts
72
- these = @exclusive_flag_keys & opts.keys
73
- if these.empty? && @default_key
74
- if @notice_stream
75
- msg =
76
- ["using default: "+unnormalize_opt_key(@default_key),
77
- @default_short ? "(#{@default_short})" : nil
78
- ].compact.join(' ')
79
- @notice_stream.puts msg
80
- end
81
- these.push(@default_key)
82
- end
83
- if these.size > 1
84
- flags = unnormalize_opt_keys(@exclusive_flag_keys)
85
- cmd.task_abort <<-ABORT.gsub(/^ */,'')
86
- #{flags.join(' and ')} are mutually exclusive.
87
- usage: #{cmd.usage}
88
- #{cmd.invite_to_more_command_help}
89
- ABORT
90
- end
91
- these.first
92
- end
93
- end
94
- class OptEnum
95
- include OptsNormalizer, StringFormatting
96
- def initialize(&block)
97
- instance_eval(&block)
98
- end
99
- def command cmd
100
- @command = cmd
101
- end
102
- def default str
103
- @default = str
104
- end
105
- def name name
106
- @name = name
107
- end
108
- def parse opts
109
- found = nil
110
- if opts.key?(@name)
111
- v = opts[@name]
112
- re = /\A#{Regexp.escape(v)}/
113
- founds = @values.grep(re)
114
- case founds.size
115
- when 0; invalid(v)
116
- when 1; found = founds.first
117
- else found = founds.detect{|f| f==v} or too_many(founds)
118
- end
119
- elsif(@default)
120
- found = @default
121
- else
122
- found = nil
123
- end
124
- opts[@name] = found if found # normalize short versions
125
- found
126
- end
127
- def values *v
128
- v = v.first if v.size==1 && Array === v
129
- @values = v
130
- end
131
- private
132
- def coda
133
- "usage: #{@command.usage}\n#{@command.invite_to_more_command_help}"
134
- end
135
- def invalid val
136
- @command.task_abort("invalid value #{val.inspect} for "<<
137
- "#{long_name}. #{valid_values_are}\n#{coda}")
138
- end
139
- def long_name
140
- unnormalize_opt_key(@name)
141
- end
142
- def too_many these
143
- @command.task_abort("did you mean " <<
144
- oxford_comma(these,' or ', &quoted)<<" for #{long_name}?\n#{coda}")
145
- end
146
- def valid_values_are
147
- "valid values are " << oxford_comma(@values,&quoted)
148
- end
149
- end
150
- end
151
- module PathHelper
152
- def assert_path name, *paths
153
- paths.each do |p|
154
- unless File.exist?(p)
155
- task_abort("#{name} does not exist: #{p}")
156
- end
157
- end
158
- end
159
- end
160
- module StringFormatting
161
- def basename_no_extension str
162
- /([^\/\.]+)(?:\.[^\.\/]+)?\Z/ =~ str ? $1 : nil
163
- end
164
- def indent str, indent
165
- str.gsub(/^/, indent)
166
- end
167
- def no_blank_lines str
168
- str.gsub(/\n[[:space:]]*\n/, "\n")
169
- end
170
- def no_leading_ws str
171
- str.sub(/\A[[:space:]]+/, '')
172
- end
173
- def no_trailing_ws str
174
- str.sub(/[[:space:]]+\Z/, '')
175
- end
176
- def oxford_comma items, final = ' and ', &quoter
177
- items = items.map(&quoter) if quoter
178
- these = []
179
- these.push final if items.size > 1
180
- these.concat(Array.new(items.size-2,', ')) if items.size > 2
181
- these.reverse!
182
- items.zip(these).flatten.compact.join
183
- end
184
- def quoted
185
- proc{|x| "\"#{x}\"" }
186
- end
187
-
188
- #
189
- # must respond to tab() and tabs()
190
- # reindent a block by striping leading whitespace from lines evenly
191
- # and then re-indenting each line according to our indent.
192
- # this could be simpler, it has been more complicated
193
- # we do it languidly because we can
194
- #
195
- def reindent h1, offset=0
196
- indent_by = tab * (tabs+offset)
197
- unindent_by = (/\A([[:space:]]+)/ =~ h1 && $1) or
198
- fail('regex fail -- not sure if we need this to be so strict')
199
- h2 = no_blank_lines(h1) # careful. will mess up with <pre> etc
200
- return h2 if unindent_by == indent_by
201
- h3 = unindent(h2, unindent_by)
202
- h4 = indent(h3, indent_by)
203
- h4
204
- end
205
-
206
- def unindent str, by
207
- str.gsub(/^#{Regexp.escape(by)}/, '')
208
- end
209
- end
210
- module SecretParent
211
- #
212
- # set parent attribute without it showing up in inspect() dumps
213
- #
214
- def parent= mixed
215
- fail("no clear_parent() available yet.") unless mixed
216
- @has_parent = !! mixed
217
- class << self; self end.send(:define_method, :parent){mixed}
218
- mixed # maybe chain assignmnet of 1 parent to several cx at once
219
- end
220
- def parent?
221
- instance_variable_defined?('@has_parent') && @has_parent # no warnings
222
- end
223
- def parent
224
- nil
225
- end
226
- end
227
- module SharedAttrReader
228
- #
229
- # this is a specialized form of delegator pattern: let one object
230
- # use the responses from another object for a set of accessors
231
- #
232
- def shared_attr_reader *list
233
- fail('no inehiritance yet') if method_defined?(:shared=)
234
- sm = Module.new
235
- name = self.to_s+'::SharedAttrReaders'
236
- sing = class << sm; self end
237
- sing.send(:define_method, :name){name}
238
- sing.send(:alias_method, :inspect, :name)
239
- list.each do |attrib|
240
- sm.send(:define_method, attrib){ shared.send(attrib) }
241
- end
242
- fail('no') if method_defined?(:shared)
243
- define_method(:shared){ self }
244
- define_method(:shared=) do |source|
245
- sing = class << self; self end
246
- sing.send(:define_method, :shared){ source }
247
- sing.send(:include, sm) # wow cool that this works w/o having
248
- # to Module#undef_method
249
- source
250
- end
251
- nil
252
- end
253
- end
254
- module TaskCommon
255
- def task_abort msg
256
- if msg.index("for more info") # not mr. right, mr. right now
257
- tail = ''
258
- else
259
- last = msg[-1].chr
260
- tail = ".?!".index(last) ? ' ' : ("\n"==last ? '' : '. ')
261
- tail << 'Aborting.'
262
- end
263
- $stderr.puts "nanDoc: #{msg}#{tail}"
264
- exit 1
265
- end
266
- end
267
- module CliCommandHelpers
268
- include OptsNormalizer, TaskCommon, PathHelper
269
- end
270
- module PathHelper
271
- include TaskCommon
272
- end
273
- end
@@ -1,5 +0,0 @@
1
- # treebis news
2
-
3
- ## 0.0.0 (2010-99-99)
4
-
5
- * born but not a birther
@@ -1,65 +0,0 @@
1
- ## treebis
2
-
3
- ### in short,
4
- Treebis is a minimal (small) task utility written in ruby designed expressly for wrapping common actions for moving, copying and altering filetrees. It's geared towards things like generators. Its look is comparable to a Rake task. Its effect is comparable to a shell script composed of mkdir, mv, cp commands etc.
5
-
6
- This document is overkill. Treebis is underkill.
7
-
8
- ### it is:
9
- - task wrapper for external commands that make filetrees, e.g.
10
- - maybe the generators in things like rails, ramaze, nandoc
11
- - copies filetrees to filetrees
12
- - removes filetrees from filetrees
13
- - applies diffs to filetrees
14
- - different ways to represent trees and diffs - heredocs, diffs, filesystem.
15
- - under 500 lines of code (?) (~300 SLOC ATTOTW)
16
- - near 100% test coverage (?)
17
-
18
- ### it is not:
19
- - a vcs or vcs wrapper (version control system)
20
- - atomic
21
- - a replacement for the heavy hitters used by web frameworks
22
- - Safe. Little sanity checking and error checking is done. At present it
23
- it is mostly a wrapper around FileUtils and patch. If you refer to files
24
- that aren't there or try to read/move/remove files you don't have the
25
- permissions to do so with, you will see the errors as you would from
26
- FileUtils.
27
-
28
- ### faq
29
-
30
- #### Q: why use it?
31
-
32
- #### A:
33
- <p class='ans'>Because you want a consistent way to wrap these common tasks that doesn't explicitly rely on shelling out to the underlying system, or other hodgepodges. (also see 'why did you make this?')
34
- </p>
35
-
36
- #### Q: why not use it?
37
-
38
- #### A:
39
- Because it doesn't do what you want or it does what you do not want.
40
-
41
- #### Q: why is it named "Treebis?"
42
-
43
- #### A:
44
- because it rhymes with "Jeebus."
45
-
46
- #### Q: why did you make this?
47
-
48
- #### A:
49
- by the third or fourth time i found myself re-writing this same kind of thing for different projects (or bleeding from its absence), i decided to abstract it. It's more readable than a bunch of FileUtils statements, it's more portable than a bunch of bash scripts (sorta), it's divorced from any heavy (or light) web frameworks, and it paves the way for possible future enhancements like atomicitiy and units of work; and wouldn't it be nice if every generator of every project used the same library?
50
-
51
- ### requirements
52
- - ruby 1.8.7
53
- - GNU patch 2.5.8 (if the diff-patching functionality is to be used)
54
- (most versions of patch will likely work; it uses unified diffs.)
55
-
56
- ### installation
57
- @todo
58
-
59
- ### usage
60
- @todo
61
-
62
- ### future unfulfilled promises made today:
63
- - dry run
64
- - erb
65
- - two-pass units of work !!??
@@ -1,3 +0,0 @@
1
- {
2
- "tmpdir": "/var/folders/Uc/UcTP6K3aF5O604wVlmM89E+++TQ/-Tmp-/treebis"
3
- }