ro 1.4.6 → 4.4.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.
Files changed (157) hide show
  1. checksums.yaml +6 -14
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +64 -0
  4. data/LICENSE +1 -0
  5. data/README.md +276 -105
  6. data/README.md.erb +159 -0
  7. data/Rakefile +129 -78
  8. data/bin/ro +241 -68
  9. data/lib/ro/_lib.rb +107 -0
  10. data/lib/ro/asset.rb +55 -0
  11. data/lib/ro/collection/list.rb +23 -0
  12. data/lib/ro/collection.rb +211 -0
  13. data/lib/ro/config.rb +72 -0
  14. data/lib/ro/error.rb +11 -0
  15. data/lib/ro/html.rb +23 -0
  16. data/lib/ro/html_safe.rb +143 -0
  17. data/lib/ro/klass.rb +25 -0
  18. data/lib/ro/methods.rb +295 -0
  19. data/lib/ro/model.rb +83 -114
  20. data/lib/ro/node.rb +209 -349
  21. data/lib/ro/pagination.rb +7 -4
  22. data/lib/ro/path.rb +229 -0
  23. data/lib/ro/root.rb +52 -31
  24. data/lib/ro/script/builder.rb +221 -0
  25. data/lib/ro/script/console.rb +47 -0
  26. data/lib/ro/script/server.rb +76 -0
  27. data/lib/ro/script.rb +189 -0
  28. data/lib/ro/slug.rb +19 -18
  29. data/lib/ro/template/rouge_formatter.rb +42 -0
  30. data/lib/ro/template.rb +145 -51
  31. data/lib/ro/text.rb +120 -0
  32. data/lib/ro.rb +89 -317
  33. data/public/api/ro/index-1.json +1065 -0
  34. data/public/api/ro/index.json +1055 -0
  35. data/public/api/ro/nerd/fastest-possible-embeddings/index.json +90 -0
  36. data/public/api/ro/nerd/ima/index.json +49 -0
  37. data/public/api/ro/nerd/index/index.json +74 -0
  38. data/public/api/ro/nerd/index-1.json +204 -0
  39. data/public/api/ro/nerd/index.json +194 -0
  40. data/public/api/ro/pages/about/index.json +60 -0
  41. data/public/api/ro/pages/contact/index.json +50 -0
  42. data/public/api/ro/pages/cv/index.json +49 -0
  43. data/public/api/ro/pages/disco/index.json +117 -0
  44. data/public/api/ro/pages/index/index.json +30 -0
  45. data/public/api/ro/pages/index-1.json +366 -0
  46. data/public/api/ro/pages/index.json +356 -0
  47. data/public/api/ro/pages/jess/index.json +62 -0
  48. data/public/api/ro/pages/now/index.json +43 -0
  49. data/public/api/ro/posts/almost-died-in-an-ice-cave/index.json +265 -0
  50. data/public/api/ro/posts/facebook-and-global-extremism/index.json +90 -0
  51. data/public/api/ro/posts/index-1.json +527 -0
  52. data/public/api/ro/posts/index.json +517 -0
  53. data/public/api/ro/posts/lemmings-considered-harmful/index.json +49 -0
  54. data/public/api/ro/posts/lost-in-the-desert/index.json +49 -0
  55. data/public/api/ro/posts/mission/index.json +49 -0
  56. data/public/api/ro/posts/return-your-laptop/index.json +61 -0
  57. data/public/ro/nerd/fastest-possible-embeddings/assets/giraffe.jpeg +0 -0
  58. data/public/ro/nerd/fastest-possible-embeddings/assets/let-me-in.jpg +0 -0
  59. data/public/ro/nerd/fastest-possible-embeddings/assets/src/fastembed.js +70 -0
  60. data/public/ro/nerd/fastest-possible-embeddings/assets/src/fastembed.rs +68 -0
  61. data/public/ro/nerd/fastest-possible-embeddings/assets/terminal.jpg +0 -0
  62. data/public/ro/nerd/fastest-possible-embeddings/attributes.yml +7 -0
  63. data/public/ro/nerd/fastest-possible-embeddings/body.md +266 -0
  64. data/public/ro/nerd/ima/assets/og.jpeg +0 -0
  65. data/public/ro/nerd/ima/attributes.yml +8 -0
  66. data/public/ro/nerd/ima/body.md +22 -0
  67. data/public/ro/nerd/index/assets/giraffe.jpeg +0 -0
  68. data/public/ro/nerd/index/assets/let-me-in.jpg +0 -0
  69. data/public/ro/nerd/index/assets/terminal.jpg +0 -0
  70. data/public/ro/nerd/index/attributes.yml +7 -0
  71. data/public/ro/nerd/index/body.md +130 -0
  72. data/public/ro/pages/about/assets/og.jpeg +0 -0
  73. data/public/ro/pages/about/assets/speak-english-pulp-fiction.gif +0 -0
  74. data/public/ro/pages/about/body.md +40 -0
  75. data/public/ro/pages/contact/assets/giraffe.jpeg +0 -0
  76. data/public/ro/pages/contact/attributes.yml +7 -0
  77. data/public/ro/pages/contact/body.md +9 -0
  78. data/public/ro/pages/cv/assets/ara.jpg +0 -0
  79. data/public/ro/pages/cv/attributes.yml +6 -0
  80. data/public/ro/pages/cv/body.md +122 -0
  81. data/public/ro/pages/disco/assets/disco.jpg +0 -0
  82. data/public/ro/pages/disco/assets/disco.png +0 -0
  83. data/public/ro/pages/disco/assets/speak-english-pulp-fiction.gif +0 -0
  84. data/public/ro/pages/disco/assets/src/environment.md +2354 -0
  85. data/public/ro/pages/disco/assets/src/fortune-500.md +2518 -0
  86. data/public/ro/pages/disco/assets/src/greed.md +2703 -0
  87. data/public/ro/pages/disco/assets/src/up-at-night.md +2337 -0
  88. data/public/ro/pages/disco/attributes.yml +9 -0
  89. data/public/ro/pages/disco/body.md +99 -0
  90. data/public/ro/pages/disco/samples/environment.md +2354 -0
  91. data/public/ro/pages/disco/samples/fortune-500.md +2518 -0
  92. data/public/ro/pages/disco/samples/greed.md +2703 -0
  93. data/public/ro/pages/disco/samples/up-at-night.md +2337 -0
  94. data/public/ro/pages/index/attributes.yml +1 -0
  95. data/public/ro/pages/index/body.md +15 -0
  96. data/public/ro/pages/jess/assets/og.jpg +0 -0
  97. data/public/ro/pages/jess/assets/speak-english-pulp-fiction.gif +0 -0
  98. data/public/ro/pages/jess/attributes.yml +7 -0
  99. data/public/ro/pages/jess/body.md +3 -0
  100. data/public/ro/pages/now/assets/speak-english-pulp-fiction.gif +0 -0
  101. data/public/ro/pages/now/attributes.yml +1 -0
  102. data/public/ro/pages/now/body.md +24 -0
  103. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image1.png +0 -0
  104. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image10.png +0 -0
  105. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image11.png +0 -0
  106. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image12.png +0 -0
  107. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image13.png +0 -0
  108. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image14.png +0 -0
  109. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image15.png +0 -0
  110. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image2.png +0 -0
  111. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image3.png +0 -0
  112. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image4.png +0 -0
  113. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image5.png +0 -0
  114. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image6.png +0 -0
  115. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image7.png +0 -0
  116. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image8.png +0 -0
  117. data/public/ro/posts/almost-died-in-an-ice-cave/assets/image9.png +0 -0
  118. data/public/ro/posts/almost-died-in-an-ice-cave/assets/josh-pointing.jpg +0 -0
  119. data/public/ro/posts/almost-died-in-an-ice-cave/assets/levi-rawr.png +0 -0
  120. data/public/ro/posts/almost-died-in-an-ice-cave/assets/og.jpg +0 -0
  121. data/public/ro/posts/almost-died-in-an-ice-cave/assets/purple-heart.jpg +0 -0
  122. data/public/ro/posts/almost-died-in-an-ice-cave/attributes.yml +6 -0
  123. data/public/ro/posts/almost-died-in-an-ice-cave/body.md +419 -0
  124. data/public/ro/posts/facebook-and-global-extremism/assets/background.html +125 -0
  125. data/public/ro/posts/facebook-and-global-extremism/assets/background.md +95 -0
  126. data/public/ro/posts/facebook-and-global-extremism/assets/og.jpg +0 -0
  127. data/public/ro/posts/facebook-and-global-extremism/assets/prompt.txt +122 -0
  128. data/public/ro/posts/facebook-and-global-extremism/assets/results.md +183 -0
  129. data/public/ro/posts/facebook-and-global-extremism/assets/survey.txt +190 -0
  130. data/public/ro/posts/facebook-and-global-extremism/attributes.yml +7 -0
  131. data/public/ro/posts/facebook-and-global-extremism/body.md +393 -0
  132. data/public/ro/posts/lemmings-considered-harmful/assets/lemming.jpeg +0 -0
  133. data/public/ro/posts/lemmings-considered-harmful/attributes.yml +6 -0
  134. data/public/ro/posts/lemmings-considered-harmful/body.md +43 -0
  135. data/public/ro/posts/lost-in-the-desert/assets/og.jpg +0 -0
  136. data/public/ro/posts/lost-in-the-desert/attributes.yml +6 -0
  137. data/public/ro/posts/lost-in-the-desert/body.md +7 -0
  138. data/public/ro/posts/mission/assets/og.jpg +0 -0
  139. data/public/ro/posts/mission/attributes.yml +6 -0
  140. data/public/ro/posts/mission/body.md +4 -0
  141. data/public/ro/posts/return-your-laptop/assets/og.jpg +0 -0
  142. data/public/ro/posts/return-your-laptop/assets/return-your-laptop.png +0 -0
  143. data/public/ro/posts/return-your-laptop/attributes.yml +6 -0
  144. data/public/ro/posts/return-your-laptop/body.md +58 -0
  145. data/ro.gemspec +217 -28
  146. data/scripts/speedtest.rb +324 -0
  147. data/tmp/gem-details.oe +0 -0
  148. metadata +214 -74
  149. data/TODO.md +0 -50
  150. data/lib/ro/blankslate.rb +0 -7
  151. data/lib/ro/cache.rb +0 -26
  152. data/lib/ro/git.rb +0 -374
  153. data/lib/ro/initializers/env.rb +0 -5
  154. data/lib/ro/initializers/tilt.rb +0 -104
  155. data/lib/ro/lock.rb +0 -53
  156. data/lib/ro/node/list.rb +0 -142
  157. data/notes/ara.txt +0 -215
