mbrao 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.travis-gemfile +13 -0
- data/.travis.yml +8 -0
- data/.yardopts +1 -0
- data/Gemfile +21 -0
- data/README.md +60 -0
- data/Rakefile +11 -0
- data/doc/ActionView/Template/Handlers/MbraoTemplate.html +568 -0
- data/doc/ActionView/Template/Handlers.html +125 -0
- data/doc/HTML/Pipeline/KramdownFilter.html +354 -0
- data/doc/HTML/Pipeline.html +140 -0
- data/doc/HTML.html +125 -0
- data/doc/Mbrao/Author.html +1402 -0
- data/doc/Mbrao/Content.html +4779 -0
- data/doc/Mbrao/ContentPublicInterface.html +658 -0
- data/doc/Mbrao/Exceptions/InvalidDate.html +133 -0
- data/doc/Mbrao/Exceptions/InvalidMetadata.html +133 -0
- data/doc/Mbrao/Exceptions/Parsing.html +133 -0
- data/doc/Mbrao/Exceptions/Rendering.html +133 -0
- data/doc/Mbrao/Exceptions/UnavailableLocalization.html +133 -0
- data/doc/Mbrao/Exceptions/Unimplemented.html +133 -0
- data/doc/Mbrao/Exceptions/UnknownEngine.html +133 -0
- data/doc/Mbrao/Exceptions.html +125 -0
- data/doc/Mbrao/Parser.html +418 -0
- data/doc/Mbrao/ParsingEngines/Base.html +658 -0
- data/doc/Mbrao/ParsingEngines/PlainText.html +571 -0
- data/doc/Mbrao/ParsingEngines.html +127 -0
- data/doc/Mbrao/PublicInterface/ClassMethods.html +1727 -0
- data/doc/Mbrao/PublicInterface.html +134 -0
- data/doc/Mbrao/RenderingEngines/Base.html +280 -0
- data/doc/Mbrao/RenderingEngines/HtmlPipeline.html +873 -0
- data/doc/Mbrao/RenderingEngines.html +127 -0
- data/doc/Mbrao/Validations/ClassMethods.html +692 -0
- data/doc/Mbrao/Validations.html +134 -0
- data/doc/Mbrao/Version.html +189 -0
- data/doc/Mbrao.html +130 -0
- data/doc/_index.html +395 -0
- data/doc/class_list.html +53 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +338 -0
- data/doc/file.README.html +135 -0
- data/doc/file_list.html +55 -0
- data/doc/frames.html +28 -0
- data/doc/index.html +135 -0
- data/doc/js/app.js +214 -0
- data/doc/js/full_list.js +173 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +516 -0
- data/doc/top-level-namespace.html +112 -0
- data/lib/mbrao/author.rb +61 -0
- data/lib/mbrao/content.rb +300 -0
- data/lib/mbrao/exceptions.rb +38 -0
- data/lib/mbrao/integrations/rails.rb +51 -0
- data/lib/mbrao/parser.rb +276 -0
- data/lib/mbrao/parsing_engines/base.rb +51 -0
- data/lib/mbrao/parsing_engines/plain_text.rb +187 -0
- data/lib/mbrao/rendering_engines/base.rb +22 -0
- data/lib/mbrao/rendering_engines/html_pipeline.rb +147 -0
- data/lib/mbrao/version.rb +25 -0
- data/lib/mbrao.rb +24 -0
- data/mbrao.gemspec +31 -0
- data/spec/coverage_helper.rb +17 -0
- data/spec/mbrao/author_spec.rb +62 -0
- data/spec/mbrao/content_spec.rb +280 -0
- data/spec/mbrao/integrations/rails_spec.rb +92 -0
- data/spec/mbrao/parser_spec.rb +269 -0
- data/spec/mbrao/parsing_engines/base_spec.rb +52 -0
- data/spec/mbrao/parsing_engines/plain_text_spec.rb +141 -0
- data/spec/mbrao/rendering_engines/base_spec.rb +17 -0
- data/spec/mbrao/rendering_engines/html_pipeline_spec.rb +128 -0
- data/spec/spec_helper.rb +15 -0
- metadata +195 -0
@@ -0,0 +1,280 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the mbrao gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe Mbrao::Content do
|
10
|
+
let(:reference) { Mbrao::Content.new("UID") }
|
11
|
+
|
12
|
+
describe "#initialize" do
|
13
|
+
it "store the uid" do
|
14
|
+
reference = Mbrao::Content.new("SAMPLE")
|
15
|
+
expect(reference.uid).to eq("SAMPLE")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "#locales=" do
|
20
|
+
it "correctly assign a string, a symbol or an array" do
|
21
|
+
reference.locales = :it
|
22
|
+
expect(reference.locales).to eq(["it"])
|
23
|
+
reference.locales = "en"
|
24
|
+
expect(reference.locales).to eq(["en"])
|
25
|
+
reference.locales = ["en", [:it, :es]]
|
26
|
+
expect(reference.locales).to eq(["en", "it", "es"])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
shared_examples_for("localized setter") do |attribute|
|
31
|
+
it "should assign a single string" do
|
32
|
+
reference.send("#{attribute}=", "ABC")
|
33
|
+
expect(reference.send(attribute)).to eq("ABC")
|
34
|
+
reference.send("#{attribute}=", 1)
|
35
|
+
expect(reference.send(attribute)).to eq("1")
|
36
|
+
reference.send("#{attribute}=", nil)
|
37
|
+
expect(reference.send(attribute)).to eq("")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should assign a string with locales and sanitized entries" do
|
41
|
+
reference.send("#{attribute}=", {en: nil, es: "ABC", it: 1})
|
42
|
+
value = reference.send(attribute)
|
43
|
+
expect(value).to be_a(::HashWithIndifferentAccess)
|
44
|
+
expect(value["en"]).to eq("")
|
45
|
+
expect(value[:es]).to eq("ABC")
|
46
|
+
expect(value["it"]).to eq("1")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
shared_examples_for("localized getter") do |attribute, v1, v2|
|
51
|
+
it "should raise an exception if not available for that locale" do
|
52
|
+
reference.locales = [:en, :it, :es]
|
53
|
+
reference.send("#{attribute}=", v1)
|
54
|
+
expect { reference.send("get_#{attribute}", [:de, :it]) }.not_to raise_error(Mbrao::Exceptions::UnavailableLocalization)
|
55
|
+
expect { reference.send("get_#{attribute}", [:de]) }.to raise_error(Mbrao::Exceptions::UnavailableLocalization)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return the attribute itself if not localized" do
|
59
|
+
reference.locales = [:en, :it, :es]
|
60
|
+
reference.send("#{attribute}=", v1)
|
61
|
+
expect(reference.send("get_#{attribute}", [:de, :it])).to eq(v1)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should return the default locale if no locales are specified" do
|
65
|
+
Mbrao::Parser.locale = :it
|
66
|
+
reference.send("#{attribute}=", {en: v1, it: v2})
|
67
|
+
expect(reference.send("get_#{attribute}")).to eq(v2)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should return only the subset of valid and request locales" do
|
71
|
+
Mbrao::Parser.locale = :it
|
72
|
+
reference.send("#{attribute}=", {en: v1, it: v2, de: v1, es: v2})
|
73
|
+
|
74
|
+
value = reference.send("get_#{attribute}", [:de, :es])
|
75
|
+
expect(value).to be_a(::HashWithIndifferentAccess)
|
76
|
+
expect(value.keys).to eq(["de", "es"])
|
77
|
+
|
78
|
+
value = reference.send("get_#{attribute}", [:it, :de, :pt, :fr])
|
79
|
+
expect(value.keys.sort).to eq(["de", "it"])
|
80
|
+
|
81
|
+
reference.locales = [:en, :it, :es]
|
82
|
+
value = reference.send("get_#{attribute}", "*")
|
83
|
+
expect(value.keys.sort).to eq(["de", "en", "es", "it"])
|
84
|
+
|
85
|
+
reference.send("#{attribute}=", {en: v1, "it,es" => v2, " de, fr " => v1})
|
86
|
+
value = reference.send("get_#{attribute}", [:it, :fr])
|
87
|
+
expect(value.keys.sort).to eq(["fr", "it"])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
shared_examples_for("date setter") do |attribute|
|
92
|
+
it "should correctly parse a datetime classes" do
|
93
|
+
reference.send("#{attribute}=", Date.civil(2012, 8, 8))
|
94
|
+
value = reference.send(attribute)
|
95
|
+
expect(value).to be_a(DateTime)
|
96
|
+
expect(value.strftime("%Y%m%dT%H%M%S%z")).to eq("20120808T000000+0000")
|
97
|
+
|
98
|
+
reference.send("#{attribute}=", DateTime.civil(2012, 8, 8, 11, 30, 45))
|
99
|
+
value = reference.send(attribute)
|
100
|
+
expect(value).to be_a(DateTime)
|
101
|
+
expect(value.strftime("%Y%m%dT%H%M%S%z")).to eq("20120808T113045+0000")
|
102
|
+
|
103
|
+
Time.zone = 'Europe/Rome'
|
104
|
+
date = Time.at(1344421800)
|
105
|
+
reference.send("#{attribute}=", date)
|
106
|
+
value = reference.send(attribute)
|
107
|
+
expect(value).to be_a(DateTime)
|
108
|
+
expect(value.strftime("%Y%m%dT%H%M%S%z")).to eq("20120808T103000+0000")
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should correctly parse a timestamp" do
|
112
|
+
reference.send("#{attribute}=", 1344421800)
|
113
|
+
value = reference.send(attribute)
|
114
|
+
expect(value).to be_a(DateTime)
|
115
|
+
expect(value.strftime("%Y%m%dT%H%M%S%z")).to eq("20120808T103000+0000")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should try to parse everything else as a ISO8601 format" do
|
119
|
+
reference.send("#{attribute}=", "20120808T083000-0200")
|
120
|
+
value = reference.send(attribute)
|
121
|
+
expect(value).to be_a(DateTime)
|
122
|
+
expect(value.strftime("%Y%m%dT%H%M%S%z")).to eq("20120808T103000+0000")
|
123
|
+
|
124
|
+
expect { reference.send("#{attribute}=", "ABC") }.to raise_error(Mbrao::Exceptions::InvalidDate)
|
125
|
+
expect { reference.send("#{attribute}=", []) }.to raise_error(Mbrao::Exceptions::InvalidDate)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe "#title=" do
|
130
|
+
it_should_behave_like "localized setter", :title
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "#body=" do
|
134
|
+
it "should set the content as string" do
|
135
|
+
reference.body = "A"
|
136
|
+
expect(reference.body).to eq("A")
|
137
|
+
reference.body = 1
|
138
|
+
expect(reference.body).to eq("1")
|
139
|
+
reference.body = nil
|
140
|
+
expect(reference.body).to eq("")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#tags=" do
|
145
|
+
it "should assign a single value" do
|
146
|
+
reference.tags = "ABC"
|
147
|
+
expect(reference.tags).to eq(["ABC"])
|
148
|
+
reference.tags = ["ABC", [1, nil]]
|
149
|
+
expect(reference.tags).to eq(["ABC", "1"])
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should assign values with locales and sanitized entries" do
|
153
|
+
reference.tags = {en: nil, es: "ABC", it: [1, [2, 3]]}
|
154
|
+
value = reference.tags
|
155
|
+
expect(value).to be_a(::HashWithIndifferentAccess)
|
156
|
+
expect(value["en"]).to eq([])
|
157
|
+
expect(value[:es]).to eq(["ABC"])
|
158
|
+
expect(value["it"]).to eq(["1", "2", "3"])
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "#more=" do
|
163
|
+
it_should_behave_like "localized setter", :more
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "#author=" do
|
167
|
+
it "should assign an existing author" do
|
168
|
+
author = ::Mbrao::Author.new("NAME")
|
169
|
+
reference.author = author
|
170
|
+
expect(reference.author).to be(author)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should only assign a name" do
|
174
|
+
reference.author = "NAME"
|
175
|
+
expect(reference.author).to be_a(::Mbrao::Author)
|
176
|
+
expect(reference.author.name).to eq("NAME")
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should assign by an hash" do
|
180
|
+
reference.author = {name: "NAME", email: "EMAIL@email.com", "website" => "http://WEBSITE.TLD", "image" => "http://IMAGE.TLD", metadata: {a: "b"}, uid: "UID"}
|
181
|
+
expect(reference.author).to be_a(::Mbrao::Author)
|
182
|
+
expect(reference.author.name).to eq("NAME")
|
183
|
+
expect(reference.author.email).to eq("EMAIL@email.com")
|
184
|
+
expect(reference.author.website).to eq("http://WEBSITE.TLD")
|
185
|
+
expect(reference.author.image).to eq("http://IMAGE.TLD")
|
186
|
+
expect(reference.author.metadata).to be_a(::HashWithIndifferentAccess)
|
187
|
+
expect(reference.author.metadata["a"]).to eq("b")
|
188
|
+
expect(reference.author.uid).to eq("UID")
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "#created_at=" do
|
193
|
+
it_should_behave_like "date setter", :created_at
|
194
|
+
end
|
195
|
+
|
196
|
+
describe "#updated_at=" do
|
197
|
+
it_should_behave_like "date setter", :updated_at
|
198
|
+
end
|
199
|
+
|
200
|
+
describe "#metadata=" do
|
201
|
+
it "correctly set a non hash value" do
|
202
|
+
reference.metadata = "RAW"
|
203
|
+
expect(reference.metadata).to be_a(::HashWithIndifferentAccess)
|
204
|
+
expect(reference.metadata["raw"]).to eq("RAW")
|
205
|
+
end
|
206
|
+
|
207
|
+
it "correctly set a hash value" do
|
208
|
+
reference.metadata = {en: nil, es: "ABC", it: [1, [2, 3]]}
|
209
|
+
expect(reference.metadata).to be_a(::HashWithIndifferentAccess)
|
210
|
+
expect(reference.metadata["es"]).to eq("ABC")
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "#enabled_for_locales?" do
|
215
|
+
it "correctly check availability for certain locales" do
|
216
|
+
reference.locales = [:en, :it]
|
217
|
+
expect(reference.enabled_for_locales?).to be_true
|
218
|
+
expect(reference.enabled_for_locales?(:en)).to be_true
|
219
|
+
expect(reference.enabled_for_locales?(:it, :es)).to be_true
|
220
|
+
expect(reference.enabled_for_locales?(:es, :de)).to be_false
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe "#get_title" do
|
225
|
+
it_should_behave_like "localized getter", :title, "ABC", "123"
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "#get_body" do
|
229
|
+
it "should create a parsing engine and use it for filtering" do
|
230
|
+
reference.body = "BODY"
|
231
|
+
engine = ::Mbrao::ParsingEngines::Base.new
|
232
|
+
engine.should_receive(:filter_content).with(reference, ["it", "en"])
|
233
|
+
::Mbrao::Parser.should_receive(:create_engine).with("ENGINE").and_return(engine)
|
234
|
+
reference.get_body(["it", "en"], "ENGINE")
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
describe "#get_tags" do
|
239
|
+
it_should_behave_like "localized getter", :tags, ["ABC", "123"], ["1", "2", "3", "4"]
|
240
|
+
end
|
241
|
+
|
242
|
+
describe "#get_more" do
|
243
|
+
it_should_behave_like "localized getter", :more, "ABC", "123"
|
244
|
+
end
|
245
|
+
|
246
|
+
describe ".create" do
|
247
|
+
it "should return a Content object" do
|
248
|
+
expect(::Mbrao::Content.create(nil, "BODY")).to be_a(::Mbrao::Content)
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should assign the body" do
|
252
|
+
expect(::Mbrao::Content.create(nil, "BODY").body).to eq("BODY")
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should assign metadata if present" do
|
256
|
+
created_at = DateTime.civil(1984, 7, 7, 11, 30, 0)
|
257
|
+
metadata = {"uid" => "UID", "title" => {it: "IT", en: "EN"}, "author" => "AUTHOR", "tags" => {it: "IT", en: "EN"}, "more" => "MORE", created_at: created_at, locales: ["it", ["en"]], other: ["OTHER"]}
|
258
|
+
content = ::Mbrao::Content.create(metadata, "BODY")
|
259
|
+
|
260
|
+
expect(content.uid).to eq("UID")
|
261
|
+
expect(content.title).to eq({"it" => "IT", "en" => "EN"})
|
262
|
+
expect(content.author).to be_a(::Mbrao::Author)
|
263
|
+
expect(content.author.name).to eq("AUTHOR")
|
264
|
+
expect(content.body).to eq("BODY")
|
265
|
+
expect(content.tags).to eq({"it" => ["IT"], "en" => ["EN"]})
|
266
|
+
expect(content.more).to eq("MORE")
|
267
|
+
expect(content.created_at).to eq(created_at)
|
268
|
+
expect(content.updated_at).to eq(created_at)
|
269
|
+
expect(content.locales).to eq(["it", "en"])
|
270
|
+
expect(content.metadata).to eq({"other" => ["OTHER"]})
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should ignore invalid metadata" do
|
274
|
+
expect(::Mbrao::Content.create(nil, "BODY").metadata).to eq({})
|
275
|
+
expect(::Mbrao::Content.create(1, "BODY").metadata).to eq({})
|
276
|
+
expect(::Mbrao::Content.create([], "BODY").metadata).to eq({})
|
277
|
+
expect(::Mbrao::Content.create("A", "BODY").metadata).to eq({})
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the mbrao gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe ActionView::Template::Handlers::MbraoTemplate do
|
10
|
+
class DummyTemplate
|
11
|
+
def initialize(content)
|
12
|
+
@content = content
|
13
|
+
end
|
14
|
+
|
15
|
+
def source
|
16
|
+
@content
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class DummyController
|
21
|
+
def params
|
22
|
+
{locale: "LOCALE"}
|
23
|
+
end
|
24
|
+
|
25
|
+
def helper_method(method)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class DummyRenderer
|
30
|
+
def controller
|
31
|
+
@controller ||= DummyController.new
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".instance" do
|
36
|
+
it "should create a new instance" do
|
37
|
+
expect(ActionView::Template::Handlers::MbraoTemplate.instance).to be_a(ActionView::Template::Handlers::MbraoTemplate)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should always return the same instance" do
|
41
|
+
other = ActionView::Template::Handlers::MbraoTemplate.instance
|
42
|
+
ActionView::Template::Handlers::MbraoTemplate.should_not_receive(:new)
|
43
|
+
expect(ActionView::Template::Handlers::MbraoTemplate.instance).to eq(other)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should recreate an instance" do
|
47
|
+
other = ActionView::Template::Handlers::MbraoTemplate.instance
|
48
|
+
expect(ActionView::Template::Handlers::MbraoTemplate.instance(true)).not_to eq(other)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
describe "#call" do
|
54
|
+
it "should return a Ruby snippet" do
|
55
|
+
expect(ActionView::Template::Handlers::MbraoTemplate.instance.call(DummyTemplate.new("CONTENT"))).to eq("ActionView::Template::Handlers::MbraoTemplate.instance.render(self, \"CONTENT\")")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#render" do
|
60
|
+
it "should initialize a Content and assign it to the controller" do
|
61
|
+
controller = DummyController.new
|
62
|
+
renderer = DummyRenderer.new
|
63
|
+
renderer.stub(:controller).and_return(controller)
|
64
|
+
|
65
|
+
expect(controller.respond_to?(:mbrao_content)).to be_false
|
66
|
+
::Mbrao::Parser.should_receive(:parse).and_call_original
|
67
|
+
controller.should_receive(:helper_method).with(:mbrao_content)
|
68
|
+
ActionView::Template::Handlers::MbraoTemplate.instance.render(renderer, "CONTENT")
|
69
|
+
|
70
|
+
expect(controller.respond_to?(:mbrao_content)).to be_true
|
71
|
+
expect(controller.mbrao_content.body).to eq("CONTENT")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should render contents, using specified engine and locale" do
|
75
|
+
controller = DummyController.new
|
76
|
+
renderer = DummyRenderer.new
|
77
|
+
renderer.stub(:controller).and_return(controller)
|
78
|
+
|
79
|
+
content = ::Mbrao::Content.create({engine: "ENGINE"}, "CONTENT")
|
80
|
+
::Mbrao::Parser.stub(:parse).and_return(content)
|
81
|
+
|
82
|
+
::Mbrao::Parser.should_receive(:render).with(content, {engine: "ENGINE", locale: "LOCALE"})
|
83
|
+
ActionView::Template::Handlers::MbraoTemplate.instance.render(DummyRenderer.new, "CONTENT")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#supports_streaming?" do
|
88
|
+
it "should be true" do
|
89
|
+
expect(ActionView::Template::Handlers::MbraoTemplate.instance.supports_streaming?).to be_true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,269 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the mbrao gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe Mbrao::Parser do
|
10
|
+
class BlankParser
|
11
|
+
def parse(content, options)
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class ::Mbrao::ParsingEngines::ScopedParser
|
17
|
+
def parse(content, options)
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
shared_examples_for("attribute_with_default") do |attribute, default, sanitizer|
|
23
|
+
it "should return the default value" do
|
24
|
+
::Mbrao::Parser.send("#{attribute}=", nil)
|
25
|
+
expect(::Mbrao::Parser.send(attribute)).to eq(default)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return the set value sanitized" do
|
29
|
+
::Mbrao::Parser.send("#{attribute}=", :en)
|
30
|
+
expect(::Mbrao::Parser.send(attribute)).to eq("en".send(sanitizer))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe ".locale" do
|
35
|
+
it_should_behave_like("attribute_with_default", :locale, "en", :ensure_string)
|
36
|
+
end
|
37
|
+
|
38
|
+
describe ".parsing_engine" do
|
39
|
+
it_should_behave_like("attribute_with_default", :parsing_engine, :plain_text, :to_sym)
|
40
|
+
end
|
41
|
+
|
42
|
+
describe ".rendering_engine" do
|
43
|
+
it_should_behave_like("attribute_with_default", :rendering_engine, :html_pipeline, :to_sym)
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ".parse" do
|
47
|
+
it "should forward to the instance" do
|
48
|
+
::Mbrao::Parser.instance.should_receive(:parse).with("TEXT", {options: {}})
|
49
|
+
::Mbrao::Parser.parse("TEXT", {options: {}})
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe ".render" do
|
54
|
+
it "should forward to the instance" do
|
55
|
+
::Mbrao::Parser.instance.should_receive(:render).with("TEXT", {options: {}}, {content: {}})
|
56
|
+
::Mbrao::Parser.render("TEXT", {options: {}}, {content: {}})
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe ".create_engine" do
|
61
|
+
it "should create an engine via .find_class" do
|
62
|
+
reference = ::Mbrao::ParsingEngines::ScopedParser.new
|
63
|
+
cls = ::Mbrao::ParsingEngines::ScopedParser
|
64
|
+
cls.should_receive(:new).exactly(2).and_return(reference)
|
65
|
+
|
66
|
+
::Mbrao::Parser.should_receive(:find_class).with(:scoped_parser, "::Mbrao::ParsingEngines::%CLASS%").and_return(cls)
|
67
|
+
expect(::Mbrao::Parser.create_engine(:scoped_parser)).to eq(reference)
|
68
|
+
::Mbrao::Parser.should_receive(:find_class).with(:scoped_parser, "::Mbrao::RenderingEngines::%CLASS%").and_return(cls)
|
69
|
+
expect(::Mbrao::Parser.create_engine(:scoped_parser, :rendering)).to eq(reference)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should raise an exception if the engine class is not found" do
|
73
|
+
expect { ::Mbrao::Parser.create_engine(:invalid) }.to raise_error(::Mbrao::Exceptions::UnknownEngine)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe ".find_class" do
|
78
|
+
it "should return a valid class" do
|
79
|
+
expect(::Mbrao::Parser.find_class("String")).to eq(String)
|
80
|
+
expect(::Mbrao::Parser.find_class("ScopedParser", "::Mbrao::ParsingEngines::%CLASS%")).to eq(::Mbrao::ParsingEngines::ScopedParser)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should raise an exception if the class is not found" do
|
84
|
+
expect { ::Mbrao::Parser.find_class(:invalid) }.to raise_error(::Mbrao::Exceptions::Unimplemented)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should not expand engine scope if the class starts with ::" do
|
88
|
+
expect { ::Mbrao::Parser.find_class("::ScopedParser", "::Mbrao::ParsingEngines::%CLASS%") }.to raise_error(::Mbrao::Exceptions::Unimplemented)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should only use scope if requested to" do
|
92
|
+
expect { ::Mbrao::Parser.find_class("::Fixnum", "::Mbrao::ParsingEngines::%CLASS%", true) }.to raise_error(::Mbrao::Exceptions::Unimplemented)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return anything but string or symbol as their class" do
|
96
|
+
expect(::Mbrao::Parser.find_class(nil)).to eq(NilClass)
|
97
|
+
expect(::Mbrao::Parser.find_class(1)).to eq(Fixnum)
|
98
|
+
expect(::Mbrao::Parser.find_class(["A"])).to eq(Array)
|
99
|
+
expect(::Mbrao::Parser.find_class({a: "b"})).to eq(Hash)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe ".instance" do
|
104
|
+
it("should call .new") do
|
105
|
+
::Mbrao::Parser.instance_variable_set(:@instance, nil)
|
106
|
+
::Mbrao::Parser.should_receive(:new)
|
107
|
+
::Mbrao::Parser.instance
|
108
|
+
end
|
109
|
+
|
110
|
+
it("should return the same instance") do
|
111
|
+
::Mbrao::Parser.stub(:new) do Time.now end
|
112
|
+
instance = ::Mbrao::Parser.instance
|
113
|
+
expect(::Mbrao::Parser.instance).to be(instance)
|
114
|
+
::Mbrao::Parser.instance_variable_set(:@instance, nil)
|
115
|
+
end
|
116
|
+
|
117
|
+
it("should return a new instance if requested to") do
|
118
|
+
::Mbrao::Parser.stub(:new) do Time.now end
|
119
|
+
instance = ::Mbrao::Parser.instance
|
120
|
+
expect(::Mbrao::Parser.instance(true)).not_to be(instance)
|
121
|
+
::Mbrao::Parser.instance_variable_set(:@instance, nil)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe ".is_email?" do
|
126
|
+
it "should check for valid emails" do
|
127
|
+
expect(Mbrao::Parser.is_email?("valid@email.com")).to be_true
|
128
|
+
expect(Mbrao::Parser.is_email?("valid@localhost")).to be_false
|
129
|
+
expect(Mbrao::Parser.is_email?("this.is.9@email.com")).to be_true
|
130
|
+
expect(Mbrao::Parser.is_email?("INVALID")).to be_false
|
131
|
+
expect(Mbrao::Parser.is_email?(nil)).to be_false
|
132
|
+
expect(Mbrao::Parser.is_email?([])).to be_false
|
133
|
+
expect(Mbrao::Parser.is_email?("this.is.9@email.com.uk")).to be_true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe ".is_url?" do
|
138
|
+
it "should check for valid URLs" do
|
139
|
+
expect(Mbrao::Parser.is_url?("http://google.it")).to be_true
|
140
|
+
expect(Mbrao::Parser.is_url?("ftp://ftp.google.com")).to be_true
|
141
|
+
expect(Mbrao::Parser.is_url?("http://google.it/?q=FOO+BAR")).to be_true
|
142
|
+
expect(Mbrao::Parser.is_url?("INVALID")).to be_false
|
143
|
+
expect(Mbrao::Parser.is_url?([])).to be_false
|
144
|
+
expect(Mbrao::Parser.is_url?(nil)).to be_false
|
145
|
+
expect(Mbrao::Parser.is_url?({})).to be_false
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe ".sanitized_hash" do
|
150
|
+
it "should inject a new hash from existing one" do
|
151
|
+
reference = {a: "b"}
|
152
|
+
reference.should_receive(:inject).with(an_instance_of(HashWithIndifferentAccess)).and_call_original
|
153
|
+
sanitized = Mbrao::Parser.sanitized_hash(reference)
|
154
|
+
expect(sanitized).to be_a(HashWithIndifferentAccess)
|
155
|
+
expect(sanitized["a"]).to eq("b")
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should collect sanitized elements" do
|
160
|
+
reference = [{a: "b"}]
|
161
|
+
reference.should_receive(:collect).and_call_original
|
162
|
+
sanitized = Mbrao::Parser.sanitized_hash(reference)
|
163
|
+
expect(sanitized).to be_a(Array)
|
164
|
+
expect(sanitized[0]).to eq({"a" => "b"})
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should iterate over nested elements recursively" do
|
169
|
+
reference = [{a: "b"}]
|
170
|
+
Mbrao::Parser.should_receive(:sanitized_hash).with(anything, :ensure_array).exactly(4).and_call_original
|
171
|
+
sanitized = Mbrao::Parser.sanitized_hash({c: reference}, :ensure_array)
|
172
|
+
expect(sanitized).to be_a(HashWithIndifferentAccess)
|
173
|
+
expect(sanitized["c"]).to eq([{"a" => ["b"]}])
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should convert a non-enumerable object using a method" do
|
177
|
+
reference = {a: "b"}
|
178
|
+
expect(Mbrao::Parser.sanitized_hash(reference, :ensure_array).fetch("a")).to eq(["b"])
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should convert a non-enumerable object using a block" do
|
182
|
+
reference = {a: ["b", "c"]}
|
183
|
+
expect((Mbrao::Parser.sanitized_hash(reference) {|v| v.upcase }.fetch("a"))).to eq(["B", "C"])
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should not modify a non-enumerable object if requested to" do
|
187
|
+
reference = {a: nil}
|
188
|
+
expect((Mbrao::Parser.sanitized_hash(reference, false).fetch("a"))).to be_nil
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe ".sanitized_array" do
|
193
|
+
it "should return a sanitized array" do
|
194
|
+
expect(Mbrao::Parser.sanitized_array([:en, ["A", 1]])).to eq(["en", "A", "1"])
|
195
|
+
expect(Mbrao::Parser.sanitized_array(:en)).to eq(["en"])
|
196
|
+
expect(Mbrao::Parser.sanitized_array(:en)).to eq(["en"])
|
197
|
+
expect(Mbrao::Parser.sanitized_array([:en, nil])).to eq(["en", ""])
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should not uniq if requested to" do
|
201
|
+
ref = [{a: "b"}]
|
202
|
+
ref.should_not_receive(:uniq)
|
203
|
+
expect(Mbrao::Parser.sanitized_array(ref, false)).to eq(["{:a=>\"b\"}"])
|
204
|
+
end
|
205
|
+
|
206
|
+
it "should compact if requested to" do
|
207
|
+
ref = [{a: "b"}, nil]
|
208
|
+
ref.should_not_receive(:compact)
|
209
|
+
expect(Mbrao::Parser.sanitized_array(ref, false, true)).to eq(["{:a=>\"b\"}"])
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should use the requested method for sanitizing" do
|
213
|
+
ref = [{a: "b"}]
|
214
|
+
ref.should_not_receive(:ensure_string)
|
215
|
+
Hash.any_instance.should_receive(:to_json).and_call_original
|
216
|
+
expect(Mbrao::Parser.sanitized_array(ref, true, false, :to_json)).to eq(["{\"a\":\"b\"}"])
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should use the block for sanitizing" do
|
220
|
+
ref = [{a: "b"}]
|
221
|
+
ref.should_not_receive(:ensure_string)
|
222
|
+
expect(Mbrao::Parser.sanitized_array(ref) {|e| e.keys.first }).to eq([:a])
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
describe "#parse" do
|
227
|
+
it "should sanitize options" do
|
228
|
+
reference = BlankParser.new
|
229
|
+
::Mbrao::Parser.should_receive(:create_engine).exactly(3).and_return(reference)
|
230
|
+
|
231
|
+
reference.should_receive(:parse).with("CONTENT", {"metadata" => true, "content" => true, "engine" => :blank_parser})
|
232
|
+
reference.should_receive(:parse).with("CONTENT", {"metadata" => true, "content" => false, "engine" => :blank_parser})
|
233
|
+
reference.should_receive(:parse).with("CONTENT", {"metadata" => false, "content" => false, "engine" => :blank_parser})
|
234
|
+
|
235
|
+
::Mbrao::Parser.new.parse("CONTENT", {engine: :blank_parser})
|
236
|
+
::Mbrao::Parser.new.parse("CONTENT", {engine: :blank_parser, content: 2})
|
237
|
+
::Mbrao::Parser.new.parse("CONTENT", {engine: :blank_parser, metadata: false, content: false})
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should call .create_engine call its #parse method" do
|
241
|
+
reference = BlankParser.new
|
242
|
+
::Mbrao::Parser.should_receive(:create_engine).and_return(reference)
|
243
|
+
|
244
|
+
reference.should_receive(:parse).with("CONTENT", {"metadata" => true, "content" => true, "engine" => :blank_parser, "other" => "OK"})
|
245
|
+
::Mbrao::Parser.new.parse("CONTENT", {engine: :blank_parser, other: "OK"})
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
describe "#render" do
|
250
|
+
it "should sanitize options" do
|
251
|
+
reference = Object.new
|
252
|
+
::Mbrao::Parser.should_receive(:create_engine).exactly(2).and_return(reference)
|
253
|
+
|
254
|
+
reference.should_receive(:render).with("CONTENT", {"engine" => :blank_rendered}, {content: "OK"})
|
255
|
+
reference.should_receive(:render).with("CONTENT", {"engine" => :html_pipeline}, {content: "OK"})
|
256
|
+
|
257
|
+
::Mbrao::Parser.new.render("CONTENT", {engine: :blank_rendered}, {content: "OK"})
|
258
|
+
::Mbrao::Parser.new.render("CONTENT", {engine: :html_pipeline}, {content: "OK"})
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should call .create_engine call its #parse method" do
|
262
|
+
reference = Object.new
|
263
|
+
::Mbrao::Parser.should_receive(:create_engine).with(:blank_rendered, :rendering).and_return(reference)
|
264
|
+
|
265
|
+
reference.should_receive(:render).with("CONTENT", {"engine" => :blank_rendered}, {content: "OK"})
|
266
|
+
::Mbrao::Parser.new.render("CONTENT", {engine: :blank_rendered}, {content: "OK"})
|
267
|
+
end
|
268
|
+
end
|
269
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the mbrao gem. Copyright (C) 2013 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "spec_helper"
|
8
|
+
|
9
|
+
describe Mbrao::ParsingEngines::Base do
|
10
|
+
let(:reference) { Mbrao::ParsingEngines::Base.new }
|
11
|
+
|
12
|
+
shared_examples_for("unimplemented") do |method|
|
13
|
+
it "should raise an exception" do
|
14
|
+
expect { reference.send(method, "CONTENT", {}) }.to raise_error(Mbrao::Exceptions::Unimplemented)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#separate_components" do
|
19
|
+
it_should_behave_like "unimplemented", :separate_components
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#parse_metadata" do
|
23
|
+
it_should_behave_like "unimplemented", :parse_metadata
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#filter_content" do
|
27
|
+
it_should_behave_like "unimplemented", :filter_content
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#parse" do
|
31
|
+
let(:reference) { ::Mbrao::ParsingEngines::Base.new }
|
32
|
+
|
33
|
+
it "should forward to ::Mbrao::Content.create" do
|
34
|
+
reference.should_receive(:separate_components).with("CONTENT", {a: "b"}).and_return([{a: "b"}, "BODY"])
|
35
|
+
reference.stub(:parse_metadata).and_return({a: "b"})
|
36
|
+
::Mbrao::Content.should_receive(:create).with({a: "b"}, "BODY")
|
37
|
+
reference.parse("CONTENT", {a: "b"})
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return a Content object" do
|
41
|
+
reference.stub(:separate_components).with("CONTENT", {a: "b"}).and_return([])
|
42
|
+
reference.stub(:parse_metadata).and_return({})
|
43
|
+
expect(reference.parse("CONTENT", {a: "b"})).to be_a(::Mbrao::Content)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should separate_components" do
|
47
|
+
reference.should_receive(:separate_components).with("CONTENT", {a: "b"})
|
48
|
+
reference.stub(:parse_metadata).and_return({})
|
49
|
+
reference.parse("CONTENT", {a: "b"})
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|