mbrao 1.0.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.
- 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
|