multiparameter_attributes_handler 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWFmYjJjMmVhMDMzMGY1NGFlMTY3Yzc1Mjk2OTIyYjdmZjM5MTE3ZA==
5
+ data.tar.gz: !binary |-
6
+ ZmEzZWIzMzcwMzM5MGQyZmUzMDkyNTBiODlmN2U1NmFjODUyZGU5OQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OTkwYmE5ZTFmNDRiYzQxMWJhMTNmMTU5N2E5YTUyMjVjZjJiNTZjNzIzMjll
10
+ NTVhOTZjZTI2MTg1ODA2M2Y4NTY0MTI0MzQ5MjZmMTI0OGY4YmIxOTRkYzMx
11
+ MDI5N2YyNDY5MmFkOTdjODhjNWNhNTNiYzZjMjI3ODQ5NGQ5NzQ=
12
+ data.tar.gz: !binary |-
13
+ YzVjZTY3NmIyZGU5ODdlMDE3OTc0NWIyZjUwMzQ2OGE0ODMzODM2NWYzMDNi
14
+ M2NhZGFlNjI4NTkwMzI0MDU5YzIxNjU5ZTUzOGVhOTdiNzMzOTZiNTA2YWM2
15
+ MzA3NzRlNjY2ZWZjY2ViYjdjNjA5NWQzNDEwZGYwMTUyNWZlZGY=
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
- == Multiparameter Attributes Handler
1
+ = Multiparameter Attributes Handler
2
2
 
3
- === Background
3
+ == Background
4
4
 
5
5
  Rails form helpers for time, datetime and date return multiparameter attributes
6
6
  that ActiveRecord objects are able to convert into parent attributes.
@@ -18,9 +18,9 @@ when set to 24th June 2004, will generate
18
18
  }
19
19
 
20
20
  ActiveRecord understands this and converts these key/value pairs into a date
21
- object that is passed to thing.last_read=
21
+ object that is passed to thing#last_read= method.
22
22
 
23
- === A solution without ActiveRecord
23
+ == A solution without ActiveRecord
24
24
 
25
25
  Multiparameter Attributes Handler allows other objects to do the same.
26
26
 
@@ -35,6 +35,24 @@ This creates a last_read key with a time object derived from the values
35
35
  "last_read" => Time.local('2004', '6', '24')
36
36
  }
37
37
 
38
+ === Modifying the output
39
+
40
+ If you need to modify the derived values, pass a block to manipulate_all, and
41
+ that will be called on each output value.
42
+
43
+ thing_params = MultiparameterAttributesHandler.manipulate_all(params[:thing], &:to_s)
44
+
45
+ Will create
46
+
47
+ thing_params == {
48
+ "last_read(1i)" => "2004",
49
+ "last_read(2i)" => "6",
50
+ "last_read(3i)" => "24",
51
+ "last_read" => Time.local('2004', '6', '24').to_s
52
+ }
53
+
54
+ == An ActiveResource example
55
+
38
56
  So for a ActiveResource Thing, this functionality can be added by over-riding
39
57
  the attributes setter:
40
58
 
@@ -44,6 +62,8 @@ the attributes setter:
44
62
  end
45
63
  end
46
64
 
65
+ == Use within a Rails controller
66
+
47
67
  However, as the params splitting and rebuilding is happening in the views and
48
68
  controller space, it might well make more sense to do the manipulation in the
49
69
  controller:
@@ -64,16 +84,14 @@ controller:
64
84
  end
65
85
  end
66
86
 
67
- === Only setter affected
87
+ == Only setter affected
68
88
 
69
89
  Note that this gem provides handling of the parameters received from the form
70
- submission. For the form helpers to work, they need to passed a date or time
71
- to the form.
90
+ submission. For the form helpers to work, they need to be passed a date or time.
72
91
 
73
92
  One solution is to override the getter in the model. So for the Thing example
74
93
  above:
75
94
 
76
- require 'date'
77
95
  class Thing < ActiveResource::Base
78
96
 
79
97
  def last_read
@@ -83,9 +101,9 @@ above:
83
101
 
84
102
  Rails form date helpers will then work for last_read:
85
103
 
86
- datetime_select(:thing, :last_read)
104
+ date_select(:thing, :last_read)
87
105
 
88
- === Installation
106
+ == Installation
89
107
 
