normatron 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|