data/lib/ro.rb CHANGED
@@ -1,322 +1,94 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
- require 'fileutils'
4
- require 'pathname'
5
- require 'yaml'
6
- require 'digest/md5'
7
- require 'logger'
8
- require 'erb'
9
- require 'cgi'
10
-
11
- #
12
- module Ro
13
- Version = '1.4.6' unless defined?(Version)
14
-
15
- def version
16
- Ro::Version
17
- end
18
-
19
- def dependencies
20
- {
21
- 'map' => [ 'map' , ' >= 6.5.1' ] ,
22
- 'fattr' => [ 'fattr' , ' >= 2.2.1' ] ,
23
- 'tilt' => [ 'tilt' , ' >= 1.3.1' ] ,
24
- 'pygments' => [ 'pygments.rb' , ' >= 0.5.0' ] ,
25
- 'coerce' => [ 'coerce' , ' >= 0.0.4' ] ,
26
- 'stringex' => [ 'stringex' , ' >= 2.1.0' ] ,
27
- 'systemu' => [ 'systemu' , ' >= 2.5.2' ] ,
28
- 'nokogiri' => [ 'nokogiri' , ' >= 1.6.1' ] ,
29
- 'main' => [ 'main' , ' >= 5.2.0' ] ,
30
- }
31
- end
32
-
33
- def libdir(*args, &block)
34
- @libdir ||= File.expand_path(__FILE__).sub(/\.rb$/,'')
35
- args.empty? ? @libdir : File.join(@libdir, *args)
36
- ensure
37
- if block
38
- begin
39
- $LOAD_PATH.unshift(@libdir)
40
- block.call()
41
- ensure
42
- $LOAD_PATH.shift()
43
- end
1
+ require_relative 'ro/_lib'
2
+
3
+ Ro.load_dependencies!
4
+
5
+ module Ro
6
+ class << Ro
7
+ # top-level
8
+ # |
9
+ # v
10
+ def root
11
+ Ro.config.root
12
+ end
13
+
14
+ def root=(root)
15
+ Ro.config.root = root
16
+ end
17
+
18
+ def collections
19
+ root.collections
20
+ end
21
+
22
+ def nodes
23
+ root.nodes
24
+ end
25
+
26
+ # config
27
+ # |
28
+ # v
29
+ def env
30
+ Map.for({
31
+ :root => ENV['RO_ROOT'],
32
+ :build => ENV['RO_BUILD'],
33
+ :url => ENV['RO_URL'],
34
+ :img_url => ENV['RO_IMG_URL'],
35
+ :page_size => ENV['RO_PAGE_SIZE'],
36
+ :log => ENV['RO_LOG'],
37
+ :debug => ENV['RO_DEBUG'],
38
+ :port => ENV['RO_PORT'],
39
+ :md_theme => ENV['RO_MD_THEME'],
40
+ })
41
+ end
42
+
43
+ def defaults
44
+ Map.for({
45
+ :root => './public/ro',
46
+ :build => './public/api/ro',
47
+ :url => "/ro",
48
+ :img_url => "/ro",
49
+ :page_size => 42,
50
+ :log => nil,
51
+ :debug => nil,
52
+ :port => 4242,
53
+ :md_theme => 'github',
54
+ })
55
+ end
56
+
57
+ def config
58
+ @config ||= Config.new
59
+ end
60
+
61
+ # ro init
62
+ # |
63
+ # v
64
+ def initialize!
65
+ Ro.load %w[
66
+ html.rb
67
+ error.rb
68
+ klass.rb
69
+ slug.rb
70
+ path.rb
71
+ text.rb
72
+ template.rb
73
+ methods.rb
74
+ config.rb
75
+ root.rb
76
+ collection.rb
77
+ collection/list.rb
78
+ node.rb
79
+ asset.rb
80
+ ]
81
+
82
+ if defined?(ActiveModel)
83
+ Ro.load %w[
84
+ model.rb
85
+ ]
44
86
  end