90
108
  This functionality is made available via the multiparameter_attributes_handler
91
109
  gem. So add this to your gemfile:
@@ -2,8 +2,8 @@ require_relative 'multiparameter_attributes_handler/manipulator'
2
2
  require_relative 'multiparameter_attributes_handler/multiparameter_attributes_handler_error'
3
3
  module MultiparameterAttributesHandler
4
4
 
5
- def self.manipulate_all(hash)
6
- Manipulator.new(hash).output
5
+ def self.manipulate_all(hash, &value_mod)
6
+ Manipulator.new(hash, &value_mod).output
7
7
  end
8
8
 
9
9
  end
@@ -1,10 +1,11 @@
1
1
  module MultiparameterAttributesHandler
2
2
  class Manipulator
3
3
 
4
- attr_accessor :hash
4
+ attr_accessor :hash, :value_mod
5
5
 
6
- def initialize(hash)
6
+ def initialize(hash, &value_mod)
7
7
  @hash = hash
8
+ @value_mod = value_mod
8
9
  end
9
10
 
10
11
  def multiparameters
@@ -24,7 +25,9 @@ module MultiparameterAttributesHandler
24
25
  def value_of(multiparameter)
25
26
  values = values_for(multiparameter)
26
27
  return values unless values.kind_of? Array
27
- convert_to_time(multiparameter, values)
28
+ time = convert_to_time(multiparameter, values)
29
+ return time unless value_mod
30
+ value_mod.call(time)
28
31
  end
29
32
 
30
33
  def output
@@ -1,10 +1,17 @@
1
1
  module MultiparameterAttributesHandler
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # 0.1.0: Allowed a block to be user to modify the output
9
+ # ------------------------------------------------------
10
+ # A use case was found where the resulting data needed to be stored as a
11
+ # string, rather than a date. As there may be other ways the output needs
12
+ # modifying, this functionality was added by allowing a block to be
13
+ # passed to manipulate_all.
14
+ #
8
15
  # 0.0.2: Modified usage so that developer decides where manipulation happens
9
16
  # ---------------------------------------------------------------------------
10
17
  #
@@ -1,6 +1,3 @@
1
- # To change this template, choose Tools | Templates
2
- # and open the template in the editor.
3
-
4
1
  $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
2
 
6
3
  require 'test/unit'
@@ -8,78 +5,108 @@ require_relative '../../lib/multiparameter_attributes_handler'
8
5
 
9
6
  module MultiparameterAttributesHandler
10
7
  class ManipulatorTest < Test::Unit::TestCase
11
-
12
- def setup
13
- @hash = {
14
- "last_read(1i)" => "2004",
15
- "last_read(2i)" => "6",
16
- "last_read(3i)" => "24",
17
- "other(1i)" => "2012",
18
- "other(2i)" => "2",
19
- "other(3i)" => "2",
20
- "other(4i)" => "11",
21
- "other(5i)" => "35",
22
- "foo" => 'bar',
23
- "something" => 'ho',
24
- "something_else" => 'hum'
25
- }
26
- @original = @hash.clone
27
- @manipulator = Manipulator.new(@hash)
28
- @output = @manipulator.output
29
- end
30
-
8
+
31
9
  def test_multiparameters
32
- assert_equal(['last_read', 'other'], @manipulator.multiparameters)
10
+ assert_equal ['last_read', 'other'], manipulator.multiparameters
33
11
  end
34
12
 
35
13
  def test_values_for
36
- assert_equal(@hash['foo'], @manipulator.values_for('foo'))
37
- end
38
-
14
+ assert_equal hash['foo'], manipulator.values_for('foo')
15
+ end
16
+
39
17
  def test_values_for_multiparameter
40
- assert_equal(['2004', '6', '24'], @manipulator.values_for('last_read'))
18
+ assert_equal ['2004', '6', '24'], manipulator.values_for('last_read')
41
19
  end
42
-
20
+
43
21
  def test_value_of
44
- assert_equal(@hash['foo'], @manipulator.value_of('foo'))
22
+ assert_equal hash['foo'], manipulator.value_of('foo')
45
23
  end
46
-
24
+
47
25
  def test_value_of_multiparameter
