transformers 0.0.1

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 ADDED
@@ -0,0 +1,5 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ .idea/*
5
+ log/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in transformers.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,97 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ transformers (0.0.1)
5
+ activesupport (~> 3.0.0)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ abstract (1.0.0)
11
+ actionmailer (3.0.5)
12
+ actionpack (= 3.0.5)
13
+ mail (~> 2.2.15)
14
+ actionpack (3.0.5)
15
+ activemodel (= 3.0.5)
16
+ activesupport (= 3.0.5)
17
+ builder (~> 2.1.2)
18
+ erubis (~> 2.6.6)
19
+ i18n (~> 0.4)
20
+ rack (~> 1.2.1)
21
+ rack-mount (~> 0.6.13)
22
+ rack-test (~> 0.5.7)
23
+ tzinfo (~> 0.3.23)
24
+ activemodel (3.0.5)
25
+ activesupport (= 3.0.5)
26
+ builder (~> 2.1.2)
27
+ i18n (~> 0.4)
28
+ activerecord (3.0.5)
29
+ activemodel (= 3.0.5)
30
+ activesupport (= 3.0.5)
31
+ arel (~> 2.0.2)
32
+ tzinfo (~> 0.3.23)
33
+ activeresource (3.0.5)
34
+ activemodel (= 3.0.5)
35
+ activesupport (= 3.0.5)
36
+ activesupport (3.0.5)
37
+ arel (2.0.9)
38
+ builder (2.1.2)
39
+ diff-lcs (1.1.2)
40
+ erubis (2.6.6)
41
+ abstract (>= 1.0.0)
42
+ i18n (0.5.0)
43
+ mail (2.2.17)
44
+ activesupport (>= 2.3.6)
45
+ i18n (>= 0.4.0)
46
+ mime-types (~> 1.16)
47
+ treetop (~> 1.4.8)
48
+ mime-types (1.16)
49
+ mocha (0.9.12)
50
+ polyglot (0.3.1)
51
+ rack (1.2.2)
52
+ rack-mount (0.6.14)
53
+ rack (>= 1.0.0)
54
+ rack-test (0.5.7)
55
+ rack (>= 1.0)
56
+ rails (3.0.5)
57
+ actionmailer (= 3.0.5)
58
+ actionpack (= 3.0.5)
59
+ activerecord (= 3.0.5)
60
+ activeresource (= 3.0.5)
61
+ activesupport (= 3.0.5)
62
+ bundler (~> 1.0)
63
+ railties (= 3.0.5)
64
+ railties (3.0.5)
65
+ actionpack (= 3.0.5)
66
+ activesupport (= 3.0.5)
67
+ rake (>= 0.8.7)
68
+ thor (~> 0.14.4)
69
+ rake (0.8.7)
70
+ rspec (2.5.0)
71
+ rspec-core (~> 2.5.0)
72
+ rspec-expectations (~> 2.5.0)
73
+ rspec-mocks (~> 2.5.0)
74
+ rspec-core (2.5.1)
75
+ rspec-expectations (2.5.0)
76
+ diff-lcs (~> 1.1.2)
77
+ rspec-mocks (2.5.0)
78
+ rspec-rails (2.5.0)
79
+ actionpack (~> 3.0)
80
+ activesupport (~> 3.0)
81
+ railties (~> 3.0)
82
+ rspec (~> 2.5.0)
83
+ thor (0.14.6)
84
+ treetop (1.4.9)
85
+ polyglot (>= 0.3.1)
86
+ tzinfo (0.3.26)
87
+
88
+ PLATFORMS
89
+ ruby
90
+
91
+ DEPENDENCIES
92
+ activesupport (~> 3.0.0)
93
+ mocha (~> 0.9.10)
94
+ rails (~> 3.0.0)
95
+ rspec (~> 2.5.0)
96
+ rspec-rails (~> 2.5.0)
97
+ transformers!
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2011 Deepak N
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,114 @@
1
+ Transformers [![Build Status](http://travis-ci.org/endeepak/transformers.png)](http://travis-ci.org/endeepak/transformers)
2
+ ============
3
+
4
+ Transformers is an extension to hash to allow various transformations using simple DSL. It also has optional rails extension to dry up frequently applied transformations on controller params.
5
+
6
+ Install
7
+ =======
8
+
9
+ [not yet released]
10
+
11
+ Usage
12
+ =====
13
+
14
+ gem install transformers
15
+
16
+ OR Add dependency in gem file for projects using bundler
17
+
18
+ gem transformers
19
+
20
+ Available Transformations
21
+ =========================
22
+
23
+ * Convert values
24
+
25
+ hash = {:foo => 'bar'}
26
+
27
+ hash.convert :eric, :to => lambda { |value| value.upcase }
28
+
29
+ OR use short hand notation to call a method on the value
30
+
31
+ hash.convert :foo, :to => :upcase
32
+
33
+ * Combine keys
34
+
35
+ hash.convert :begin, :end, :as => :range
36
+
37
+ * Rename keys
38
+
39
+ hash.rename :foo, :to => :bar
40
+
41
+ OR
42
+
43
+ hash.convert :foo, :as => :bar
44
+
45
+ * Alias key
46
+
47
+ hash.copy :foo, :to => :bar
48
+
49
+ * Convert and combine
50
+
51
+ hash.convert :first_name, :last_name, :as => :name, :to => lambda { |first_name, last_name| first_name + ' '+ last_name }
52
+
53
+ * Conversion using type converters
54
+
55
+ hash = {:foo => 'true'}
56
+
57
+ hash.convert :foo, :to => :boolean #built-in
58
+
59
+ * Using Custom converters : You can pass a lambda or define a module or an object which has a call method. This method will receive values for given keys and should return the converted value.
60
+
61
+ module Transformers::Name
62
+ def self.call(first_name, last_name)
63
+ return first_name + ' '+ last_name
64
+ end
65
+ end
66
+
67
+ Register the converter
68
+
69
+ Transformers.register(:name, Transformers::Name)
70
+
71
+ Usage
72
+
73
+ hash.convert :first_name, :last_name, :as => :name, :to => :name
74
+
75
+ * Use them together in a transform block
76
+
77
+ hash.transform do
78
+ delete :unwanted
79
+ rename :foo, :to => :bar
80
+ convert :first_name, :last_name, :as => :name, :to => :name
81
+ end
82
+
83
+
84
+ Rails Extensions
85
+ ================
86
+
87
+ To Include rails extensions add the below line in a config/initializer/transformers.rb. You can register the custom transformers in the same file.
88
+
89
+ require 'transformers/rails'
90
+
91
+ This adds _transform\_params_ extension to action controller. You can define the transformations for any action as,
92
+
93
+ transform_params :search, :only => :index do
94
+ convert :first_name, :last_name, :as => :name, :to => :name
95
+ end
96
+
97
+ This will add a before\_filter in the controller to apply transformations on params[:search]. If the first argument is omitted, the transformations will be applied directly on the params. The options for transform\_params are same as before\_filter options.
98
+
99
+ Rspec Matcher
100
+ =============
101
+ This gem has a rspec matcher for testing the custom converters. To use this, add the below line in the _spec\_helper_
102
+
103
+ require 'rspec/transformers'
104
+
105
+ The converter spec can be written as
106
+
107
+ describe Transformers::Boolean do
108
+ it { should convert('true').to(true)}
109
+ it { should convert('false').to(false)}
110
+ end
111
+
112
+
113
+
114
+
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rspec"
5
+ require "rspec/core/rake_task"
6
+
7
+ RSpec::Core::RakeTask.new do |t|
8
+ t.rspec_opts = %w(--format documentation --color)
9
+ t.pattern = 'spec/**/*_spec.rb'
10
+ end
11
+
12
+ task :default => ["spec"]
data/TODO.md ADDED
File without changes
@@ -0,0 +1,18 @@
1
+ RSpec::Matchers.define :convert do |value|
2
+ chain :to do |expected_value|
3
+ @expected_value = expected_value
4
+ end
5
+
6
+ match do
7
+ @converted_value = subject.call(value)
8
+ @converted_value == @expected_value
9
+ end
10
+
11
+ failure_message_for_should do |model|
12
+ "expected #{subject} to convert #{value.inspect} to #{@expected_value.inspect} but was #{@converted_value.inspect}"
13
+ end
14
+
15
+ description do
16
+ "convert #{value.inspect} to #{@expected_value.inspect}"
17
+ end
18
+ end
@@ -0,0 +1 @@
1
+ require 'rspec/support/convert_to_matcher'
@@ -0,0 +1,31 @@
1
+ require 'active_support/core_ext/array/extract_options'
2
+
3
+ require 'transformers/boolean'
4
+ require 'transformers/method_call'
5
+ require 'transformers/missing_option'
6
+ require 'transformers/unknown_transformer'
7
+ require 'transformers/extensions/hash'
8
+
9
+ module Transformers
10
+ STANDARD = { :boolean => Transformers::Boolean }.freeze
11
+
12
+ def self.custom
13
+ @custom ||= {}
14
+ end
15
+
16
+ def self.all
17
+ custom.merge(STANDARD)
18
+ end
19
+
20
+ def self.get(transformer)
21
+ case transformer
22
+ when Module, Proc: transformer
23
+ when Symbol: all.has_key?(transformer) ? all[transformer] : MethodCall.new(transformer)
24
+ else raise UnknownTransformer.new(transformer)
25
+ end
26
+ end
27
+
28
+ def self.register(name, transformer)
29
+ custom[name] = transformer
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ module Transformers
2
+ module Boolean
3
+ TRUE_VALUES = ['true', true].freeze
4
+
5
+ def self.call(value)
6
+ TRUE_VALUES.include?(value)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ require "action_controller/railtie"
2
+
3
+ module Transformers
4
+ module Extensions
5
+ module ActionController
6
+ def self.included(klass)
7
+ klass.extend ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def transform_params(*args, &block)
12
+ options = args.extract_options!
13
+ before_filter(options) { params.transform(args.first, &block) }
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ ActionController::Base.send(:include, Transformers::Extensions::ActionController)
@@ -0,0 +1,37 @@
1
+ module Transformers
2
+ module Extensions
3
+ module Hash
4
+ def transform(key = nil, &block)
5
+ target = key.nil? ? self : self[key]
6
+ if target
7
+ raise TypeError.new("Can't apply transformations on #{target.inspect}. Expected a Hash") unless target.is_a?(Hash)
8
+ target.instance_eval(&block)
9
+ end
10
+ end
11
+
12
+ def convert(*keys)
13
+ options = keys.extract_options!
14
+ return unless keys.any? { |key| self.has_key?(key) }
15
+ new_key = options[:as] || keys.first
16
+ converter = options[:to]
17
+ values = keys.collect { |key| delete(key) }
18
+ new_value = converter ? Transformers.get(converter).call(*values) : (values.length == 1 ? values.first : values)
19
+ self[new_key] = new_value
20
+ end
21
+
22
+ def rename(key, options = {})
23
+ new_key = options[:to]
24
+ raise MissingOption.new(:to) if new_key.nil?
25
+ self[new_key] = self.delete(key)
26
+ end
27
+
28
+ def copy(key, options = {})
29
+ new_key = options[:to]
30
+ raise MissingOption.new(:to) if new_key.nil?
31
+ self[new_key] = self[key]
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ Hash.send(:include, Transformers::Extensions::Hash)
@@ -0,0 +1,17 @@
1
+ module Transformers
2
+ class MethodCall
3
+ attr_reader :name
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def call(value)
10
+ value.send(self.name)
11
+ end
12
+
13
+ def ==(other)
14
+ self.name.to_s == other.name.to_s
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ module Transformers
2
+ class MissingOption < Exception
3
+ def initialize(*options)
4
+ super("Missing options : #{options.collect(&:inspect).join(', ')}")
5
+ end
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require 'transformers/extensions/action_controller'
@@ -0,0 +1,7 @@
1
+ module Transformers
2
+ class UnknownTransformer < Exception
3
+ def initialize(transformer)
4
+ super("The #{transformer.inspect} transformer is not supported")
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Transformers
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,12 @@
1
+ require 'rails/all'
2
+
3
+ class Transformers::Application < Rails::Application
4
+ end
5
+
6
+ require 'rspec/rails'
7
+
8
+ Transformers::Application.routes.draw do
9
+ match ':controller(/:action(/:id(.:format)))'
10
+ end
11
+
12
+ include Rails.application.routes.url_helpers
@@ -0,0 +1,9 @@
1
+ require 'transformers'
2
+ require 'transformers/rails'
3
+ require 'rspec/transformers'
4
+
5
+ require 'rails_spec_helper'
6
+
7
+ RSpec.configure do |config|
8
+ config.mock_with :mocha
9
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Transformers::Boolean do
4
+ it { should convert('true').to(true)}
5
+ it { should convert(true).to(true)}
6
+
7
+ it { should convert(false).to(false)}
8
+ it { should convert('false').to(false)}
9
+ it { should convert(nil).to(false)}
10
+ it { should convert('').to(false)}
11
+ it { should convert(' ').to(false)}
12
+ it { should convert('anything else').to(false)}
13
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ #TODO: Find why adding transform_params in individual spec definition fails and fix it.
4
+ class TestActionController < ActionController::Base
5
+ transform_params { convert :foo, :to => :upcase }
6
+
7
+ transform_params :bar do
8
+ convert :foo, :to => :upcase
9
+ end
10
+
11
+ transform_params :baz, :only => :index do
12
+ convert :foo, :to => :upcase
13
+ end
14
+
15
+ def index; head :ok; end
16
+ def show; head :ok; end
17
+ end
18
+
19
+ describe TestActionController, :type => :controller do
20
+ describe "transform_params" do
21
+ context "without args" do
22
+ it "transforms params by default" do
23
+ get :index, :foo => "hello"
24
+
25
+ controller.params[:foo].should == "HELLO"
26
+ end
27
+ end
28
+
29
+ context "with a key name as param" do
30
+ it "transforms params[key]" do
31
+ get :index, :bar => {:foo => "hello"}
32
+
33
+ controller.params[:bar][:foo].should == "HELLO"
34
+ end
35
+ end
36
+
37
+ context "with additional options" do
38
+ it "should pass the options to before filter" do
39
+ get :index, :baz => {:foo => "hello"}
40
+ controller.params[:baz][:foo].should == "HELLO"
41
+
42
+ get :show, :baz => {:foo => "hello"}
43
+ controller.params[:baz][:foo].should == "hello"
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,193 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+ describe "#transform" do
5
+ context "without any arguments" do
6
+ it "should execute the transformations in the context of hash" do
7
+ hash = {:key => 'value'}
8
+
9
+ hash.transform { delete :key }
10
+
11
+ hash.should_not have_key(:key)
12
+ end
13
+ end
14
+
15
+ context "with key as argument" do
16
+ context "when value is not a hash" do
17
+ it "should execute the transformations in the context of value" do
18
+ hash = {:key => { :nested_key => 'value'} }
19
+
20
+ hash.transform(:key) { delete :nested_key }
21
+
22
+ hash[:key].should_not have_key(:nested_key)
23
+ end
24
+ end
25
+
26
+ context "when value in nil" do
27
+ it "should not execute any transformations" do
28
+ hash = {:key => nil }
29
+
30
+ hash.transform(:key) { delete :nested_key }
31
+
32
+ hash[:key].should be_nil
33
+ end
34
+ end
35
+
36
+ context "when value is not a hash" do
37
+ it "should raise error" do
38
+ hash = {:key => 'value' }
39
+
40
+ expect {
41
+ hash.transform(:key) do
42
+ convert :foo, :as => :bar
43
+ end
44
+ }.should raise_error(/Can't apply transformations on "value". Expected a Hash/)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "#convert" do
51
+ context "with :as option" do
52
+ context "for single key" do
53
+ it "should rename the key" do
54
+ hash = {:stan => 'marsh'}
55
+
56
+ hash.convert :stan, :as => :eric
57
+
58
+ hash.should_not have_key(:stan)
59
+ hash.should have_key(:eric)
60
+ hash[:eric].should == 'marsh'
61
+ end
62
+ end
63
+
64
+ context "for multiple keys" do
65
+ it "should combine the keys to single key" do
66
+ hash = {:begin => 12, :end => 22}
67
+
68
+ hash.convert :begin, :end, :as => :range
69
+
70
+ hash.should_not have_key(:begin)
71
+ hash.should_not have_key(:end)
72
+ hash.should have_key(:range)
73
+ hash[:range].should == [12, 22]
74
+ end
75
+ end
76
+ end
77
+
78
+ context "with :to option" do
79
+ it "should call 'call' on the converter obtained from transformer to set converted value" do
80
+ hash = {:key => :value}
81
+ converter = mock
82
+ Transformers.expects(:get).with(:converter).returns(converter)
83
+ converter.expects(:call).with(:value).returns(:converted_value)
84
+
85
+ hash.convert :key, :to => :converter
86
+
87
+ hash[:key].should == :converted_value
88
+ end
89
+
90
+ context "for single key" do
91
+ context "when key exists" do
92
+ it "should replace value with converted value" do
93
+ hash = {:eric => 'cartman'}
94
+
95
+ hash.convert :eric, :to => lambda { |value| value.upcase }
96
+
97
+ hash[:eric].should == 'CARTMAN'
98
+ end
99
+ end
100
+
101
+ context "when key does not exist" do
102
+ it "should not apply conversion" do
103
+ hash = {:eric => 'cartman'}
104
+
105
+ hash.convert :stan, :to => :kyle
106
+
107
+ hash[:eric].should == 'cartman'
108
+ hash.should_not have_key(:stan)
109
+ end
110
+ end
111
+ end
112
+
113
+ context "when hash has indifferent access" do
114
+ it "should apply conversion" do
115
+ hash = {'eric' => 'cartman'}.with_indifferent_access
116
+
117
+ hash.convert :eric, :to => :upcase
118
+
119
+ hash['eric'].should == 'CARTMAN'
120
+ end
121
+ end
122
+
123
+ context "for multiple keys" do
124
+ context "when all keys exists" do
125
+ it "should pass multiple values to converter and set converted vlaue for key given in :as option" do
126
+ hash = {:first_name => 'eric', :last_name => 'cartman' }
127
+
128
+ hash.convert :first_name, :last_name, :as => :name, :to => lambda { |first_name, last_name| "#{first_name} #{last_name}" }
129
+
130
+ hash[:name].should == 'eric cartman'
131
+ end
132
+ end
133
+
134
+ context "when one of keys exists" do
135
+ it "should pass multiple values to converter and set converted vlaue for key given in :as option" do
136
+ hash = {:first_name => 'eric' }
137
+
138
+ hash.convert :first_name, :last_name, :as => :name, :to => lambda { |first_name, last_name| "#{first_name} #{last_name}" }
139
+
140
+ hash[:name].should == 'eric '
141
+ end
142
+ end
143
+
144
+ context "when none of keys exists" do
145
+ it "should not apply conversion" do
146
+ hash = {}
147
+
148
+ hash.convert :first_name, :last_name, :as => :name, :to => lambda { |first_name, last_name| "#{first_name} #{last_name}" }
149
+
150
+ hash.should_not have_key(:name)
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ describe "rename" do
158
+ it "should rename the key" do
159
+ hash = {:stan => 'marsh'}
160
+
161
+ hash.rename :stan, :to => :eric
162
+
163
+ hash.should_not have_key(:stan)
164
+ hash.should have_key(:eric)
165
+ hash[:eric].should == 'marsh'
166
+ end
167
+
168
+ it "should raise error if :to option is missing" do
169
+ hash = {:stan => 'marsh'}
170
+
171
+ expect { hash.rename :stan }.should raise_error(/Missing options : :to/)
172
+ end
173
+ end
174
+
175
+ describe "copy" do
176
+ it "should copy the value to another key" do
177
+ hash = {:stan => 'southpark'}
178
+
179
+ hash.copy :stan, :to => :eric
180
+
181
+ hash.should have_key(:eric)
182
+ hash.should have_key(:stan)
183
+ hash[:eric].should == hash[:stan]
184
+ end
185
+
186
+ it "should raise error if :to option is missing" do
187
+ hash = {:stan => 'marsh'}
188
+
189
+ expect { hash.copy :stan }.should raise_error(/Missing options : :to/)
190
+ end
191
+ end
192
+ end
193
+
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Transformers::MethodCall do
4
+ context "with method name :upcase" do
5
+ subject { Transformers::MethodCall.new(:upcase) }
6
+
7
+ it { should convert('hello').to('HELLO') }
8
+ it { should == Transformers::MethodCall.new(:upcase) }
9
+ it { should == Transformers::MethodCall.new('upcase') }
10
+ end
11
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Transformers do
4
+ describe ".get" do
5
+ context "when key is a proc" do
6
+ it "should return proc" do
7
+ transformer = lambda { |value| return :converted_value }
8
+
9
+ Transformers.get(transformer).should == transformer
10
+ end
11
+ end
12
+
13
+ context "when key is a module" do
14
+ it "should return module" do
15
+ Transformers.get(Transformers::Boolean).should == Transformers::Boolean
16
+ end
17
+ end
18
+
19
+ context "when key is symbol" do
20
+ context "standard transformer" do
21
+ it "should return standard transformer" do
22
+ Transformers.get(:boolean).should == Transformers::Boolean
23
+ end
24
+ end
25
+
26
+ context "registered transformer" do
27
+ it "should return registered transformer" do
28
+ transformer = lambda {|value| value.downcase }
29
+ Transformers.register(:downcase, transformer)
30
+
31
+ Transformers.get(:downcase).should == transformer
32
+ end
33
+ end
34
+
35
+ context "not registered" do
36
+ it "should return method call transformer" do
37
+ Transformers.get(:upcase).should == Transformers::MethodCall.new(:upcase)
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when key is anything else" do
43
+ it "should raise error" do
44
+ expect { Transformers.get("UNKNOWN") }.should raise_error('The "UNKNOWN" transformer is not supported')
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "transformers/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "transformers"
7
+ s.version = Transformers::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Deepak N"]
10
+ s.email = ["endeep123@gmail.com"]
11
+ s.homepage = "https://github.com/endeepak/transformers"
12
+ s.summary = %q{DSL to transform a hash}
13
+ s.description = %q{An extension to hash to allow various transformations using simple DSL. Also has optional rails extension to dry up frequently applied transformations on controller params.}
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+ s.add_runtime_dependency("activesupport", "~> 3.0.0")
20
+ s.add_development_dependency("rails", "~> 3.0.0")
21
+ s.add_development_dependency("rspec", "~> 2.5.0")
22
+ s.add_development_dependency("rspec-rails", "~> 2.5.0")
23
+ s.add_development_dependency("mocha", "~> 0.9.10")
24
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: transformers
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Deepak N
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-15 00:00:00 +05:30
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activesupport
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 3
32
+ - 0
33
+ - 0
34
+ version: 3.0.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rails
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 7
46
+ segments:
47
+ - 3
48
+ - 0
49
+ - 0
50
+ version: 3.0.0
51
+ type: :development
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 27
62
+ segments:
63
+ - 2
64
+ - 5
65
+ - 0
66
+ version: 2.5.0
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec-rails
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ hash: 27
78
+ segments:
79
+ - 2
80
+ - 5
81
+ - 0
82
+ version: 2.5.0
83
+ type: :development
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: mocha
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 47
94
+ segments:
95
+ - 0
96
+ - 9
97
+ - 10
98
+ version: 0.9.10
99
+ type: :development
100
+ version_requirements: *id005
101
+ description: An extension to hash to allow various transformations using simple DSL. Also has optional rails extension to dry up frequently applied transformations on controller params.
102
+ email:
103
+ - endeep123@gmail.com
104
+ executables: []
105
+
106
+ extensions: []
107
+
108
+ extra_rdoc_files: []
109
+
110
+ files:
111
+ - .gitignore
112
+ - Gemfile
113
+ - Gemfile.lock
114
+ - LICENSE
115
+ - README.md
116
+ - Rakefile
117
+ - TODO.md
118
+ - lib/rspec/support/convert_to_matcher.rb
119
+ - lib/rspec/transformers.rb
120
+ - lib/transformers.rb
121
+ - lib/transformers/boolean.rb
122
+ - lib/transformers/extensions/action_controller.rb
123
+ - lib/transformers/extensions/hash.rb
124
+ - lib/transformers/method_call.rb
125
+ - lib/transformers/missing_option.rb
126
+ - lib/transformers/rails.rb
127
+ - lib/transformers/unknown_transformer.rb
128
+ - lib/transformers/version.rb
129
+ - spec/rails_spec_helper.rb
130
+ - spec/spec_helper.rb
131
+ - spec/transformers/boolean_spec.rb
132
+ - spec/transformers/extensions/action_controller_spec.rb
133
+ - spec/transformers/extensions/hash_spec.rb
134
+ - spec/transformers/method_call_spec.rb
135
+ - spec/transformers_spec.rb
136
+ - transformers.gemspec
137
+ has_rdoc: true
138
+ homepage: https://github.com/endeepak/transformers
139
+ licenses: []
140
+
141
+ post_install_message:
142
+ rdoc_options: []
143
+
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ hash: 3
152
+ segments:
153
+ - 0
154
+ version: "0"
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: 3
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ requirements: []
165
+
166
+ rubyforge_project:
167
+ rubygems_version: 1.4.2
168
+ signing_key:
169
+ specification_version: 3
170
+ summary: DSL to transform a hash
171
+ test_files:
172
+ - spec/rails_spec_helper.rb
173
+ - spec/spec_helper.rb
174
+ - spec/transformers/boolean_spec.rb
175
+ - spec/transformers/extensions/action_controller_spec.rb
176
+ - spec/transformers/extensions/hash_spec.rb
177
+ - spec/transformers/method_call_spec.rb
178
+ - spec/transformers_spec.rb