normatron 0.3.1 → 0.3.2
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/.yardopts +2 -0
- data/lib/normatron/filters.rb +42 -24
- data/lib/normatron/filters/ascii_filter.rb +18 -12
- data/lib/normatron/filters/blank_filter.rb +19 -15
- data/lib/normatron/filters/camelize_filter.rb +39 -34
- data/lib/normatron/filters/capitalize_filter.rb +19 -13
- data/lib/normatron/filters/chomp_filter.rb +27 -21
- data/lib/normatron/filters/dasherize_filter.rb +16 -10
- data/lib/normatron/filters/downcase_filter.rb +19 -13
- data/lib/normatron/filters/dump_filter.rb +20 -14
- data/lib/normatron/filters/keep_filter.rb +101 -84
- data/lib/normatron/filters/remove_filter.rb +26 -21
- data/lib/normatron/filters/squeeze_filter.rb +24 -16
- data/lib/normatron/filters/squish_filter.rb +20 -13
- data/lib/normatron/filters/strip_filter.rb +25 -17
- data/lib/normatron/filters/swapcase_filter.rb +19 -13
- data/lib/normatron/filters/titleize_filter.rb +19 -13
- data/lib/normatron/filters/underscore_filter.rb +28 -22
- data/lib/normatron/filters/upcase_filter.rb +19 -13
- data/lib/normatron/version.rb +1 -1
- data/spec/normatron/configuration_spec.rb +0 -1
- data/spec/normatron/extensions/active_record_spec.rb +1 -0
- data/spec/normatron/filters/ascii_filter_spec.rb +15 -9
- data/spec/normatron/filters/blank_filter_spec.rb +10 -11
- data/spec/normatron/filters/camelize_filter_spec.rb +94 -33
- data/spec/normatron/filters/capitalize_filter_spec.rb +8 -7
- data/spec/normatron/filters/squeeze_filter_spec.rb +2 -2
- data/spec/spec_helper.rb +6 -1
- data/spec/support/matchers/evaluate_matcher.rb +75 -0
- metadata +5 -2
@@ -2,25 +2,31 @@ require 'normatron/filters/helpers'
|
|
2
2
|
|
3
3
|
module Normatron
|
4
4
|
module Filters
|
5
|
+
|
6
|
+
##
|
7
|
+
# Capitalizes the first character of each word.
|
8
|
+
#
|
9
|
+
# @example Out of box
|
10
|
+
# TitleizeFilter.evaluate("at your will!") #=> "At Your Will!"
|
11
|
+
#
|
12
|
+
# @example Using as ActiveRecord::Base normalizer
|
13
|
+
# normalize :attribute_a, :with => :titleize
|
14
|
+
# normalize :attribute_b, :with => [:custom_filter, :titleize]
|
15
|
+
#
|
16
|
+
# @see http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html#method-i-titleize ActiveSupport::Multibyte::Chars#titleize
|
17
|
+
# @see DownFilter Normatron::Filters::DownFilter
|
18
|
+
# @see SwapcaseFilter Normatron::Filters::SwapcaseFilter
|
19
|
+
# @see UpcaseFilter Normatron::Filters::UpcaseFilter
|
5
20
|
module TitleizeFilter
|
6
21
|
extend Helpers
|
7
22
|
|
8
23
|
##
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# @example
|
12
|
-
# TitleizeFilter.evaluate("at your will!") #=> "At Your Will!"
|
24
|
+
# Performs input conversion according to filter requirements.
|
13
25
|
#
|
14
|
-
#
|
15
|
-
# normalize :attribute_a, :with => :titleize
|
16
|
-
# normalize :attribute_b, :with => [:custom_filter, :titleize]
|
26
|
+
# This method returns the object itself when the first argument is not a String.
|
17
27
|
#
|
18
|
-
# @param [String]
|
19
|
-
# @return [String]
|
20
|
-
# @see http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html#method-i-titleize ActiveSupport::Multibyte::Chars#titleize
|
21
|
-
# @see DownFilter Normatron::Filters::DownFilter
|
22
|
-
# @see SwapcaseFilter Normatron::Filters::SwapcaseFilter
|
23
|
-
# @see UpcaseFilter Normatron::Filters::UpcaseFilter
|
28
|
+
# @param input [String] The String to be filtered
|
29
|
+
# @return [String] A new titleized String
|
24
30
|
def self.evaluate(input)
|
25
31
|
input.kind_of?(String) ? mb_send(:titleize, input) : input
|
26
32
|
end
|
@@ -2,34 +2,40 @@ require 'normatron/filters/helpers'
|
|
2
2
|
|
3
3
|
module Normatron
|
4
4
|
module Filters
|
5
|
+
|
6
|
+
##
|
7
|
+
# Makes an underscored lowercase form from the expression in the string.
|
8
|
+
#
|
9
|
+
# Changes ‘::’ to ‘/’ to convert namespaces to paths.
|
10
|
+
#
|
11
|
+
# As a rule of thumb you can think of underscore as the inverse of camelize, though there are cases where that does
|
12
|
+
# not hold:
|
13
|
+
#
|
14
|
+
# "SSLError".underscore.camelize # => "SslError"
|
15
|
+
#
|
16
|
+
# @example Out of box
|
17
|
+
# UnderscoreFilter.evaluate("ActiveRecord::Errors") #=> "active_record/errors"
|
18
|
+
#
|
19
|
+
# @example Using as ActiveRecord::Base normalizer
|
20
|
+
# normalize :attribute_a, :with => :underscore
|
21
|
+
# normalize :attribute_b, :with => [:custom_filter, :underscore]
|
22
|
+
# normalize :attribute_c, :with => [[:underscore, :lower]]
|
23
|
+
# normalize :attribute_d, :with => [{:underscore => :lower}]
|
24
|
+
# normalize :attribute_e, :with => [:custom_filter, [:underscore, :lower]]
|
25
|
+
# normalize :attribute_f, :with => [:custom_filter, {:underscore => :lower}]
|
26
|
+
#
|
27
|
+
# @see http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-underscore ActiveSupport::Inflector#underscore
|
28
|
+
# @see CamelizeFilter Normatron::Filters::CamelizeFilter
|
5
29
|
module UnderscoreFilter
|
6
30
|
extend Helpers
|
7
31
|
|
8
32
|
##
|
9
|
-
#
|
33
|
+
# Performs input conversion according to filter requirements.
|
10
34
|
#
|
11
|
-
#
|
35
|
+
# This method returns the object itself when the first argument is not a String.
|
12
36
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
# @example
|
17
|
-
# UnderscoreFilter.evaluate("ActiveRecord::Errors") #=> "active_record/errors"
|
18
|
-
#
|
19
|
-
# @example Using as ActiveRecord::Base normalizer
|
20
|
-
# normalize :attribute_a, :with => :underscore
|
21
|
-
# normalize :attribute_b, :with => [:custom_filter, :underscore]
|
22
|
-
# normalize :attribute_c, :with => [[:underscore, :lower]]
|
23
|
-
# normalize :attribute_d, :with => [{:underscore => :lower}]
|
24
|
-
# normalize :attribute_e, :with => [:custom_filter, [:underscore, :lower]]
|
25
|
-
# normalize :attribute_f, :with => [:custom_filter, {:underscore => :lower}]
|
26
|
-
#
|
27
|
-
# @param [String] input A character sequence
|
28
|
-
# @return [String] The underscored character sequence or the object itself
|
29
|
-
# @see http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-underscore ActiveSupport::Inflector#underscore
|
30
|
-
# @see CamelizeFilter Normatron::Filters::CamelizeFilter
|
31
|
-
# @todo Performance tests
|
32
|
-
# @todo Exception class
|
37
|
+
# @param input [String] The String to be filtered
|
38
|
+
# @return [String] A new underscored String
|
33
39
|
def self.evaluate(input)
|
34
40
|
return input unless input.kind_of?(String)
|
35
41
|
|
@@ -2,25 +2,31 @@ require 'normatron/filters/helpers'
|
|
2
2
|
|
3
3
|
module Normatron
|
4
4
|
module Filters
|
5
|
+
|
6
|
+
##
|
7
|
+
# Uppercase all characters.
|
8
|
+
#
|
9
|
+
# @example Out of box
|
10
|
+
# UpcaseFilter.evaluate("borderlands") #=> "BORDERLANDS"
|
11
|
+
#
|
12
|
+
# @example Using as ActiveRecord::Base normalizer
|
13
|
+
# normalize :attribute_a, :with => :upcase
|
14
|
+
# normalize :attribute_b, :with => [:custom_filter, :upcase]
|
15
|
+
#
|
16
|
+
# @see http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html#method-i-upcase ActiveSupport::Multibyte::Chars#upcase
|
17
|
+
# @see DownFilter Normatron::Filters::DownFilter
|
18
|
+
# @see TitleizeFilter Normatron::Filters::TitleizeFilter
|
19
|
+
# @see SwapcaseFilter Normatron::Filters::SwapcaseFilter
|
5
20
|
module UpcaseFilter
|
6
21
|
extend Helpers
|
7
22
|
|
8
23
|
##
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# @example
|
12
|
-
# UpcaseFilter.evaluate("borderlands") #=> "BORDERLANDS"
|
24
|
+
# Performs input conversion according to filter requirements.
|
13
25
|
#
|
14
|
-
#
|
15
|
-
# normalize :attribute_a, :with => :upcase
|
16
|
-
# normalize :attribute_b, :with => [:custom_filter, :upcase]
|
26
|
+
# This method returns the object itself when the first argument is not a String.
|
17
27
|
#
|
18
|
-
# @param [String]
|
19
|
-
# @return [String]
|
20
|
-
# @see http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Chars.html#method-i-upcase ActiveSupport::Multibyte::Chars#upcase
|
21
|
-
# @see DownFilter Normatron::Filters::DownFilter
|
22
|
-
# @see TitleizeFilter Normatron::Filters::TitleizeFilter
|
23
|
-
# @see SwapcaseFilter Normatron::Filters::SwapcaseFilter
|
28
|
+
# @param input [String] The String to be filtered
|
29
|
+
# @return [String] A new uppercased String
|
24
30
|
def self.evaluate(input)
|
25
31
|
input.kind_of?(String) ? mb_send(:upcase, input) : input
|
26
32
|
end
|
data/lib/normatron/version.rb
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
|
-
require 'normatron/filters/ascii_filter'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
module Normatron
|
6
|
+
module Filters
|
7
|
+
describe AsciiFilter do
|
8
|
+
it { should evaluate("ÉBRIO" ).to("EBRIO" ) }
|
9
|
+
it { should evaluate("até" ).to("ate" ) }
|
10
|
+
it { should evaluate("cirurgião" ).to("cirurgiao" ) }
|
11
|
+
it { should evaluate("email@domain.com").to("email@domain.com") }
|
12
|
+
it { should evaluate("éçü&! *¬¬" ).to("ecu&! *!!" ) }
|
13
|
+
it { should evaluate("⠋⠗⠁⠝⠉⠑" ).to("france" ) }
|
14
|
+
it { should evaluate(100 ).to(100 ) }
|
15
|
+
it { should evaluate(nil ).to(nil ) }
|
16
|
+
|
17
|
+
pending "Open a pull request to Stringex.\n'¬' (not sign) character is not evaluating as expected (minus sign or tilde)."
|
18
|
+
end
|
19
|
+
end
|
14
20
|
end
|
@@ -1,15 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'normatron/filters/blank_filter'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
module Normatron
|
4
|
+
module Filters
|
5
|
+
describe BlankFilter do
|
6
|
+
it { subject.send(:evaluate, " ").should be_nil }
|
7
|
+
it { subject.send(:evaluate, "\n \t \r \f").should be_nil }
|
8
|
+
it { subject.send(:evaluate, "\n\t\r\f" ).should be_nil }
|
9
|
+
it { subject.send(:evaluate, "phase" ).should eq("phase") }
|
10
|
+
it { subject.send(:evaluate, 100 ).should eq(100) }
|
11
|
+
it { subject.send(:evaluate, nil ).should be_nil }
|
12
|
+
end
|
14
13
|
end
|
15
14
|
end
|
@@ -3,40 +3,101 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require 'normatron/filters/camelize_filter'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
it_should_behave_like "evaluable filter", ["ímpar_par/norte_sul", :upper ], "ÍmparPar::NorteSul"
|
16
|
-
it_should_behave_like "evaluable filter", ["ímpar_par/norte_sul", :lower ], "ímparPar::NorteSul"
|
17
|
-
|
18
|
-
context "should affect acronyms" do
|
19
|
-
let(:inflections) { ActiveSupport::Inflector::Inflections.instance }
|
20
|
-
|
21
|
-
before(:all) do
|
22
|
-
inflections.acronym 'HTTP'
|
23
|
-
inflections.acronym 'SSL'
|
24
|
-
inflections.acronym 'Xml'
|
25
|
-
inflections.acronym 'docType'
|
26
|
-
end
|
6
|
+
module Normatron
|
7
|
+
module Filters
|
8
|
+
describe CamelizeFilter do
|
9
|
+
it { should evaluate("aint_no/rest_for/the_wicked").to("AintNo::RestFor::TheWicked" ) }
|
10
|
+
it { should evaluate("AINT_NO/REST_FOR/THE_WICKED").to("AintNo::RestFor::TheWicked" ) }
|
11
|
+
it { should evaluate("Aint_no/Rest_for/The_wicked").to("AintNo::RestFor::TheWicked" ) }
|
12
|
+
it { should evaluate("Aint_No/Rest_For/The_Wicked").to("AintNo::RestFor::TheWicked" ) }
|
13
|
+
it { should evaluate("aInT_No/rEsT_FoR/ThE_WiCkEd").to("AintNo::RestFor::TheWicked" ) }
|
14
|
+
it { should evaluate("AiNt_nO/ReSt_fOr/tHe_wIcKeD").to("AintNo::RestFor::TheWicked" ) }
|
27
15
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
16
|
+
it { should evaluate("assets/stocks/companies" ).to("Assets::Stocks::Companies" ) }
|
17
|
+
it { should evaluate("ASSETS/STOCKS/COMPANIES" ).to("Assets::Stocks::Companies" ) }
|
18
|
+
it { should evaluate("Assets/Stocks/Companies" ).to("Assets::Stocks::Companies" ) }
|
19
|
+
it { should evaluate("aSsEtS/StOcKs/cOmPaNiEs" ).to("Assets::Stocks::Companies" ) }
|
20
|
+
it { should evaluate("AsSeTs/sToCkS/CoMpAnIeS" ).to("Assets::Stocks::Companies" ) }
|
21
|
+
|
22
|
+
it { should evaluate("bank/account" ).to("Bank::Account" ) }
|
23
|
+
it { should evaluate("BANK/ACCOUNT" ).to("Bank::Account" ) }
|
24
|
+
it { should evaluate("Bank/Account" ).to("Bank::Account" ) }
|
25
|
+
it { should evaluate("bAnK/AcCoUnT" ).to("Bank::Account" ) }
|
26
|
+
it { should evaluate("BaNk/aCcOuNt" ).to("Bank::Account" ) }
|
27
|
+
|
28
|
+
it { should evaluate("for_sale" ).to("ForSale" ) }
|
29
|
+
it { should evaluate("FOR_SALE" ).to("ForSale" ) }
|
30
|
+
it { should evaluate("For_sale" ).to("ForSale" ) }
|
31
|
+
it { should evaluate("For_Sale" ).to("ForSale" ) }
|
32
|
+
it { should evaluate("fOr_sAlE" ).to("ForSale" ) }
|
33
|
+
it { should evaluate("FoR_SaLe" ).to("ForSale" ) }
|
34
|
+
|
35
|
+
it { should evaluate("high_voltage/musics" ).to("HighVoltage::Musics" ) }
|
36
|
+
it { should evaluate("HIGH_VOLTAGE/MUSICS" ).to("HighVoltage::Musics" ) }
|
37
|
+
it { should evaluate("High_voltage/Musics" ).to("HighVoltage::Musics" ) }
|
38
|
+
it { should evaluate("High_Voltage/Musics" ).to("HighVoltage::Musics" ) }
|
39
|
+
it { should evaluate("hIgH_VoLtAgE/MuSiCs" ).to("HighVoltage::Musics" ) }
|
40
|
+
it { should evaluate("HiGh_vOlTaGe/mUsIcS" ).to("HighVoltage::Musics" ) }
|
41
|
+
|
42
|
+
it { should evaluate("note_book/black_piano" ).to("NoteBook::BlackPiano" ) }
|
43
|
+
it { should evaluate("NOTE_BOOK/BLACK_PIANO" ).to("NoteBook::BlackPiano" ) }
|
44
|
+
it { should evaluate("Note_book/Black_piano" ).to("NoteBook::BlackPiano" ) }
|
45
|
+
it { should evaluate("Note_Book/Black_Piano" ).to("NoteBook::BlackPiano" ) }
|
46
|
+
it { should evaluate("nOtE_BoOk/bLaCk_pIaNo" ).to("NoteBook::BlackPiano" ) }
|
47
|
+
it { should evaluate("NoTe_bOoK/BlAcK_PiAnO" ).to("NoteBook::BlackPiano" ) }
|
48
|
+
|
49
|
+
it { should evaluate("product" ).to("Product" ) }
|
50
|
+
it { should evaluate("PRODUCT" ).to("Product" ) }
|
51
|
+
it { should evaluate("Product" ).to("Product" ) }
|
52
|
+
it { should evaluate("pRoDuCt" ).to("Product" ) }
|
53
|
+
it { should evaluate("PrOdUcT" ).to("Product" ) }
|
34
54
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
55
|
+
it { should evaluate("south_america/brazil/paraná").to("SouthAmerica::Brazil::Paraná") }
|
56
|
+
it { should evaluate("SOUTH_AMERICA/BRAZIL/PARANÁ").to("SouthAmerica::Brazil::Paraná") }
|
57
|
+
it { should evaluate("South_america/Brazil/Paraná").to("SouthAmerica::Brazil::Paraná") }
|
58
|
+
it { should evaluate("South_America/Brazil/Paraná").to("SouthAmerica::Brazil::Paraná") }
|
59
|
+
it { should evaluate("sOuTh_aMeRiCa/bRaZiL/PaRaNá").to("SouthAmerica::Brazil::Paraná") }
|
60
|
+
it { should evaluate("SoUtH_AmErIcA/BrAzIl/pArAnÁ").to("SouthAmerica::Brazil::Paraná") }
|
61
|
+
|
62
|
+
it { should evaluate("you_cannot/steal_my/wallet" ).to("YouCannot::StealMy::Wallet" ) }
|
63
|
+
it { should evaluate("YOU_CANNOT/STEAL_MY/WALLET" ).to("YouCannot::StealMy::Wallet" ) }
|
64
|
+
it { should evaluate("You_cannot/Steal_my/Wallet" ).to("YouCannot::StealMy::Wallet" ) }
|
65
|
+
it { should evaluate("You_Cannot/Steal_My/Wallet" ).to("YouCannot::StealMy::Wallet" ) }
|
66
|
+
it { should evaluate("yOu_cAnNoT/StEaL_My/wAlLeT" ).to("YouCannot::StealMy::Wallet" ) }
|
67
|
+
it { should evaluate("YoU_CaNnOt/sTeAl_mY/WaLlEt" ).to("YouCannot::StealMy::Wallet" ) }
|
68
|
+
|
69
|
+
it { should evaluate("aint_no/rest_for/the_wicked").to("aintNo::RestFor::TheWicked" ).with(:lower) }
|
70
|
+
it { should evaluate("AINT_NO/REST_FOR/THE_WICKED").to("aintNo::RestFor::TheWicked" ).with(:lower) }
|
71
|
+
it { should evaluate("Aint_no/Rest_for/The_wicked").to("aintNo::RestFor::TheWicked" ).with(:lower) }
|
72
|
+
it { should evaluate("Aint_No/Rest_For/The_Wicked").to("aintNo::RestFor::TheWicked" ).with(:lower) }
|
73
|
+
it { should evaluate("aInT_No/rEsT_FoR/ThE_WiCkEd").to("aintNo::RestFor::TheWicked" ).with(:lower) }
|
74
|
+
it { should evaluate("AiNt_nO/ReSt_fOr/tHe_wIcKeD").to("aintNo::RestFor::TheWicked" ).with(:lower) }
|
75
|
+
|
76
|
+
it { should evaluate(100).to(100) }
|
77
|
+
it { should evaluate(nil).to(nil) }
|
78
|
+
|
79
|
+
context "with acronyms setted" do
|
80
|
+
let(:inflections) { ActiveSupport::Inflector::Inflections.instance }
|
81
|
+
|
82
|
+
before(:all) do
|
83
|
+
inflections.acronym 'HTTP'
|
84
|
+
inflections.acronym 'SSL'
|
85
|
+
inflections.acronym 'Xml'
|
86
|
+
inflections.acronym 'docType'
|
87
|
+
end
|
88
|
+
|
89
|
+
after(:all) do
|
90
|
+
inflections.acronyms.delete("http")
|
91
|
+
inflections.acronyms.delete("ssl")
|
92
|
+
inflections.acronyms.delete("xml")
|
93
|
+
inflections.acronyms.delete("doctype")
|
94
|
+
end
|
95
|
+
|
96
|
+
it { should evaluate("http_address/ssl/xml_file/doctype").to("HTTPAddress::SSL::XmlFile::docType") }
|
97
|
+
it { should evaluate("http_address/ssl/xml_file/doctype").to("httpAddress::SSL::XmlFile::docType").with(:lower) }
|
98
|
+
it { should evaluate("doctype_stop/run_ssl/xml/mix_http").to("docTypeStop::RunSSL::Xml::MixHTTP" ) }
|
99
|
+
it { should evaluate("doctype_stop/run_ssl/xml/mix_http").to("doctypeStop::RunSSL::Xml::MixHTTP" ).with(:lower) }
|
100
|
+
end
|
101
|
+
end
|
41
102
|
end
|
42
103
|
end
|
@@ -4,11 +4,12 @@ require 'spec_helper'
|
|
4
4
|
require 'normatron/filters/capitalize_filter'
|
5
5
|
|
6
6
|
describe Normatron::Filters::CapitalizeFilter do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
it { should evaluate("i love winter" ).to("I love winter" ) }
|
8
|
+
it { should evaluate("I LOVE WINTER" ).to("I love winter" ) }
|
9
|
+
it { should evaluate("ó, vida cruel!").to("Ó, vida cruel!") }
|
10
|
+
it { should evaluate("Ó, VIDA CRUEL!").to("Ó, vida cruel!") }
|
11
|
+
it { should evaluate("1 minute" ).to("1 minute" ) }
|
12
|
+
it { should evaluate("1 MINUTE" ).to("1 minute" ) }
|
13
|
+
it { should evaluate(100 ).to(100 ) }
|
14
|
+
it { should evaluate(nil ).to(nil ) }
|
14
15
|
end
|
@@ -5,6 +5,6 @@ require 'normatron/filters/squeeze_filter'
|
|
5
5
|
|
6
6
|
describe Normatron::Filters::SqueezeFilter do
|
7
7
|
it_should_behave_like "string processor"
|
8
|
-
|
9
|
-
|
8
|
+
it { should evaluate("squeezing: hells bells").to("squezing: hels bels" ) }
|
9
|
+
it { should evaluate("squeezing: hells bells").to("squeezing: hels bels").with("l") }
|
10
10
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "normatron"
|
4
4
|
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each { |f| require f }
|
5
5
|
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.include(FilterMatchers)
|
8
|
+
config.order = "random"
|
9
|
+
end
|
10
|
+
|
6
11
|
shared_examples "evaluable filter" do |args, expected|
|
7
12
|
if args.size == 1
|
8
13
|
it { subject.send(:evaluate, args[0]).should_not equal expected }
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module FilterMatchers
|
2
|
+
def evaluate(input)
|
3
|
+
EvaluateMatcher.new(input)
|
4
|
+
end
|
5
|
+
|
6
|
+
class EvaluateMatcher
|
7
|
+
def initialize(input)
|
8
|
+
@input = input
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def to(output)
|
13
|
+
@expected = output
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def with(*args)
|
18
|
+
@args = args
|
19
|
+
self
|
20
|
+
end
|
21
|
+
|
22
|
+
def matches?(filter_module)
|
23
|
+
@filter = filter_module
|
24
|
+
@got = get_evaluation
|
25
|
+
@reason = get_failure_reason
|
26
|
+
@reason.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
def description
|
30
|
+
case @reason
|
31
|
+
when :value
|
32
|
+
"eq #{@expected.inspect}"
|
33
|
+
when :identity
|
34
|
+
"not equal #{@expected.inspect}"
|
35
|
+
when :type
|
36
|
+
"be a kind of #{@input.class}"
|
37
|
+
else
|
38
|
+
"evaluate #{@input.inspect} to #{@expected.inspect}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def failure_message
|
43
|
+
case @reason
|
44
|
+
when :value
|
45
|
+
["input: #{@input.inspect}",
|
46
|
+
"expected: #{@expected.inspect}",
|
47
|
+
"got: #{@got.inspect}"] * "\n"
|
48
|
+
when :identity
|
49
|
+
"expected #{@filter.name} evaluate and returns a different object_id from input object."
|
50
|
+
when :type
|
51
|
+
"expected #{@filter.name} evaluate and returns the same object type of his input."
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def get_evaluation
|
58
|
+
if @args.nil?
|
59
|
+
@filter.evaluate(@input)
|
60
|
+
else
|
61
|
+
@filter.evaluate(@input, *@args)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_failure_reason
|
66
|
+
if @got != @expected
|
67
|
+
:value
|
68
|
+
elsif !@got.kind_of?(@input.class)
|
69
|
+
:type
|
70
|
+
elsif @got.equal?(@input) && @got.kind_of?(String)
|
71
|
+
:identity
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|