48
- assert_equal(Time.local(*@manipulator.values_for('last_read')), @manipulator.value_of('last_read'))
49
- assert_equal(Time.local(*@manipulator.values_for('other')), @manipulator.value_of('other'))
26
+ assert_equal time_for('last_read'), manipulator.value_of('last_read')
27
+ assert_equal time_for('other'), manipulator.value_of('other')
28
+ end
29
+
30
+ def test_value_mod_changes_values
31
+ manipulator = Manipulator.new(hash, &:to_s)
32
+ assert_equal time_for('last_read').to_s, manipulator.value_of('last_read')
50
33
  end
51
34
 
52
- def test_output_returns_original_content
53
- @hash.each do |key, value|
54
- assert_equal(value, @output[key])
35
+ def test_value_mod_with_lambda
36
+ manipulator = Manipulator.new(hash) {|value| value + 1}
37
+ assert_equal (time_for('last_read') + 1), manipulator.value_of('last_read')
38
+ end
39
+
40
+ def test_output_returns_original_content
41
+ build_manipulator
42
+ hash.each do |key, value|
43
+ assert_equal value, output[key]
55
44
  end
56
45
  end
57
-
46
+
58
47
  def test_output_returns_multiparameter_content_and_original_content
59
- combined_length = @original.length + @manipulator.multiparameters.length
60
- assert_equal(combined_length, @output.length)
48
+ combined_length = original.length + manipulator.multiparameters.length
49
+ assert_equal combined_length, output.length
61
50
  end
62
-
51
+
63
52
  def test_output_returns_multiparameter_content
64
- @manipulator.multiparameters.each do |multiparameter|
65
- assert_equal(@manipulator.value_of(multiparameter), @output[multiparameter])
53
+ manipulator.multiparameters.each do |multiparameter|
54
+ assert_equal manipulator.value_of(multiparameter), output[multiparameter]
66
55
  end
67
56
  end
68
-
57
+
69
58
  def test_output_manipulates_hash
70
- assert_not_equal(@original, @hash)
71
- assert_equal(@output, @hash)
59
+ build_manipulator
60
+ assert_not_equal(original, hash)
61
+ assert_equal output, hash
72
62
  end
73
-
63
+
74
64
  def test_partial_multiparameters_are_ignored
75
65
  [
76
66
  {"last_read(1i)" => "2004", "last_read(2i)" => "6", "last_read(3i)" => ""},
77
67
  {"last_read(1i)" => "2004", "last_read(2i)" => "", "last_read(3i)" => "24"},
78
68
  {"last_read(1i)" => "", "last_read(2i)" => "6", "last_read(3i)" => "24"}
79
69
  ].each do |params|
80
- assert_equal([], Manipulator.new(params).multiparameters, "#{params.inspect} should return []")
70
+ assert_equal [], Manipulator.new(params).multiparameters, "#{params.inspect} should return []"
81
71
  end
82
72
  end
73
+
74
+ def hash
75
+ @hash ||= {
76
+ "last_read(1i)" => "2004",
77
+ "last_read(2i)" => "6",
78
+ "last_read(3i)" => "24",
79
+ "other(1i)" => "2012",
80
+ "other(2i)" => "2",
81
+ "other(3i)" => "2",
82
+ "other(4i)" => "11",
83
+ "other(5i)" => "35",
84
+ "foo" => 'bar',
85
+ "something" => 'ho',
86
+ "something_else" => 'hum'
87
+ }
88
+ end
89
+
90
+ def original
91
+ @original ||= hash.clone
92
+ end
93
+
94
+ def manipulator
95
+ @manipulator ||= Manipulator.new(hash)
96
+ end
97
+
98
+ def build_manipulator
99
+ original # make sure original is generated before manipulator built
100
+ output # use output to create manipulator to ensure all objects built
101
+ end
102
+
103
+ def output
104
+ manipulator.output
105
+ end
83
106
 
107
+ def time_for(field)
108
+ Time.local *manipulator.values_for(field)
109
+ end
110
+
84
111
  end
85
112
  end
@@ -1,6 +1,3 @@
1
- # To change this template, choose Tools | Templates
2
- # and open the template in the editor.
3
-
4
1
  $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
2
 
6
3
  require 'test/unit'
@@ -8,13 +5,13 @@ require_relative '../../lib/multiparameter_attributes_handler'
8
5
 
9
6
  module MultiparameterAttributesHandler