45
- end
46
-
47
- def load(*libs)
48
- libs = libs.join(' ').scan(/[^\s+]+/)
49
- Ro.libdir{ libs.each{|lib| Kernel.load(lib) } }
50
- end
51
-
52
- extend(Ro)
53
- end
54
87
 
55
- #
56
- begin
57
- require 'rubygems'
58
- rescue LoadError
59
- nil
60
- end
61
-
62
- if defined?(gem)
63
- Ro.dependencies.each do |lib, dependency|
64
- gem(*dependency)
65
- require(lib)
88
+ Ro.log! if Ro.config.log
89
+ Ro.debug! if Ro.config.debug
66
90
  end
67
91
  end
92
+ end
68
93
 
69
- %w[
70
- fileutils
71
- yaml
72
- ].each do |lib|
73
- require lib
74
- end
75
-
76
- #
77
-
78
- module Ro
79
- def Ro.default_root
80
- [ ENV['RO_ROOT'], "./public/ro", "./source/ro" ].compact.detect{|d| test(?d, d)} || "./ro"
81
- end
82
-
83
- def Ro.root=(root)
84
- @root = Root.new(root.to_s)
85
- end
86
-
87
- def Ro.root(*args)
88
- Ro.root = args.first unless args.empty?
89
- @root ||= Root.new(Ro.default_root)
90
- end
91
-
92
- def Ro.git
93
- root.git
94
- end
95
-
96
- def Ro.patch(*args, &block)
97
- git.patch(*args, &block)
98
- end
99
-
100
- Fattr(:cache){
101
- Cache.new
102
- }
103
-
104
- Fattr(:logger){
105
- nil
106
- }
107
-
108
- Fattr(:route){
109
- '/ro'
110
- }
111
-
112
- Fattr(:asset_host){
113
- nil
114
- }
115
-
116
- def Ro.nodes(*args, &block)
117
- root.nodes(*args, &block)
118
- end
119
-
120
- def Ro.relative_path(path, *args)
121
- options = Map.options_for!(args)
122
- path = File.expand_path(String(path))
123
- relative = File.expand_path(String(args.shift || options[:relative] || options[:to]) || options[:from])
124
- Pathname.new(path).relative_path_from(Pathname.new(relative)).to_s
125
- end
126
-
127
- def Ro.realpath(path)
128
- Pathname.new(path.to_s).realpath
129
- end
130
-
131
- def Ro.md5(string)
132
- Digest::MD5.hexdigest(string)
133
- end
134
-
135
- def Ro.debug!
136
- @logger ||= (
137
- logger = ::Logger.new(STDERR)
138
- logger.level = ::Logger::DEBUG
139
- logger
140
- )
141
- end
142
-
143
- def Ro.log(*args, &block)
144
- return if @logger.nil?
145
-
146
- level =
147
- if args.size == 1
148
- :debug
149
- else
150
- args.shift
151
- end
152
-
153
- @logger.send(level, *args, &block)
154
- end
155
-
156
- def Ro.slug_for(*args, &block)
157
- options = Map.options_for!(args)
158
- unless options.has_key?(:join)
159
- options[:join] = '-'
160
- end
161
- args.push(options)
162
- Slug.for(*args, &block)
163
- end
164
-
165
- def Ro.name_for(*args, &block)
166
- options = Map.options_for!(args)
167
- unless options.has_key?(:join)
168
- options[:join] = '_'
169
- end
170
- args.push(options)
171
- Slug.for(*args, &block)
172
- end
173
-
174
- def Ro.erb(content, node = nil)
175
- binding =
176
- case node
177
- when Binding
178
- node
179
- when Node
180
- node._binding
181
- when nil
182
- nil
183
- else
184
- instance_eval{ Kernel.binding }
185
- end
186
-
187
- ERB.new(content.to_s).result(binding)
188
- end
189
-
190
- def Ro.render(*args, &block)
191
- Template.render(*args, &block)
192
- end
193
-
194
- def Ro.render_source(*args, &block)
195
- Template.render_source(*args, &block)
196
- end
197
-
198
- def Ro.expand_asset_urls(html, node)
199
- begin
200
- accurate_expand_asset_urls(html, node)
201
- rescue Object
202
- sloppy_expand_asset_urls(html, node)
203
- end
204
- end
205
-
206
- def Ro.accurate_expand_asset_urls(html, node)
207
- doc = Nokogiri::HTML.fragment(html)
208
-
209
- doc.traverse do |element|
210
- if element.respond_to?(:attributes)
211
- element.attributes.each do |attr, attribute|
212
- value = attribute.value
213
- if value =~ %r{(?:./)?assets/(.+)$}
214
- begin
215
- base, ext = $1.split('.', 2)
216
- url = node.url_for(base)
217
- attribute.value = url
218
- rescue Object
219
- next
220
- end
221
- end
222
- end
223
- end
224
- end
225
-
226
- doc.to_s.strip
227
- end
228
-
229
- def Ro.sloppy_expand_asset_urls(html, node)
230
- html.to_s.gsub(%r{['"]assets/([^'"]+)['"]}) do |match|
231
- base, ext = $1.split('.', 2)
232
-
233
- begin
234
- node.url_for(base).inspect
235
- rescue Object
236
- match
237
- end
238
- end
239
- end
240
-
241
- def Ro.paths_for(*args)
242
- path = args.flatten.compact.join('/')
243
- path.gsub!(%r|[.]+/|, '/')
244
- path.squeeze!('/')
245
- path.sub!(%r|^/|, '')
246
- path.sub!(%r|/$|, '')
247
- paths = path.split('/')
248
- end
249
-
250
- def Ro.absolute_path_for(*args)
251
- path = ('/' + paths_for(*args).join('/')).squeeze('/')
252
- path unless path.empty?
253
- end
254
-
255
- def Ro.relative_path_for(*args)
256
- path = absolute_path_for(*args).sub(%r{^/+}, '')
257
- path unless path.empty?
258
- end
259
-
260
- def Ro.normalize_path(arg, *args)
261
- absolute_path_for(arg, *args)
262
- end
263
-
264
- def Ro.query_string_for(hash, options = {})
265
- options = Map.for(options)
266
- escape = options.has_key?(:escape) ? options[:escape] : true
267
- pairs = []
268
- esc = escape ? proc{|v| CGI.escape(v.to_s)} : proc{|v| v.to_s}
269
- hash.each do |key, values|
270
- key = key.to_s
271
- values = [values].flatten
272
- values.each do |value|
273
- value = value.to_s
274
- if value.empty?
275
- pairs << [ esc[key] ]
276
- else
277
- pairs << [ esc[key], esc[value] ].join('=')
278
- end
279
- end
280
- end
281
- pairs.replace pairs.sort_by{|pair| pair.size}
282
- pairs.join('&')
283
- end
284
-
285
- def Ro.realpath(path)
286
- begin
287
- Pathname.new(path.to_s).expand_path.realpath.to_s
288
- rescue Object
289
- File.expand_path(path.to_s)
290
- end
291
- end
292
-
293
- end
294
-
295
- #
296
- module Kernel
297
- def ro(*args, &block)
298
- Ro.nodes(*args, &block)
299
- end
300
- end
301
-
302
- #
303
- Ro.load %w[
304
-
305
- initializers/tilt.rb
306
- initializers/env.rb
307
-
308
- slug.rb
309
- blankslate.rb
310
-
311
- root.rb
312
- lock.rb
313
- git.rb
314
- pagination.rb
315
-
316
- cache.rb
317
-
318
- template.rb
319
- node.rb
320
- node/list.rb
321
-
322
- ]
94
+ Ro.initialize!