commaparty 0.0.2 → 0.0.3pre
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 +4 -4
- data/README.md +0 -2
- data/Rakefile +0 -5
- data/lib/commaparty/markup.rb +7 -20
- data/lib/commaparty/version.rb +1 -1
- data/lib/commaparty/xml.rb +9 -2
- data/lib/commaparty.rb +0 -4
- data/spec/commaparty/destructure_element_spec.rb +1 -1
- data/spec/commaparty/markup_spec.rb +10 -143
- data/spec/commaparty/parse_body_spec.rb +1 -1
- data/spec/commaparty_spec.rb +17 -23
- metadata +4 -5
- data/lib/commaparty/.markup.rb.swn +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ccf4025df7a717391079619f63559d9018095a7
|
4
|
+
data.tar.gz: 1245299fe3cca38daa9748b5e4db70ba8fdd15c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 374c05013a8e124e6a993192866604231007c6f9c8cdaccbb0ae711afebe49a832aa4c773444763f208f04db9a1699fc0eff8c509c022e817e451bcb14dda2f2
|
7
|
+
data.tar.gz: b646a876669d879644a3aef76d10aa7cd7ecb788cc4ee548f78f7786efda463d2421ed903ee74f10b913ee0156d943c28301ecee6808a5193376c1340dc45905
|
data/README.md
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
CommaParty
|
2
2
|
======
|
3
|
-
[](https://travis-ci.org/ecmendenhall/commaparty)
|
4
|
-
|
5
3
|
CommaParty is a Ruby implementation of Clojure's
|
6
4
|
[Hiccup](https://github.com/weavejester/hiccup/) HTML generation library.
|
7
5
|
It uses arrays to represent elements, and hashes to represent an element's
|
data/Rakefile
CHANGED
data/lib/commaparty/markup.rb
CHANGED
@@ -9,36 +9,29 @@ module CommaParty
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def call
|
12
|
-
build(@hiccup).doc.to_html
|
13
|
-
end
|
14
|
-
|
15
|
-
def builder
|
16
12
|
build(@hiccup)
|
17
13
|
end
|
18
14
|
|
19
|
-
def hiccup
|
20
|
-
@hiccup.flatten(1)
|
21
|
-
end
|
22
|
-
|
23
15
|
private
|
24
16
|
|
25
17
|
def build(elements)
|
26
|
-
Nokogiri::XML::Builder.new do |doc|
|
27
|
-
|
28
|
-
|
18
|
+
doc = Nokogiri::XML::Builder.new do |doc|
|
19
|
+
doc.root do |root|
|
20
|
+
elements.each do |element|
|
21
|
+
create_child(root, element)
|
22
|
+
end
|
29
23
|
end
|
30
|
-
end
|
24
|
+
end.doc.root.children.to_html
|
31
25
|
end
|
32
26
|
|
33
27
|
def create_child(node, element)
|
34
|
-
return if element == []
|
35
28
|
tag, attributes, children = CommaParty::DestructureElement.new(element).call
|
36
29
|
node.send(tag, attributes) {|n| make_nodes(n, children) }
|
37
30
|
end
|
38
31
|
|
39
32
|
def make_nodes(parent, children)
|
40
33
|
children.each do |child|
|
41
|
-
if
|
34
|
+
if child.is_a?(String) || child.is_a?(Fixnum) || child.nil?
|
42
35
|
parent << child.to_s
|
43
36
|
else
|
44
37
|
create_child(parent, child)
|
@@ -46,11 +39,5 @@ module CommaParty
|
|
46
39
|
end
|
47
40
|
end
|
48
41
|
|
49
|
-
def terminal?(child)
|
50
|
-
child.is_a?(String) ||
|
51
|
-
child.is_a?(Fixnum) ||
|
52
|
-
child.nil?
|
53
|
-
end
|
54
|
-
|
55
42
|
end
|
56
43
|
end
|
data/lib/commaparty/version.rb
CHANGED
data/lib/commaparty/xml.rb
CHANGED
@@ -9,13 +9,20 @@ module CommaParty
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def initialize(markup)
|
12
|
-
@markup = CommaParty::Markup.new(markup)
|
12
|
+
@markup = CommaParty::Markup.new(markup).call
|
13
13
|
end
|
14
14
|
|
15
15
|
def call
|
16
|
-
@markup
|
16
|
+
build(@markup)
|
17
17
|
end
|
18
18
|
|
19
|
+
private
|
20
|
+
|
21
|
+
def build(markup)
|
22
|
+
Nokogiri::XML::Builder.new do |doc|
|
23
|
+
doc << markup
|
24
|
+
end.to_xml
|
25
|
+
end
|
19
26
|
end
|
20
27
|
|
21
28
|
end
|
data/lib/commaparty.rb
CHANGED
@@ -46,7 +46,7 @@ describe CommaParty::DestructureElement do
|
|
46
46
|
expect(body).to eq([[:li, "one"], [:li, "two"], [:li, "three"]])
|
47
47
|
end
|
48
48
|
|
49
|
-
it '
|
49
|
+
it 'wat' do
|
50
50
|
tag, attributes, body = described_class.new([:p, [:em, "hello"]]).call
|
51
51
|
expect(tag).to eq(:p_)
|
52
52
|
expect(attributes).to eq({})
|
@@ -7,180 +7,47 @@ describe CommaParty::Markup do
|
|
7
7
|
|
8
8
|
it 'generates a single tag' do
|
9
9
|
html = described_class.new([:tag]).call
|
10
|
-
expect(html).to eq("<tag></tag
|
10
|
+
expect(html).to eq("<tag></tag>")
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'generates a single tag with an attribute' do
|
14
14
|
html = described_class.new([:tag, {attribute: 'something'}]).call
|
15
|
-
expect(html).to eq("<tag attribute=\"something\"></tag
|
15
|
+
expect(html).to eq("<tag attribute=\"something\"></tag>")
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'generates a single tag with a value' do
|
19
19
|
html = described_class.new([:tag, 'value']).call
|
20
|
-
expect(html).to eq("<tag>value</tag
|
20
|
+
expect(html).to eq("<tag>value</tag>")
|
21
21
|
end
|
22
22
|
|
23
23
|
it 'generates two sibling tags' do
|
24
24
|
html = described_class.new([:div, [:tag1], [:tag2]]).call
|
25
|
-
expect(html).to eq("<div>\n<tag1></tag1><tag2></tag2>\n</div
|
25
|
+
expect(html).to eq("<div>\n<tag1></tag1><tag2></tag2>\n</div>")
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'generates nested tags' do
|
29
|
-
|
30
|
-
html
|
31
|
-
expect(html).to eq("<parent><tag1><tag2><tag3><tag4>deep<tag5>nesting</tag5></tag4></tag3></tag2></tag1></parent>\n")
|
29
|
+
html = described_class.new([:theparent, [:tag1], [:tag2]]).call
|
30
|
+
expect(html).to eq("<theparent><tag1></tag1><tag2></tag2></theparent>")
|
32
31
|
end
|
33
32
|
|
34
33
|
it 'handles tags with the same names as ruby methods' do
|
35
34
|
html = described_class.new([:parent]).call
|
36
|
-
expect(html).to eq("<parent></parent
|
35
|
+
expect(html).to eq("<parent></parent>")
|
37
36
|
end
|
38
37
|
|
39
38
|
it 'handles tags with shortcut syntax' do
|
40
39
|
html = described_class.new([:'tag.one.two.three#id']).call
|
41
|
-
expect(html).to eq("<tag class=\"one two three\" id=\"id\"></tag
|
40
|
+
expect(html).to eq("<tag class=\"one two three\" id=\"id\"></tag>")
|
42
41
|
end
|
43
42
|
|
44
43
|
it 'handles seqs in the tag body' do
|
45
44
|
html = described_class.new([:ul, ["one", "two", "three"].map {|n| [:li, n]}]).call
|
46
|
-
expect(html).to eq("<ul>\n<li>one</li>\n<li>two</li>\n<li>three</li>\n</ul
|
45
|
+
expect(html).to eq("<ul>\n<li>one</li>\n<li>two</li>\n<li>three</li>\n</ul>")
|
47
46
|
end
|
48
47
|
|
49
48
|
it 'handles nils in the tag body' do
|
50
49
|
html = described_class.new([:div, nil]).call
|
51
|
-
expect(html).to eq("<div></div
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'handles empty arrays in the tag body' do
|
55
|
-
html = described_class.new([:div, [], 'he', [[]], 'llo']).call
|
56
|
-
expect(html).to eq("<div>hello</div>\n")
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe 'Generating builders' do
|
61
|
-
|
62
|
-
it 'returns a Nokogiri builder' do
|
63
|
-
builder = described_class.new([:div]).builder
|
64
|
-
expect(builder.class).to eq(Nokogiri::XML::Builder)
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'produces the same XML' do
|
68
|
-
markup = described_class.new([:div, [:span, 'lol']])
|
69
|
-
expect(markup.builder.doc.to_html).to eq(markup.call)
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
describe 'Retrieving hiccup' do
|
75
|
-
|
76
|
-
it 'returns its hiccup' do
|
77
|
-
hiccup = described_class.new([:div, [:ul, (1..3).map {|n| [:li, n]}]]).hiccup
|
78
|
-
expect(hiccup).to eq([:div, [:ul, [[:li, 1], [:li, 2], [:li, 3]]]])
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
describe 'Hiccup specs' do
|
84
|
-
|
85
|
-
describe 'basic tags' do
|
86
|
-
specify { expect(described_class.new([:div]).call).to eq("<div></div>\n") }
|
87
|
-
specify { expect(described_class.new(["div"]).call).to eq("<div></div>\n") }
|
88
|
-
end
|
89
|
-
|
90
|
-
describe 'tag syntax sugar' do
|
91
|
-
specify { expect(described_class.new([:'div#foo']).call).to eq("<div id=\"foo\"></div>\n") }
|
92
|
-
specify { expect(described_class.new([:'div.foo']).call).to eq("<div class=\"foo\"></div>\n") }
|
93
|
-
specify { expect(described_class.new([:'div.foo', ["bar", "baz"].join]).call).
|
94
|
-
to eq("<div class=\"foo\">barbaz</div>\n") }
|
95
|
-
specify { expect(described_class.new([:'div.a.b']).call).to eq("<div class=\"a b\"></div>\n") }
|
96
|
-
specify { expect(described_class.new([:'div.a.b.c']).call).to eq("<div class=\"a b c\"></div>\n") }
|
97
|
-
specify { expect(described_class.new([:'div#foo.bar.baz']).call).
|
98
|
-
to eq("<div class=\"bar baz\" id=\"foo\"></div>\n") }
|
99
|
-
end
|
100
|
-
|
101
|
-
describe 'tag contents' do
|
102
|
-
specify { expect(described_class.new([:div]).call).to eq("<div></div>\n") }
|
103
|
-
specify { expect(described_class.new([:h1]).call).to eq("<h1></h1>\n") }
|
104
|
-
specify { expect(described_class.new([:script]).call).to eq("<script></script>\n") }
|
105
|
-
specify { expect(described_class.new([:text]).call).to eq("<text></text>\n") }
|
106
|
-
specify { expect(described_class.new([:a]).call).to eq("<a></a>\n") }
|
107
|
-
specify { expect(described_class.new([:iframe]).call).to eq("<iframe></iframe>\n") }
|
108
|
-
specify { expect(described_class.new([:title]).call).to eq("<title></title>\n") }
|
109
|
-
specify { expect(described_class.new([:section]).call).to eq("<section></section>\n") }
|
110
|
-
specify { expect(described_class.new([:select]).call).to eq("<select></select>\n") }
|
111
|
-
specify { expect(described_class.new([:object]).call).to eq("<object></object>\n") }
|
112
|
-
specify { expect(described_class.new([:video]).call).to eq("<video></video>\n") }
|
113
|
-
end
|
114
|
-
|
115
|
-
describe 'tags containing text' do
|
116
|
-
specify { expect(described_class.new([:text, "Lorem Ipsum"]).call).
|
117
|
-
to eq("<text>Lorem Ipsum</text>\n") }
|
118
|
-
end
|
119
|
-
|
120
|
-
describe 'contents are concatenated' do
|
121
|
-
specify { expect(described_class.new([:body, "foo", "bar"]).call).
|
122
|
-
to eq("<body>foobar</body>\n") }
|
123
|
-
specify { expect(described_class.new([:body, [:p], [:br]]).call).
|
124
|
-
to eq("<body>\n<p></p>\n<br>\n</body>\n") }
|
125
|
-
end
|
126
|
-
|
127
|
-
describe 'seqs are expanded' do
|
128
|
-
specify { expect(described_class.new([:body, ["foo", "bar"]]).call).
|
129
|
-
to eq("<body>foobar</body>\n") }
|
130
|
-
end
|
131
|
-
|
132
|
-
describe 'tags can contain tags' do
|
133
|
-
specify { expect(described_class.new([:div, [:p]]).call).
|
134
|
-
to eq("<div><p></p></div>\n") }
|
135
|
-
specify { expect(described_class.new([:div, [:b]]).call).
|
136
|
-
to eq("<div><b></b></div>\n") }
|
137
|
-
specify { expect(described_class.new([:p, [:span, [:a, "foo"]]]).call).
|
138
|
-
to eq("<p><span><a>foo</a></span></p>\n") }
|
139
|
-
end
|
140
|
-
|
141
|
-
describe 'tag with blank attribute map' do
|
142
|
-
specify { expect(described_class.new([:xml, {}]).call).
|
143
|
-
to eq("<xml></xml>\n") }
|
144
|
-
end
|
145
|
-
|
146
|
-
describe 'tag with populated attribute map' do
|
147
|
-
specify { expect(described_class.new([:xml, {a: "1", b: "2"}]).call).
|
148
|
-
to eq("<xml a=\"1\" b=\"2\"></xml>\n") }
|
149
|
-
specify { expect(described_class.new([:img, {id: "foo"}]).call).
|
150
|
-
to eq("<img id=\"foo\">\n") }
|
151
|
-
end
|
152
|
-
|
153
|
-
describe 'tag content can be vars' do
|
154
|
-
var = "foo"
|
155
|
-
specify { expect(described_class.new([:span, var]).call).
|
156
|
-
to eq("<span>foo</span>\n") }
|
157
|
-
end
|
158
|
-
|
159
|
-
describe 'tag content can be function calls' do
|
160
|
-
specify { expect(described_class.new([:span, [1, 1].inject(:+)]).call).
|
161
|
-
to eq("<span>2</span>\n") }
|
162
|
-
specify { expect(described_class.new([:span, {foo: "bar"}.fetch(:foo)]).call).
|
163
|
-
to eq("<span>bar</span>\n") }
|
164
|
-
end
|
165
|
-
|
166
|
-
describe 'attributes can contain vars' do
|
167
|
-
var = "foo"
|
168
|
-
specify { expect(described_class.new([:xml, {x: var}]).call).
|
169
|
-
to eq("<xml x=\"foo\"></xml>\n") }
|
170
|
-
specify { expect(described_class.new([:xml, {x: var}, "bar"]).call).
|
171
|
-
to eq("<xml x=\"foo\">bar</xml>\n") }
|
172
|
-
end
|
173
|
-
|
174
|
-
describe 'attributes can contain function calls' do
|
175
|
-
|
176
|
-
def foo
|
177
|
-
"foo"
|
178
|
-
end
|
179
|
-
|
180
|
-
specify { expect(described_class.new([:img, {src: ["/foo", "/bar"].join}]).call).
|
181
|
-
to eq("<img src=\"/foo/bar\">\n") }
|
182
|
-
specify { expect(described_class.new([:div, {id: ["a", "b"].join}, foo]).call).
|
183
|
-
to eq("<div id=\"ab\">foo</div>\n") }
|
50
|
+
expect(html).to eq("<div></div>")
|
184
51
|
end
|
185
52
|
|
186
53
|
end
|
data/spec/commaparty_spec.rb
CHANGED
@@ -3,46 +3,40 @@ require 'commaparty'
|
|
3
3
|
describe CommaParty do
|
4
4
|
|
5
5
|
it 'has a helpful html method' do
|
6
|
-
expect(CommaParty.html([:tag])).to match(
|
6
|
+
expect(CommaParty.html([:tag])).to match('<html><tag></tag></html>')
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'has a helpful xml method' do
|
10
|
-
expect(CommaParty.xml([:tag])).to match(
|
10
|
+
expect(CommaParty.xml([:tag])).to match('<tag/>')
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'has a helpful markup method' do
|
14
|
-
expect(CommaParty.markup([:tag])).to match(
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'has a helpful builder method' do
|
18
|
-
builder = CommaParty.builder([:tag])
|
19
|
-
expect(builder.class).to eq(Nokogiri::XML::Builder)
|
20
|
-
expect(builder.doc.to_html).to eq(CommaParty.markup([:tag]))
|
14
|
+
expect(CommaParty.markup([:tag])).to match('<tag></tag>')
|
21
15
|
end
|
22
16
|
|
23
17
|
context 'converts ruby syntax to html string' do
|
24
|
-
it { expect(CommaParty.markup [:script]).to eq "<script></script
|
25
|
-
it { expect(CommaParty.markup [:p, "hello"]).to eq "<p>hello</p
|
26
|
-
it { expect(CommaParty.markup [:p, [:em, "hello"]]).to eq "<p><em>hello</em></p
|
27
|
-
it { expect(CommaParty.markup [:span, {:class => "foo"}, "bar"]).to eq "<span class=\"foo\">bar</span
|
28
|
-
it { expect(CommaParty.markup [:div, {id: "email", class: "selected starred"}, "..."]).to eq "<div id=\"email\" class=\"selected starred\">...</div
|
29
|
-
it { expect(CommaParty.markup [:a, {:href => "http://github.com"}, "GitHub"]).to eq "<a href=\"http://github.com\">GitHub</a
|
18
|
+
it { expect(CommaParty.markup [:script]).to eq "<script></script>" }
|
19
|
+
it { expect(CommaParty.markup [:p, "hello"]).to eq "<p>hello</p>" }
|
20
|
+
it { expect(CommaParty.markup [:p, [:em, "hello"]]).to eq "<p><em>hello</em></p>" }
|
21
|
+
it { expect(CommaParty.markup [:span, {:class => "foo"}, "bar"]).to eq "<span class=\"foo\">bar</span>" }
|
22
|
+
it { expect(CommaParty.markup [:div, {id: "email", class: "selected starred"}, "..."]).to eq "<div id=\"email\" class=\"selected starred\">...</div>" }
|
23
|
+
it { expect(CommaParty.markup [:a, {:href => "http://github.com"}, "GitHub"]).to eq "<a href=\"http://github.com\">GitHub</a>"}
|
30
24
|
|
31
25
|
context 'collections' do
|
32
|
-
it { expect(CommaParty.markup [:ul, ['a','b'].map { |x| [:li, x]}]).to eq "<ul>\n<li>a</li>\n<li>b</li>\n</ul
|
33
|
-
it { expect(CommaParty.markup [:ul, (11...13).map { |n| [:li, n]}]).to eq "<ul>\n<li>11</li>\n<li>12</li>\n</ul
|
26
|
+
it { expect(CommaParty.markup [:ul, ['a','b'].map { |x| [:li, x]}]).to eq "<ul>\n<li>a</li>\n<li>b</li>\n</ul>"}
|
27
|
+
it { expect(CommaParty.markup [:ul, (11...13).map { |n| [:li, n]}]).to eq "<ul>\n<li>11</li>\n<li>12</li>\n</ul>"}
|
34
28
|
end
|
35
29
|
|
36
30
|
context 'css shorthand' do
|
37
|
-
it { expect(CommaParty.markup [:'p.hi', "hello"]).to eq "<p class=\"hi\">hello</p
|
38
|
-
it { expect(CommaParty.markup [:'p#hi', "hello"]).to eq "<p id=\"hi\">hello</p
|
39
|
-
it { expect(CommaParty.markup [:'p.hi.greet.left', "hello"]).to eq "<p class=\"hi greet left\">hello</p
|
40
|
-
it { expect(CommaParty.markup [:'p#hi.greet.left', "hello"]).to eq "<p class=\"greet left\" id=\"hi\">hello</p
|
31
|
+
it { expect(CommaParty.markup [:'p.hi', "hello"]).to eq "<p class=\"hi\">hello</p>" }
|
32
|
+
it { expect(CommaParty.markup [:'p#hi', "hello"]).to eq "<p id=\"hi\">hello</p>" }
|
33
|
+
it { expect(CommaParty.markup [:'p.hi.greet.left', "hello"]).to eq "<p class=\"hi greet left\">hello</p>" }
|
34
|
+
it { expect(CommaParty.markup [:'p#hi.greet.left', "hello"]).to eq "<p class=\"greet left\" id=\"hi\">hello</p>" }
|
41
35
|
end
|
42
36
|
|
43
37
|
context 'different shaped trees' do
|
44
|
-
it { expect(CommaParty.markup [:p, "Hello ", [:em, "World!"]]).to eq "<p>Hello <em>World!</em></p
|
45
|
-
it { expect(CommaParty.markup [:div, [:p, "Hello"], [:em, "World!"]]).to eq "<div>\n<p>Hello</p>\n<em>World!</em>\n</div
|
38
|
+
it { expect(CommaParty.markup [:p, "Hello ", [:em, "World!"]]).to eq "<p>Hello <em>World!</em></p>" }
|
39
|
+
it { expect(CommaParty.markup [:div, [:p, "Hello"], [:em, "World!"]]).to eq "<div>\n<p>Hello</p>\n<em>World!</em>\n</div>" }
|
46
40
|
end
|
47
41
|
end
|
48
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commaparty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Connor Mendenhall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -95,7 +95,6 @@ files:
|
|
95
95
|
- Rakefile
|
96
96
|
- commaparty.gemspec
|
97
97
|
- lib/commaparty.rb
|
98
|
-
- lib/commaparty/.markup.rb.swn
|
99
98
|
- lib/commaparty/destructure_element.rb
|
100
99
|
- lib/commaparty/html.rb
|
101
100
|
- lib/commaparty/markup.rb
|
@@ -127,9 +126,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
126
|
version: '0'
|
128
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
128
|
requirements:
|
130
|
-
- - '
|
129
|
+
- - '>'
|
131
130
|
- !ruby/object:Gem::Version
|
132
|
-
version:
|
131
|
+
version: 1.3.1
|
133
132
|
requirements: []
|
134
133
|
rubyforge_project:
|
135
134
|
rubygems_version: 2.0.3
|
Binary file
|