mm-multi-parameter-attributes 0.2.1 → 0.2.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/README.rdoc +1 -1
- data/Rakefile +3 -2
- data/lib/mm-multi-parameter-attributes.rb +79 -70
- metadata +49 -62
data/README.rdoc
CHANGED
@@ -10,7 +10,7 @@ https://gist.github.com/268948/c5ca7d8fb02470c5c8a0a8225390a4186349a8d4
|
|
10
10
|
Either load it into all models, or individual models:
|
11
11
|
|
12
12
|
# add to all models
|
13
|
-
MongoMapper::Document.
|
13
|
+
MongoMapper::Document.plugin(MongoMapper::Plugins::MultiParameterAttributes)
|
14
14
|
|
15
15
|
# add to a specific model
|
16
16
|
plugin MongoMapper::Plugins::MultiParameterAttributes
|
data/Rakefile
CHANGED
@@ -15,7 +15,7 @@ spec = Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
# Change these as appropriate
|
17
17
|
s.name = "mm-multi-parameter-attributes"
|
18
|
-
s.version = "0.2.
|
18
|
+
s.version = "0.2.2"
|
19
19
|
s.summary = "Tiny plugin for MongoMapper to add multi-parameter attributes"
|
20
20
|
s.author = "Richard Livsey"
|
21
21
|
s.email = "richard@livsey.org"
|
@@ -32,6 +32,7 @@ spec = Gem::Specification.new do |s|
|
|
32
32
|
# If you want to depend on other gems, add them here, along with any
|
33
33
|
# relevant versions
|
34
34
|
s.add_dependency("mongo_mapper", ">= 0.9.0")
|
35
|
+
s.add_dependency("tzinfo")
|
35
36
|
|
36
37
|
# If your tests use any gems, include them here
|
37
38
|
s.add_development_dependency("rspec")
|
@@ -42,7 +43,7 @@ end
|
|
42
43
|
# be automatically building a gem for this project. If you're not
|
43
44
|
# using GitHub, edit as appropriate.
|
44
45
|
#
|
45
|
-
# To publish your gem online, install the 'gemcutter' gem; Read more
|
46
|
+
# To publish your gem online, install the 'gemcutter' gem; Read more
|
46
47
|
# about that here: http://gemcutter.org/pages/gem_docs
|
47
48
|
Rake::GemPackageTask.new(spec) do |pkg|
|
48
49
|
pkg.gem_spec = spec
|
@@ -1,95 +1,104 @@
|
|
1
1
|
require 'mongo_mapper'
|
2
|
+
require 'tzinfo'
|
2
3
|
|
3
4
|
module MongoMapper
|
4
5
|
module Plugins
|
5
6
|
module MultiParameterAttributes
|
6
7
|
extend ActiveSupport::Concern
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
return if new_attributes.nil?
|
9
|
+
def attributes=(new_attributes)
|
10
|
+
return if new_attributes.nil?
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
multi_parameter_attributes = []
|
13
|
+
normal_attributes = {}
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
15
|
+
new_attributes.each do |k, v|
|
16
|
+
if k.to_s.include?("(")
|
17
|
+
multi_parameter_attributes << [ k.to_s, v ]
|
18
|
+
else
|
19
|
+
normal_attributes[k] = v
|
21
20
|
end
|
21
|
+
end
|
22
22
|
|
23
|
-
|
23
|
+
assign_multiparameter_attributes(multi_parameter_attributes)
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
super(normal_attributes)
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
28
|
+
# Instantiates objects for all attribute classes that needs more than one constructor parameter. This is done
|
29
|
+
# by calling new on the column type or aggregation type (through composed_of) object with these parameters.
|
30
|
+
# So having the pairs written_on(1) = "2004", written_on(2) = "6", written_on(3) = "24", will instantiate
|
31
|
+
# written_on (a date type) with Date.new("2004", "6", "24"). You can also specify a typecast character in the
|
32
|
+
# parentheses to have the parameters typecasted before they're used in the constructor. Use i for Fixnum, f for Float,
|
33
|
+
# s for String, and a for Array. If all the values for a given attribute are empty, the attribute will be set to nil.
|
34
|
+
def assign_multiparameter_attributes(pairs)
|
35
|
+
execute_callstack_for_multiparameter_attributes(
|
36
|
+
extract_callstack_for_multiparameter_attributes(pairs)
|
37
|
+
)
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
40
|
+
def execute_callstack_for_multiparameter_attributes(callstack)
|
41
|
+
callstack.each do |name, values_with_empty_parameters|
|
42
|
+
# in order to allow a date to be set without a year, we must keep the empty values.
|
43
|
+
# Otherwise, we wouldn't be able to distinguish it from a date with an empty day.
|
44
|
+
values = values_with_empty_parameters.reject(&:blank?)
|
45
|
+
|
46
|
+
if values.any?
|
47
|
+
|
48
|
+
key = self.class.keys[name]
|
49
|
+
raise ArgumentError, "Unknown key #{name}" if key.nil?
|
50
|
+
klass = key.type
|
51
|
+
|
52
|
+
value = if Time == klass
|
53
|
+
Time.zone.local(*valid_datetime_values(values_with_empty_parameters))
|
54
|
+
elsif Date == klass
|
55
|
+
values = valid_datetime_values(values_with_empty_parameters)
|
56
|
+
begin
|
57
|
+
Date.new(*values)
|
58
|
+
rescue ArgumentError => ex # if Date.new raises an exception on an invalid date
|
59
|
+
Time.zone.local(*values).to_date # we instantiate Time object and convert it back to a date thus using Time's logic in handling invalid dates
|
60
|
+
end
|
61
|
+
else
|
62
|
+
klass.new(*values_with_empty_parameters)
|
63
|
+
end
|
64
|
+
else
|
65
|
+
value = nil
|
66
|
+
end
|
67
|
+
writer_method = "#{name}="
|
68
|
+
if respond_to?(writer_method)
|
69
|
+
self.send(writer_method, value)
|
70
|
+
else
|
71
|
+
self[name.to_s] = value
|
72
72
|
end
|
73
73
|
end
|
74
|
+
end
|
74
75
|
|
75
|
-
|
76
|
-
|
76
|
+
# Ensures that values for date are set to now if blank (as month and say cannot be 0) and that all values are converted to integers
|
77
|
+
def valid_datetime_values(values)
|
78
|
+
now = Time.zone.now
|
79
|
+
values[0] = now.year if values[0].blank?
|
80
|
+
values[1] = now.month if values[1].blank?
|
81
|
+
values[2] = now.day if values[2].blank?
|
82
|
+
values.map(&:to_i)
|
83
|
+
end
|
77
84
|
|
78
|
-
|
79
|
-
|
80
|
-
attribute_name = multiparameter_name.split("(").first
|
81
|
-
attributes[attribute_name] = [] unless attributes.include?(attribute_name)
|
85
|
+
def extract_callstack_for_multiparameter_attributes(pairs)
|
86
|
+
attributes = { }
|
82
87
|
|
83
|
-
|
84
|
-
|
88
|
+
for pair in pairs
|
89
|
+
multiparameter_name, value = pair
|
90
|
+
attribute_name = multiparameter_name.split("(").first
|
91
|
+
attributes[attribute_name] = [] unless attributes.include?(attribute_name)
|
85
92
|
|
86
|
-
attributes
|
93
|
+
attributes[attribute_name] << [ find_parameter_position(multiparameter_name), value ]
|
87
94
|
end
|
88
95
|
|
89
|
-
|
90
|
-
|
91
|
-
|
96
|
+
attributes.each { |name, values| attributes[name] = values.sort_by{ |v| v.first }.collect { |v| v.last } }
|
97
|
+
end
|
98
|
+
|
99
|
+
def find_parameter_position(multiparameter_name)
|
100
|
+
multiparameter_name.scan(/\(([0-9]*).*\)/).first.first
|
92
101
|
end
|
93
102
|
end
|
94
103
|
end
|
95
|
-
end
|
104
|
+
end
|
metadata
CHANGED
@@ -1,100 +1,87 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: mm-multi-parameter-attributes
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 1
|
10
|
-
version: 0.2.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Richard Livsey
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-05-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: mongo_mapper
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70196703635800 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 59
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
- 9
|
33
|
-
- 0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
34
21
|
version: 0.9.0
|
35
22
|
type: :runtime
|
36
|
-
version_requirements: *id001
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: rspec
|
39
23
|
prerelease: false
|
40
|
-
|
24
|
+
version_requirements: *70196703635800
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: tzinfo
|
27
|
+
requirement: &70196703635420 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70196703635420
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70196703634980 !ruby/object:Gem::Requirement
|
41
39
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
segments:
|
47
|
-
- 0
|
48
|
-
version: "0"
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
49
44
|
type: :development
|
50
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70196703634980
|
51
47
|
description:
|
52
48
|
email: richard@livsey.org
|
53
49
|
executables: []
|
54
|
-
|
55
50
|
extensions: []
|
56
|
-
|
57
|
-
extra_rdoc_files:
|
51
|
+
extra_rdoc_files:
|
58
52
|
- README.rdoc
|
59
|
-
files:
|
53
|
+
files:
|
60
54
|
- LICENSE
|
61
55
|
- Rakefile
|
62
56
|
- README.rdoc
|
63
57
|
- lib/mm-multi-parameter-attributes.rb
|
64
|
-
has_rdoc: true
|
65
58
|
homepage: http://github.com/rlivsey/mm-multi-parameter-attributes
|
66
59
|
licenses: []
|
67
|
-
|
68
60
|
post_install_message:
|
69
|
-
rdoc_options:
|
61
|
+
rdoc_options:
|
70
62
|
- --main
|
71
63
|
- README.rdoc
|
72
|
-
require_paths:
|
64
|
+
require_paths:
|
73
65
|
- lib
|
74
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
67
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
|
80
|
-
segments:
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
segments:
|
81
73
|
- 0
|
82
|
-
|
83
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
hash: -305387027764767057
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
76
|
none: false
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
|
89
|
-
segments:
|
90
|
-
- 0
|
91
|
-
version: "0"
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
92
81
|
requirements: []
|
93
|
-
|
94
82
|
rubyforge_project:
|
95
|
-
rubygems_version: 1.
|
83
|
+
rubygems_version: 1.8.17
|
96
84
|
signing_key:
|
97
85
|
specification_version: 3
|
98
86
|
summary: Tiny plugin for MongoMapper to add multi-parameter attributes
|
99
87
|
test_files: []
|
100
|
-
|