ro 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/: +9 -0
- data/:w +29 -0
- data/README.md +30 -0
- data/Rakefile +14 -3
- data/lib/co/db.rb +4 -0
- data/lib/co/node.rb +4 -0
- data/lib/co/node/list.rb +16 -0
- data/lib/co/util.rb +5 -0
- data/lib/ro.rb +183 -4
- data/lib/ro/blankslate.rb +7 -0
- data/lib/ro/cache.rb +20 -0
- data/lib/ro/db.rb +29 -0
- data/lib/ro/db/collection.rb +46 -0
- data/lib/ro/initializers/env.rb +5 -0
- data/lib/ro/initializers/tilt.rb +97 -0
- data/lib/ro/node.rb +215 -0
- data/lib/ro/node/list.rb +130 -0
- data/lib/ro/root.rb +30 -0
- data/lib/ro/slug.rb +26 -0
- data/lib/ro/template.rb +9 -0
- data/lib/ro/util.rb +13 -0
- data/notes/ara.txt +84 -0
- data/ro.gemspec +56 -2
- data/ro/people/ara/attributes.yml +11 -0
- data/ro/posts/foobar +0 -0
- data/ro/posts/hello-world/attributes.yml +3 -0
- metadata +115 -9
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
Y2M5NmE2YmY3ZDgyYWFhNzZhMzE3MzFmOTgzNmJkNGE4YmM1M2U3Ng==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZWMxMzRkMWJhNmZlYmJkMTk4ODAzNjRhOTgxZGIxNWZhMjFkNjE0NQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTgyNDczMDY4ZjY1YTE0Nzg2MmZjN2RlYzU1NzdhNjVjNzY1YzE0NjA1ZGNl
|
10
|
+
OTNlMjQyODc1MGQyZGViMDA4MWFkN2ViNzRiM2ViODdiODYwY2ZiNTZhN2Vh
|
11
|
+
ZGUxOTU0YzZkMGUxNWFmNmY2ZTBiOWY3YWQxODg5OWFmZWE1NmE=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
N2JlYmYwOGJhYTlhYzY2YWI4ZDJkNzQ4MWY2OWE1NmE0YWVlMjllODZiNjEx
|
14
|
+
ZTI0OTQyNjkxNDVjMTBiZjc3ZmFhZDYyMjllMzkwYmU4OTQzNTY3NDVkMjQ4
|
15
|
+
MTJmNjM4ZThiOTQ4Mzk5MTliNTdmOGUxN2E5OTcxMzBiOTgyODQ=
|
data/:
ADDED
data/:w
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ro
|
2
|
+
class Db
|
3
|
+
fattr :root
|
4
|
+
|
5
|
+
def initialize(*args, &block)
|
6
|
+
options = Map.options_for!(args)
|
7
|
+
|
8
|
+
@root = String(args.shift || options[:root] || Ro.root)
|
9
|
+
end
|
10
|
+
|
11
|
+
def collections
|
12
|
+
end
|
13
|
+
|
14
|
+
def glob
|
15
|
+
end
|
16
|
+
|
17
|
+
def nodes
|
18
|
+
42
|
19
|
+
end
|
20
|
+
|
21
|
+
class Collection
|
22
|
+
fattr :basename
|
23
|
+
|
24
|
+
def initialize(basename)
|
25
|
+
@basename = basename.to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
NAME
|
2
|
+
----
|
3
|
+
|
4
|
+
ro
|
5
|
+
|
6
|
+
|
7
|
+
SYNOPSIS
|
8
|
+
--------
|
9
|
+
|
10
|
+
RTFC
|
11
|
+
|
12
|
+
|
13
|
+
DESCRIPTION
|
14
|
+
-----------
|
15
|
+
|
16
|
+
ro is library for managing your site's content in git, as god intended.
|
17
|
+
|
18
|
+
more details coming soon...
|
19
|
+
|
20
|
+
|
21
|
+
INSTALL
|
22
|
+
-------
|
23
|
+
|
24
|
+
gem install ro (coming soon)
|
25
|
+
|
26
|
+
|
27
|
+
DOCS
|
28
|
+
----
|
29
|
+
|
30
|
+
RTFC
|
data/Rakefile
CHANGED
@@ -59,8 +59,8 @@ end
|
|
59
59
|
|
60
60
|
task :gemspec do
|
61
61
|
ignore_extensions = ['git', 'svn', 'tmp', /sw./, 'bak', 'gem']
|
62
|
-
ignore_directories = ['pkg']
|
63
|
-
ignore_files = ['test/log', 'a.rb'] + Dir['db/*'] + %w'db'
|
62
|
+
ignore_directories = ['pkg', 'db']
|
63
|
+
ignore_files = ['test/log', 'test/db.yml', 'a.rb', 'b.rb'] + Dir['db/*'] + %w'db'
|
64
64
|
|
65
65
|
shiteless =
|
66
66
|
lambda do |list|
|
@@ -90,6 +90,16 @@ task :gemspec do
|
|
90
90
|
test_files = test(?e, "test/#{ lib }.rb") ? "test/#{ lib }.rb" : nil
|
91
91
|
summary = object.respond_to?(:summary) ? object.summary : "summary: #{ lib } kicks the ass"
|
92
92
|
description = object.respond_to?(:description) ? object.description : "description: #{ lib } kicks the ass"
|
93
|
+
license = object.respond_to?(:license) ? object.license : nil
|
94
|
+
|
95
|
+
if license.nil?
|
96
|
+
license =
|
97
|
+
begin
|
98
|
+
IO.binread('LICENSE')
|
99
|
+
rescue
|
100
|
+
"Same As Ruby's"
|
101
|
+
end
|
102
|
+
end
|
93
103
|
|
94
104
|
if This.extensions.nil?
|
95
105
|
This.extensions = []
|
@@ -127,6 +137,7 @@ task :gemspec do
|
|
127
137
|
spec.platform = Gem::Platform::RUBY
|
128
138
|
spec.summary = <%= lib.inspect %>
|
129
139
|
spec.description = <%= description.inspect %>
|
140
|
+
spec.license = <%= license.inspect %>
|
130
141
|
|
131
142
|
spec.files =\n<%= files.sort.pretty_inspect %>
|
132
143
|
spec.executables = <%= executables.inspect %>
|
@@ -293,7 +304,7 @@ BEGIN {
|
|
293
304
|
|
294
305
|
# discover full path to this ruby executable
|
295
306
|
#
|
296
|
-
c =
|
307
|
+
c = Config::CONFIG
|
297
308
|
bindir = c["bindir"] || c['BINDIR']
|
298
309
|
ruby_install_name = c['ruby_install_name'] || c['RUBY_INSTALL_NAME'] || 'ruby'
|
299
310
|
ruby_ext = c['EXEEXT'] || ''
|
data/lib/co/db.rb
ADDED
data/lib/co/node.rb
ADDED
data/lib/co/node/list.rb
ADDED
data/lib/co/util.rb
ADDED
data/lib/ro.rb
CHANGED
@@ -1,5 +1,184 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'pathname'
|
5
|
+
require 'yaml'
|
6
|
+
require 'digest/md5'
|
7
|
+
require 'logger'
|
8
|
+
|
9
|
+
#
|
10
|
+
module Ro
|
11
|
+
Version = '1.0.0' unless defined?(Version)
|
12
|
+
|
13
|
+
def version
|
14
|
+
Ro::Version
|
15
|
+
end
|
16
|
+
|
17
|
+
def dependencies
|
18
|
+
{
|
19
|
+
'map' => [ 'map' , ' >= 6.5.1' ] ,
|
20
|
+
'fattr' => [ 'fattr' , ' >= 2.2.1' ] ,
|
21
|
+
'tilt' => [ 'tilt' , ' >= 1.4.1' ] ,
|
22
|
+
'pygments' => [ 'pygments.rb' , ' >= 0.5.0' ] ,
|
23
|
+
'coerce' => [ 'coerce' , ' >= 0.0.4' ] ,
|
24
|
+
'stringex' => [ 'stringex' , ' >= 2.1.0' ] ,
|
25
|
+
# 'rails' => [ 'rails' , ' >= 3.1' ] ,
|
26
|
+
# 'tagz' => [ 'tagz' , ' >= 9.9.2' ] ,
|
27
|
+
# 'multi_json' => [ 'multi_json' , ' >= 1.0.3' ] ,
|
28
|
+
# 'uuidtools' => [ 'uuidtools' , ' >= 2.1.2' ] ,
|
29
|
+
# 'wrap' => [ 'wrap' , ' >= 1.5.0' ] ,
|
30
|
+
# 'rails_current' => [ 'rails_current' , ' >= 1.8.0' ] ,
|
31
|
+
# 'rails_errors2html' => [ 'rails_errors2html' , ' >= 1.3.0' ] ,
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def libdir(*args, &block)
|
36
|
+
@libdir ||= File.expand_path(__FILE__).sub(/\.rb$/,'')
|
37
|
+
args.empty? ? @libdir : File.join(@libdir, *args)
|
38
|
+
ensure
|
39
|
+
if block
|
40
|
+
begin
|
41
|
+
$LOAD_PATH.unshift(@libdir)
|
42
|
+
block.call()
|
43
|
+
ensure
|
44
|
+
$LOAD_PATH.shift()
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def load(*libs)
|
50
|
+
libs = libs.join(' ').scan(/[^\s+]+/)
|
51
|
+
Ro.libdir{ libs.each{|lib| Kernel.load(lib) } }
|
52
|
+
end
|
53
|
+
|
54
|
+
extend(Ro)
|
4
55
|
end
|
5
|
-
|
56
|
+
|
57
|
+
#
|
58
|
+
begin
|
59
|
+
require 'rubygems'
|
60
|
+
rescue LoadError
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
|
64
|
+
if defined?(gem)
|
65
|
+
Ro.dependencies.each do |lib, dependency|
|
66
|
+
gem(*dependency)
|
67
|
+
require(lib)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
%w[
|
72
|
+
fileutils
|
73
|
+
yaml
|
74
|
+
].each do |lib|
|
75
|
+
require lib
|
76
|
+
end
|
77
|
+
|
78
|
+
#
|
79
|
+
|
80
|
+
module Ro
|
81
|
+
Fattr(:root){
|
82
|
+
Root.new(
|
83
|
+
case
|
84
|
+
when defined?(Rails.root)
|
85
|
+
Rails.root.to_s
|
86
|
+
|
87
|
+
when defined?(Middleman::Application)
|
88
|
+
Middleman::Application.server.root.to_s
|
89
|
+
|
90
|
+
else
|
91
|
+
"./ro"
|
92
|
+
end
|
93
|
+
)
|
94
|
+
}
|
95
|
+
|
96
|
+
Fattr(:cache){
|
97
|
+
Cache.new
|
98
|
+
}
|
99
|
+
|
100
|
+
Fattr(:logger){
|
101
|
+
nil
|
102
|
+
}
|
103
|
+
|
104
|
+
def Ro.nodes(*args, &block)
|
105
|
+
root.nodes(*args, &block)
|
106
|
+
end
|
107
|
+
|
108
|
+
def Ro.relative_path(path, *args)
|
109
|
+
options = Map.options_for!(args)
|
110
|
+
path = File.expand_path(String(path))
|
111
|
+
relative = File.expand_path(String(args.shift || options[:relative] || options[:to]))
|
112
|
+
Pathname.new(path).relative_path_from(Pathname.new(relative)).to_s
|
113
|
+
end
|
114
|
+
|
115
|
+
def Ro.realpath(path)
|
116
|
+
Pathname.new(path.to_s).realpath
|
117
|
+
end
|
118
|
+
|
119
|
+
def Ro.md5(string)
|
120
|
+
Digest::MD5.hexdigest(string)
|
121
|
+
end
|
122
|
+
|
123
|
+
def Ro.debug!
|
124
|
+
@logger ||= (
|
125
|
+
logger = ::Logger.new(STDERR)
|
126
|
+
logger.level = ::Logger::DEBUG
|
127
|
+
logger
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
def Ro.log(*args, &block)
|
132
|
+
return if @logger.nil?
|
133
|
+
|
134
|
+
level =
|
135
|
+
if args.size == 1
|
136
|
+
:debug
|
137
|
+
else
|
138
|
+
args.shift
|
139
|
+
end
|
140
|
+
|
141
|
+
@logger.send(level, *args, &block)
|
142
|
+
end
|
143
|
+
|
144
|
+
def Ro.slug_for(*args, &block)
|
145
|
+
options = Map.options_for!(args)
|
146
|
+
options[:join] = '-'
|
147
|
+
args.push(options)
|
148
|
+
Slug.for(*args, &block)
|
149
|
+
end
|
150
|
+
|
151
|
+
def Ro.name_for(*args, &block)
|
152
|
+
options = Map.options_for!(args)
|
153
|
+
options[:join] = '_'
|
154
|
+
args.push(options)
|
155
|
+
Slug.for(*args, &block)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
#
|
160
|
+
module Kernel
|
161
|
+
def ro(*args, &block)
|
162
|
+
Ro.nodes(*args, &block)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
#
|
167
|
+
Ro.load %w[
|
168
|
+
|
169
|
+
initializers/tilt.rb
|
170
|
+
initializers/env.rb
|
171
|
+
|
172
|
+
slug.rb
|
173
|
+
blankslate.rb
|
174
|
+
util.rb
|
175
|
+
|
176
|
+
root.rb
|
177
|
+
|
178
|
+
cache.rb
|
179
|
+
|
180
|
+
template.rb
|
181
|
+
node.rb
|
182
|
+
node/list.rb
|
183
|
+
|
184
|
+
]
|
data/lib/ro/cache.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ro
|
2
|
+
class Cache < ::Hash
|
3
|
+
def write(key, value)
|
4
|
+
self[key] = value
|
5
|
+
end
|
6
|
+
|
7
|
+
def read(key, &block)
|
8
|
+
if has_key?(key)
|
9
|
+
self[key]
|
10
|
+
else
|
11
|
+
if block
|
12
|
+
value = block.call
|
13
|
+
write(key, value)
|
14
|
+
else
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/ro/db.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module Ro
|
2
|
+
class Db
|
3
|
+
fattr :root
|
4
|
+
|
5
|
+
def initialize(*args, &block)
|
6
|
+
options = Map.options_for!(args)
|
7
|
+
|
8
|
+
@root = String(args.shift || options[:root] || Ro.root)
|
9
|
+
end
|
10
|
+
|
11
|
+
def collections
|
12
|
+
@collections ||= Collection::List.new
|
13
|
+
|
14
|
+
Dir.glob(glob){|path| @collections.add(path)}
|
15
|
+
|
16
|
+
@collections
|
17
|
+
end
|
18
|
+
|
19
|
+
def glob
|
20
|
+
File.join(root, '*')
|
21
|
+
end
|
22
|
+
|
23
|
+
def nodes(*args, &block)
|
24
|
+
collections.map do |collection|
|
25
|
+
collection.nodes(*args, &block)
|
26
|
+
end.flatten
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Ro
|
2
|
+
class Db
|
3
|
+
class Collection
|
4
|
+
class List < ::Array
|
5
|
+
def add(path)
|
6
|
+
name = File.basename(path.to_s)
|
7
|
+
|
8
|
+
unless any?{|c| c.name == name }
|
9
|
+
collection = Collection.new(path)
|
10
|
+
push(collection)
|
11
|
+
sort!{|a,b| a.name <=> b.name}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
fattr :path
|
17
|
+
|
18
|
+
def initialize(path)
|
19
|
+
@path = Util.realpath(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def basename
|
23
|
+
File.basename(@path)
|
24
|
+
end
|
25
|
+
|
26
|
+
def name
|
27
|
+
basename
|
28
|
+
end
|
29
|
+
|
30
|
+
def dirname
|
31
|
+
File.dirname(@path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def glob
|
35
|
+
File.join(@path, '*')
|
36
|
+
end
|
37
|
+
|
38
|
+
def nodes
|
39
|
+
Dir.glob(glob).map do |path|
|
40
|
+
next unless test(?d, path)
|
41
|
+
Ro::Node.new(path)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Tilt
|
4
|
+
class SyntaxHighlightingRedcarpetTemplate < Template
|
5
|
+
self.default_mime_type = 'text/html'
|
6
|
+
|
7
|
+
def self.engine_initialized?
|
8
|
+
defined?(::Redcarpet) && defined?(::Pygments) && defined?(::ERB)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize_engine
|
12
|
+
require_template_library('redcarpet')
|
13
|
+
require_template_library('pygments')
|
14
|
+
require_template_library('erb')
|
15
|
+
end
|
16
|
+
|
17
|
+
def prepare
|
18
|
+
@engine =
|
19
|
+
Redcarpet::Markdown.new(
|
20
|
+
syntax_highlighting_renderer,
|
21
|
+
|
22
|
+
:no_intra_emphasis => true,
|
23
|
+
:tables => true,
|
24
|
+
:fenced_code_blocks => true,
|
25
|
+
:autolink => true,
|
26
|
+
:strikethrough => true,
|
27
|
+
:lax_html_blocks => true,
|
28
|
+
:space_after_headers => true,
|
29
|
+
:superscript => true
|
30
|
+
)
|
31
|
+
|
32
|
+
@output = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def syntax_highlighting_renderer
|
36
|
+
Class.new(Redcarpet::Render::HTML) do
|
37
|
+
def block_code(code, language)
|
38
|
+
language = 'ruby' if language.to_s.strip.empty?
|
39
|
+
::Pygments.highlight(code, :lexer => language, :options => {:encoding => 'utf-8'})
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def evaluate(scope, locals, &block)
|
45
|
+
binding =
|
46
|
+
if scope.is_a?(::Binding)
|
47
|
+
scope
|
48
|
+
else
|
49
|
+
scope.instance_eval{ ::Kernel.binding }
|
50
|
+
end
|
51
|
+
|
52
|
+
@engine.render(erb(data, binding))
|
53
|
+
end
|
54
|
+
|
55
|
+
def erb(string, binding)
|
56
|
+
string
|
57
|
+
end
|
58
|
+
|
59
|
+
def allows_script?
|
60
|
+
true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class ERBSyntaxHighlightingRedcarpetTemplate < SyntaxHighlightingRedcarpetTemplate
|
65
|
+
def erb(string, binding)
|
66
|
+
::ERB.new(string).result(binding)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
Tilt.prefer(Tilt::SyntaxHighlightingRedcarpetTemplate, 'md')
|
72
|
+
Tilt.prefer(Tilt::SyntaxHighlightingRedcarpetTemplate, 'markdown')
|
73
|
+
Tilt.prefer(Tilt::ERBSyntaxHighlightingRedcarpetTemplate, 'md.erb')
|
74
|
+
Tilt.prefer(Tilt::ERBSyntaxHighlightingRedcarpetTemplate, 'markdown.erb')
|
75
|
+
|
76
|
+
|
77
|
+
if $0 == __FILE__
|
78
|
+
|
79
|
+
markdown = <<-__
|
80
|
+
* one
|
81
|
+
* two
|
82
|
+
* <%= :three %>
|
83
|
+
* <%= @x %>
|
84
|
+
|
85
|
+
```rb
|
86
|
+
@a = 42
|
87
|
+
yield
|
88
|
+
```
|
89
|
+
__
|
90
|
+
|
91
|
+
template = Tilt['md.erb'].new{ markdown }
|
92
|
+
|
93
|
+
object = Object.new.instance_eval{ @x = :four; self }
|
94
|
+
|
95
|
+
puts template.render(object)
|
96
|
+
|
97
|
+
end
|
data/lib/ro/node.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
module Ro
|
2
|
+
class Node
|
3
|
+
fattr :root
|
4
|
+
fattr :path
|
5
|
+
fattr :name
|
6
|
+
fattr :type
|
7
|
+
fattr :loaded
|
8
|
+
|
9
|
+
def initialize(path)
|
10
|
+
@path = Ro.realpath(path.to_s)
|
11
|
+
@name = File.basename(@path)
|
12
|
+
@type = File.basename(File.dirname(@path))
|
13
|
+
@root = Ro::Root.new(File.dirname(File.dirname(@path)))
|
14
|
+
@loaded = false
|
15
|
+
@attributes = nil
|
16
|
+
@in_method_missing = false
|
17
|
+
end
|
18
|
+
|
19
|
+
def id
|
20
|
+
@name
|
21
|
+
end
|
22
|
+
|
23
|
+
def identifier
|
24
|
+
"#{ type }/#{ name }"
|
25
|
+
end
|
26
|
+
|
27
|
+
def inspect
|
28
|
+
#"#{ self.class.name }(#{ type }/#{ name })"
|
29
|
+
identifier
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
inpsect
|
34
|
+
end
|
35
|
+
|
36
|
+
def basename
|
37
|
+
name
|
38
|
+
end
|
39
|
+
|
40
|
+
def method_missing(method, *args, &block)
|
41
|
+
Ro.log "Ro::Node(#{ identifier })#method_missing(#{ method.inspect }, #{ args.inspect })"
|
42
|
+
|
43
|
+
in_method_missing = !!@in_method_missing
|
44
|
+
|
45
|
+
return super if in_method_missing
|
46
|
+
|
47
|
+
@in_method_missing = true
|
48
|
+
|
49
|
+
_load do
|
50
|
+
key = method.to_s
|
51
|
+
|
52
|
+
return(
|
53
|
+
if @attributes.has_key?(key)
|
54
|
+
@attributes[key]
|
55
|
+
else
|
56
|
+
super
|
57
|
+
end
|
58
|
+
)
|
59
|
+
end
|
60
|
+
ensure
|
61
|
+
@in_method_missing = in_method_missing
|
62
|
+
end
|
63
|
+
|
64
|
+
def attributes
|
65
|
+
_load{ @attributes }
|
66
|
+
end
|
67
|
+
|
68
|
+
def instance_eval(*args, &block)
|
69
|
+
_load{ super }
|
70
|
+
end
|
71
|
+
|
72
|
+
def related(*args, &block)
|
73
|
+
_load{
|
74
|
+
related = @attributes.get(:related) || Map.new
|
75
|
+
nodes = List.new(root)
|
76
|
+
list = root.nodes
|
77
|
+
which = Coerce.list_of_strings(args)
|
78
|
+
|
79
|
+
related.each do |relationship, value|
|
80
|
+
unless which.empty?
|
81
|
+
next unless which.include?(relationship.to_s)
|
82
|
+
end
|
83
|
+
|
84
|
+
type, names =
|
85
|
+
case value
|
86
|
+
when Hash
|
87
|
+
value.to_a.first
|
88
|
+
else
|
89
|
+
[relationship, value]
|
90
|
+
end
|
91
|
+
|
92
|
+
names = Coerce.list_of_strings(names)
|
93
|
+
|
94
|
+
names.each do |name|
|
95
|
+
identifier = "#{ type }/#{ name }"
|
96
|
+
node = list.index[identifier]
|
97
|
+
node._load{ nodes.add(node) }
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
case
|
102
|
+
when block.nil?
|
103
|
+
nodes
|
104
|
+
|
105
|
+
when block
|
106
|
+
nodes.where(&block)
|
107
|
+
end
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
class Related
|
112
|
+
fattr :attributes
|
113
|
+
|
114
|
+
def initialize(attributes)
|
115
|
+
@attributes = attributes
|
116
|
+
end
|
117
|
+
|
118
|
+
def all
|
119
|
+
related = @attributes.get(:related) || Map.new
|
120
|
+
names = related.keys
|
121
|
+
self[names]
|
122
|
+
end
|
123
|
+
|
124
|
+
def [](name)
|
125
|
+
name = File.basename(name.to_s)
|
126
|
+
|
127
|
+
value = @attributes.get(:related, name)
|
128
|
+
|
129
|
+
type, names =
|
130
|
+
case value
|
131
|
+
when Hash
|
132
|
+
value.to_a.first
|
133
|
+
else
|
134
|
+
[name, value]
|
135
|
+
end
|
136
|
+
|
137
|
+
names = Array(names).flatten.compact.uniq
|
138
|
+
|
139
|
+
list = ro[type]
|
140
|
+
|
141
|
+
list.where(*names)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def _load(&block)
|
146
|
+
unless @loaded
|
147
|
+
@loaded = _load_from_cache_or_disk
|
148
|
+
end
|
149
|
+
|
150
|
+
block ? block.call : @loaded
|
151
|
+
end
|
152
|
+
|
153
|
+
def _load_from_cache_or_disk
|
154
|
+
cache_key = _cache_key
|
155
|
+
|
156
|
+
cached = Ro.cache.read(cache_key)
|
157
|
+
|
158
|
+
if cached
|
159
|
+
Ro.log "loading #{ identifier } from cache"
|
160
|
+
@attributes = Map.new.update(cached)
|
161
|
+
:cache
|
162
|
+
else
|
163
|
+
Ro.log "loading #{ identifier } from disk"
|
164
|
+
@attributes = Map.new
|
165
|
+
_load_attributes_yml
|
166
|
+
#_load_attribute_templates
|
167
|
+
#_load_sources
|
168
|
+
Ro.cache.write(cache_key, @attributes)
|
169
|
+
:disk
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def _load_attributes_yml
|
174
|
+
if test(?s, _attributes_yml)
|
175
|
+
buf = IO.binread(_attributes_yml)
|
176
|
+
data = YAML.load(buf)
|
177
|
+
data = data.is_a?(Hash) ? data : {'_' => data}
|
178
|
+
@attributes.update(data)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def _cache_key
|
183
|
+
glob = File.join(@path, '**/**')
|
184
|
+
|
185
|
+
entries = []
|
186
|
+
|
187
|
+
Dir.glob(glob) do |entry|
|
188
|
+
stat =
|
189
|
+
begin
|
190
|
+
File.stat(entry)
|
191
|
+
rescue
|
192
|
+
next
|
193
|
+
end
|
194
|
+
|
195
|
+
timestamp = [stat.ctime, stat.mtime].max
|
196
|
+
relative_path = Ro.relative_path(entry, :to => @path)
|
197
|
+
entries.push([relative_path, timestamp.iso8601(2)])
|
198
|
+
end
|
199
|
+
|
200
|
+
signature = entries.map{|pair| pair.join('@')}.join(', ')
|
201
|
+
|
202
|
+
md5 = Ro.md5(signature)
|
203
|
+
|
204
|
+
"#{ @path }-#{ md5 }"
|
205
|
+
end
|
206
|
+
|
207
|
+
def _load_from_cache
|
208
|
+
false
|
209
|
+
end
|
210
|
+
|
211
|
+
def _attributes_yml
|
212
|
+
File.join(@path, 'attributes.yml')
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
data/lib/ro/node/list.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
module Ro
|
2
|
+
class Node
|
3
|
+
class List < ::Array
|
4
|
+
fattr :root
|
5
|
+
fattr :type
|
6
|
+
fattr :index
|
7
|
+
|
8
|
+
def initialize(*args, &block)
|
9
|
+
options = Map.options_for!(args)
|
10
|
+
|
11
|
+
root = args.shift || options[:root]
|
12
|
+
type = args.shift || options[:type]
|
13
|
+
|
14
|
+
@root = Root.new(root)
|
15
|
+
@type = type.nil? ? nil : String(type)
|
16
|
+
@index = {}
|
17
|
+
|
18
|
+
block.call(self) if block
|
19
|
+
end
|
20
|
+
|
21
|
+
def load(path)
|
22
|
+
add( node = Node.new(path) )
|
23
|
+
end
|
24
|
+
|
25
|
+
def add(node)
|
26
|
+
return nil if node.nil?
|
27
|
+
|
28
|
+
unless index.has_key?(node.identifier)
|
29
|
+
push(node)
|
30
|
+
index[node.identifier] = node
|
31
|
+
node
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def related(*args, &block)
|
38
|
+
related = List.new(root)
|
39
|
+
|
40
|
+
each do |node|
|
41
|
+
node.related(*args, &block).each do |related_node|
|
42
|
+
related.add(related_node)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
related
|
47
|
+
end
|
48
|
+
|
49
|
+
def [](key)
|
50
|
+
if @type.nil?
|
51
|
+
type = key.to_s
|
52
|
+
list = select{|node| type == node.type}
|
53
|
+
list.type = type
|
54
|
+
list
|
55
|
+
else
|
56
|
+
name = key.to_s
|
57
|
+
detect{|node| name == node.name}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def select(*args, &block)
|
62
|
+
List.new(root){|list| list.replace(super)}
|
63
|
+
end
|
64
|
+
|
65
|
+
def where(*args, &block)
|
66
|
+
case
|
67
|
+
when !args.empty? && block
|
68
|
+
raise ArgumentError.new
|
69
|
+
|
70
|
+
when args.empty? && block
|
71
|
+
select{|node| node.instance_eval(&block)}
|
72
|
+
|
73
|
+
when !args.empty?
|
74
|
+
names = args.flatten.compact.uniq.map{|arg| arg.to_s}
|
75
|
+
index = names.inject(Hash.new){|h,name| h.update(name => name)}
|
76
|
+
select{|node| index[node.name]}
|
77
|
+
|
78
|
+
else
|
79
|
+
raise ArgumentError.new
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def find(*args, &block)
|
84
|
+
case
|
85
|
+
when !args.empty? && block
|
86
|
+
raise ArgumentError.new
|
87
|
+
when args.empty? && block
|
88
|
+
detect{|node| node.instance_eval(&block)}
|
89
|
+
|
90
|
+
when args.size == 1
|
91
|
+
name = args.first.to_s
|
92
|
+
detect{|node| node.name == name}
|
93
|
+
|
94
|
+
when args.size > 1
|
95
|
+
where(*args, &block)
|
96
|
+
|
97
|
+
else
|
98
|
+
raise ArgumentError.new
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def identifier
|
103
|
+
[root, type].compact.join('/')
|
104
|
+
end
|
105
|
+
|
106
|
+
def method_missing(method, *args, &block)
|
107
|
+
Ro.log "Ro::List(#{ identifier })#method_missing(#{ method.inspect }, #{ args.inspect })"
|
108
|
+
|
109
|
+
in_method_missing = !!@in_method_missing
|
110
|
+
|
111
|
+
return super if in_method_missing
|
112
|
+
|
113
|
+
@in_method_missing = true
|
114
|
+
|
115
|
+
if @scope.nil?
|
116
|
+
type = method.to_s
|
117
|
+
list = self[type]
|
118
|
+
super unless list
|
119
|
+
list.empty? ? super : list
|
120
|
+
else
|
121
|
+
name = Ro.slug_for(method)
|
122
|
+
node = self[name]
|
123
|
+
node.nil? ? super : node
|
124
|
+
end
|
125
|
+
ensure
|
126
|
+
@in_method_missing = in_method_missing
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
data/lib/ro/root.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Ro
|
2
|
+
class Root < ::String
|
3
|
+
def initialize(root)
|
4
|
+
super(Util.realpath(root.to_s))
|
5
|
+
ensure
|
6
|
+
raise ArgumentError.new("root=#{ root.inspect }") if root.nil?
|
7
|
+
raise ArgumentError.new("root=#{ root.inpsect }") unless test(?d, root)
|
8
|
+
end
|
9
|
+
|
10
|
+
def root
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def nodes
|
15
|
+
Node::List.new(root) do |list|
|
16
|
+
node_directories do |path|
|
17
|
+
list.load(path)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def directories(&block)
|
23
|
+
Dir.glob(File.join(root, '*/'), &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def node_directories(&block)
|
27
|
+
Dir.glob(File.join(root, '*/*/'), &block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/ro/slug.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Ro
|
2
|
+
class Slug < ::String
|
3
|
+
Join = '-'
|
4
|
+
|
5
|
+
def Slug.for(*args)
|
6
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
7
|
+
join = (options[:join]||options['join']||Join).to_s
|
8
|
+
string = args.flatten.compact.join(join)
|
9
|
+
string = unidecode(string)
|
10
|
+
words = string.to_s.scan(%r|[/\w]+|)
|
11
|
+
words.map!{|word| word.gsub %r|[^/0-9a-zA-Z_-]|, ''}
|
12
|
+
words.delete_if{|word| word.nil? or word.strip.empty?}
|
13
|
+
new(words.join(join).downcase.gsub('/', (join * 2)))
|
14
|
+
end
|
15
|
+
|
16
|
+
unless defined?(Stringex::Unidecoder)
|
17
|
+
def Slug.unidecode(string)
|
18
|
+
string
|
19
|
+
end
|
20
|
+
else
|
21
|
+
def Slug.unidecode(string)
|
22
|
+
Stringex::Unidecoder.decode(string)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/ro/template.rb
ADDED
data/lib/ro/util.rb
ADDED
data/notes/ara.txt
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
todo:
|
2
|
+
- need source file loading
|
3
|
+
|
4
|
+
- need asset/url_for management
|
5
|
+
|
6
|
+
- ./bin/ro shell
|
7
|
+
- binding of all nodes?
|
8
|
+
|
9
|
+
- a real live test suite
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
done:
|
15
|
+
- need relationships
|
16
|
+
- ro.posts.related
|
17
|
+
- ro.posts.related.tags
|
18
|
+
- ro.posts.related[:tags]
|
19
|
+
- ro.posts.first.related.tags
|
20
|
+
- ro.posts.first.related[:tags]
|
21
|
+
- to_ary should not cause loading to fire
|
22
|
+
- node_sets
|
23
|
+
- ro -> node_set
|
24
|
+
- ro.posts -> node_set
|
25
|
+
- ro.posts
|
26
|
+
- should rollection be 'directory.ls'
|
27
|
+
- basic lib structure
|
28
|
+
- awesome tilt methods
|
29
|
+
- an extremely clever cache
|
30
|
+
- instrument logging/debugging
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
ro # all nodes
|
42
|
+
|
43
|
+
ro.posts #=> set of all post nodes
|
44
|
+
|
45
|
+
ro.posts.tags #=> set of all tags related to any post
|
46
|
+
|
47
|
+
ro.tags.posts #=> set of all posts related to any tag
|
48
|
+
|
49
|
+
ro.posts{ name == 'foobar' }
|
50
|
+
|
51
|
+
ro.posts.first.tags
|
52
|
+
|
53
|
+
ro.posts.page(10, :per => 10)
|
54
|
+
|
55
|
+
ro.posts.first.url_for(:foobar)
|
56
|
+
|
57
|
+
ro/people/foo-bar/attributes.yaml
|
58
|
+
ro/people/foo-bar/attributes.yml
|
59
|
+
ro/people/foo-bar/bio.md
|
60
|
+
ro/people/foo-bar/source/a.rb
|
61
|
+
ro/people/foo-bar/assets/mugshot.png
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
require 'ro/model'
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
----
|
73
|
+
|
74
|
+
class People < Ro::Model
|
75
|
+
root :people
|
76
|
+
end
|
77
|
+
|
78
|
+
Ro.root
|
79
|
+
|
80
|
+
Ro.nodes
|
81
|
+
|
82
|
+
def ro(*args, &block)
|
83
|
+
Ro.nodes(*args, &block)
|
84
|
+
end
|
data/ro.gemspec
CHANGED
@@ -3,13 +3,55 @@
|
|
3
3
|
|
4
4
|
Gem::Specification::new do |spec|
|
5
5
|
spec.name = "ro"
|
6
|
-
spec.version = "0.0
|
6
|
+
spec.version = "1.0.0"
|
7
7
|
spec.platform = Gem::Platform::RUBY
|
8
8
|
spec.summary = "ro"
|
9
9
|
spec.description = "description: ro kicks the ass"
|
10
|
+
spec.license = "Same As Ruby's"
|
10
11
|
|
11
12
|
spec.files =
|
12
|
-
["
|
13
|
+
[":",
|
14
|
+
":w",
|
15
|
+
"=p",
|
16
|
+
"README.md",
|
17
|
+
"Rakefile",
|
18
|
+
"lib",
|
19
|
+
"lib/co",
|
20
|
+
"lib/co/db.rb",
|
21
|
+
"lib/co/node",
|
22
|
+
"lib/co/node.rb",
|
23
|
+
"lib/co/node/list.rb",
|
24
|
+
"lib/co/util.rb",
|
25
|
+
"lib/lib",
|
26
|
+
"lib/ro",
|
27
|
+
"lib/ro.rb",
|
28
|
+
"lib/ro/blankslate.rb",
|
29
|
+
"lib/ro/cache.rb",
|
30
|
+
"lib/ro/db",
|
31
|
+
"lib/ro/db.rb",
|
32
|
+
"lib/ro/db/collection",
|
33
|
+
"lib/ro/db/collection.rb",
|
34
|
+
"lib/ro/initializers",
|
35
|
+
"lib/ro/initializers/env.rb",
|
36
|
+
"lib/ro/initializers/tilt.rb",
|
37
|
+
"lib/ro/node",
|
38
|
+
"lib/ro/node.rb",
|
39
|
+
"lib/ro/node/list.rb",
|
40
|
+
"lib/ro/root.rb",
|
41
|
+
"lib/ro/slug.rb",
|
42
|
+
"lib/ro/template.rb",
|
43
|
+
"lib/ro/util.rb",
|
44
|
+
"notes",
|
45
|
+
"notes/ara.txt",
|
46
|
+
"ro",
|
47
|
+
"ro.gemspec",
|
48
|
+
"ro/people",
|
49
|
+
"ro/people/ara",
|
50
|
+
"ro/people/ara/attributes.yml",
|
51
|
+
"ro/posts",
|
52
|
+
"ro/posts/foobar",
|
53
|
+
"ro/posts/hello-world",
|
54
|
+
"ro/posts/hello-world/attributes.yml"]
|
13
55
|
|
14
56
|
spec.executables = []
|
15
57
|
|
@@ -18,6 +60,18 @@ Gem::Specification::new do |spec|
|
|
18
60
|
spec.test_files = nil
|
19
61
|
|
20
62
|
|
63
|
+
spec.add_dependency(*["map", " >= 6.5.1"])
|
64
|
+
|
65
|
+
spec.add_dependency(*["fattr", " >= 2.2.1"])
|
66
|
+
|
67
|
+
spec.add_dependency(*["tilt", " >= 1.4.1"])
|
68
|
+
|
69
|
+
spec.add_dependency(*["pygments.rb", " >= 0.5.0"])
|
70
|
+
|
71
|
+
spec.add_dependency(*["coerce", " >= 0.0.4"])
|
72
|
+
|
73
|
+
spec.add_dependency(*["stringex", " >= 2.1.0"])
|
74
|
+
|
21
75
|
|
22
76
|
spec.extensions.push(*[])
|
23
77
|
|
data/ro/posts/foobar
ADDED
File without changes
|
metadata
CHANGED
@@ -1,47 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ara T. Howard
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
11
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: map
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.5.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.5.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fattr
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.2.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.2.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tilt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.4.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.4.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pygments.rb
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.5.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.5.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: coerce
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.0.4
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.0.4
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: stringex
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.1.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.1.0
|
14
97
|
description: ! 'description: ro kicks the ass'
|
15
98
|
email: ara.t.howard@gmail.com
|
16
99
|
executables: []
|
17
100
|
extensions: []
|
18
101
|
extra_rdoc_files: []
|
19
102
|
files:
|
103
|
+
- ! ':'
|
104
|
+
- ':w'
|
105
|
+
- README.md
|
20
106
|
- Rakefile
|
107
|
+
- lib/co/db.rb
|
108
|
+
- lib/co/node.rb
|
109
|
+
- lib/co/node/list.rb
|
110
|
+
- lib/co/util.rb
|
21
111
|
- lib/ro.rb
|
112
|
+
- lib/ro/blankslate.rb
|
113
|
+
- lib/ro/cache.rb
|
114
|
+
- lib/ro/db.rb
|
115
|
+
- lib/ro/db/collection.rb
|
116
|
+
- lib/ro/initializers/env.rb
|
117
|
+
- lib/ro/initializers/tilt.rb
|
118
|
+
- lib/ro/node.rb
|
119
|
+
- lib/ro/node/list.rb
|
120
|
+
- lib/ro/root.rb
|
121
|
+
- lib/ro/slug.rb
|
122
|
+
- lib/ro/template.rb
|
123
|
+
- lib/ro/util.rb
|
124
|
+
- notes/ara.txt
|
22
125
|
- ro.gemspec
|
126
|
+
- ro/people/ara/attributes.yml
|
127
|
+
- ro/posts/foobar
|
128
|
+
- ro/posts/hello-world/attributes.yml
|
23
129
|
homepage: https://github.com/ahoward/ro
|
24
|
-
licenses:
|
130
|
+
licenses:
|
131
|
+
- Same As Ruby's
|
132
|
+
metadata: {}
|
25
133
|
post_install_message:
|
26
134
|
rdoc_options: []
|
27
135
|
require_paths:
|
28
136
|
- lib
|
29
137
|
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
-
none: false
|
31
138
|
requirements:
|
32
139
|
- - ! '>='
|
33
140
|
- !ruby/object:Gem::Version
|
34
141
|
version: '0'
|
35
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
143
|
requirements:
|
38
144
|
- - ! '>='
|
39
145
|
- !ruby/object:Gem::Version
|
40
146
|
version: '0'
|
41
147
|
requirements: []
|
42
148
|
rubyforge_project: codeforpeople
|
43
|
-
rubygems_version:
|
149
|
+
rubygems_version: 2.0.3
|
44
150
|
signing_key:
|
45
|
-
specification_version:
|
151
|
+
specification_version: 4
|
46
152
|
summary: ro
|
47
153
|
test_files: []
|