10
7
  class MultiparameterAttributesHandlerErrorTest < Test::Unit::TestCase
11
-
8
+
12
9
  def test_error
13
10
  assert_raise RuntimeError do
14
11
  raise "Oh yes"
15
12
  end
16
13
  end
17
-
14
+
18
15
  def test_attribute_assignment_error
19
16
  error = assert_raise AttributeAssignmentError do
20
17
  raise AttributeAssignmentError.new('b', 'c'), 'd'
@@ -0,0 +1,24 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
2
+
3
+ require 'test/unit'
4
+ require 'multiparameter_attributes_handler'
5
+
6
+ # NB most testing of MultiparameterAttributesHandler.manipulate_all is done
7
+ # via the thing_test.
8
+ class MultiparameterAttributesHandlerTest < Test::Unit::TestCase
9
+
10
+ def test_manipulate_all
11
+ output = MultiparameterAttributesHandler.manipulate_all(attributes)
12
+ assert_equal Time.local(2004, 6, 24), output['last_read']
13
+ end
14
+
15
+ def test_manipulate_all_with_block
16
+ output = MultiparameterAttributesHandler.manipulate_all(attributes, &:to_s)
17
+ assert_equal Time.local(2004, 6, 24).to_s, output['last_read']
18
+ end
19
+
20
+ def attributes
21
+ { "last_read(1i)" => "2004", "last_read(2i)" => "6", "last_read(3i)" => "24" }
22
+ end
23
+
24
+ end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multiparameter_attributes_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Rob Nichols
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-05 00:00:00.000000000 Z
11
+ date: 2015-03-27 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: Rails forms helpers for date and time fields generate multiparameter
15
14
  params. multiparameter_attributes_handler allows objects to assign these to thier
@@ -20,43 +19,44 @@ executables: []
20
19
  extensions: []
21
20
  extra_rdoc_files: []
22
21
  files:
23
- - lib/multiparameter_attributes_handler/version.rb
24
- - lib/multiparameter_attributes_handler/manipulator.rb
25
- - lib/multiparameter_attributes_handler/multiparameter_attributes_handler_error.rb
26
- - lib/multiparameter_attributes_handler.rb
27
22
  - MIT-LICENSE
28
- - Rakefile
29
23
  - README.rdoc
30
- - test/thing.rb
31
- - test/multiparameter_attributes_handler/multiparameter_attributes_handler_error_test.rb
24
+ - Rakefile
25
+ - lib/multiparameter_attributes_handler.rb
26
+ - lib/multiparameter_attributes_handler/manipulator.rb
27
+ - lib/multiparameter_attributes_handler/multiparameter_attributes_handler_error.rb
28
+ - lib/multiparameter_attributes_handler/version.rb
32
29
  - test/multiparameter_attributes_handler/manipulator_test.rb
30
+ - test/multiparameter_attributes_handler/multiparameter_attributes_handler_error_test.rb
31
+ - test/multiparameter_attributes_handler_test.rb
32
+ - test/thing.rb
33
33
  - test/thing_test.rb
34
34
  homepage: https://github.com/reggieb/multiparameter_attributes_handler
35
35
  licenses: []
36
+ metadata: {}
36
37
  post_install_message:
37
38
  rdoc_options: []
38
39
  require_paths:
39
40
  - lib
40
41
  required_ruby_version: !ruby/object:Gem::Requirement
41
- none: false
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  required_rubygems_version: !ruby/object:Gem::Requirement
47
- none: false
48
47
  requirements:
49
48
  - - ! '>='
50
49
  - !ruby/object:Gem::Version
51
50
  version: '0'
52
51
  requirements: []
53
52
  rubyforge_project:
54
- rubygems_version: 1.8.24
53
+ rubygems_version: 2.4.3
55
54
  signing_key:
56
- specification_version: 3
55
+ specification_version: 4
57
56
  summary: Allows objects with attributes, to handle multiparameter params
58
57
  test_files:
58
+ - test/thing_test.rb
59
+ - test/multiparameter_attributes_handler_test.rb
59
60
  - test/thing.rb
60
61
  - test/multiparameter_attributes_handler/multiparameter_attributes_handler_error_test.rb
61
62
  - test/multiparameter_attributes_handler/manipulator_test.rb
62
- - test/thing_test.rb