virtus 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/.gitignore +3 -0
  2. data/.rvmrc +1 -1
  3. data/Gemfile +20 -1
  4. data/History.txt +21 -0
  5. data/README.markdown +2 -2
  6. data/Rakefile +1 -2
  7. data/VERSION +1 -1
  8. data/config/flay.yml +3 -0
  9. data/config/flog.yml +2 -0
  10. data/config/roodi.yml +18 -0
  11. data/config/site.reek +91 -0
  12. data/config/yardstick.yml +2 -0
  13. data/lib/virtus.rb +51 -45
  14. data/lib/virtus/attribute.rb +301 -0
  15. data/lib/virtus/attribute/array.rb +17 -0
  16. data/lib/virtus/attribute/boolean.rb +60 -0
  17. data/lib/virtus/attribute/date.rb +35 -0
  18. data/lib/virtus/attribute/date_time.rb +34 -0
  19. data/lib/virtus/attribute/decimal.rb +24 -0
  20. data/lib/virtus/attribute/float.rb +33 -0
  21. data/lib/virtus/attribute/hash.rb +18 -0
  22. data/lib/virtus/attribute/integer.rb +30 -0
  23. data/lib/virtus/{attributes → attribute}/numeric.rb +2 -3
  24. data/lib/virtus/{attributes → attribute}/object.rb +2 -1
  25. data/lib/virtus/attribute/string.rb +31 -0
  26. data/lib/virtus/attribute/time.rb +34 -0
  27. data/lib/virtus/class_methods.rb +25 -8
  28. data/lib/virtus/instance_methods.rb +48 -9
  29. data/lib/virtus/support/chainable.rb +4 -6
  30. data/lib/virtus/typecast/boolean.rb +27 -0
  31. data/lib/virtus/typecast/numeric.rb +82 -0
  32. data/lib/virtus/typecast/time.rb +162 -0
  33. data/spec/integration/virtus/attributes/attribute/typecast_spec.rb +4 -4
  34. data/spec/integration/virtus/class_methods/attribute_spec.rb +1 -1
  35. data/spec/integration/virtus/class_methods/attributes_spec.rb +3 -2
  36. data/spec/integration/virtus/class_methods/const_missing_spec.rb +2 -2
  37. data/spec/rcov.opts +6 -0
  38. data/spec/spec_helper.rb +0 -9
  39. data/spec/unit/shared/attribute.rb +8 -8
  40. data/spec/unit/virtus/{attributes → attribute}/array_spec.rb +1 -1
  41. data/spec/unit/virtus/attribute/attribute_spec.rb +12 -0
  42. data/spec/unit/virtus/{attributes → attribute}/boolean_spec.rb +4 -4
  43. data/spec/unit/virtus/{attributes → attribute}/date_spec.rb +13 -7
  44. data/spec/unit/virtus/{attributes → attribute}/date_time_spec.rb +31 -10
  45. data/spec/unit/virtus/{attributes → attribute}/decimal_spec.rb +18 -18
  46. data/spec/unit/virtus/{attributes → attribute}/float_spec.rb +18 -18
  47. data/spec/unit/virtus/{attributes → attribute}/hash_spec.rb +1 -1
  48. data/spec/unit/virtus/{attributes → attribute}/integer_spec.rb +18 -18
  49. data/spec/unit/virtus/attribute/numeric/class_methods/descendants_spec.rb +15 -0
  50. data/spec/unit/virtus/attribute/object/class_methods/descendants_spec.rb +16 -0
  51. data/spec/unit/virtus/{attributes → attribute}/string_spec.rb +2 -2
  52. data/spec/unit/virtus/{attributes → attribute}/time_spec.rb +19 -9
  53. data/spec/unit/virtus/class_methods/new_spec.rb +7 -7
  54. data/spec/unit/virtus/determine_type_spec.rb +4 -4
  55. data/spec/unit/virtus/instance_methods/attribute_get_spec.rb +1 -1
  56. data/spec/unit/virtus/instance_methods/attribute_set_spec.rb +2 -2
  57. data/spec/unit/virtus/instance_methods/attributes_spec.rb +2 -2
  58. data/tasks/metrics/ci.rake +7 -0
  59. data/tasks/metrics/flay.rake +41 -0
  60. data/tasks/metrics/flog.rake +43 -0
  61. data/tasks/metrics/heckle.rake +261 -0
  62. data/tasks/metrics/metric_fu.rake +29 -0
  63. data/tasks/metrics/reek.rake +9 -0
  64. data/tasks/metrics/roodi.rake +15 -0
  65. data/tasks/metrics/yardstick.rake +23 -0
  66. data/tasks/spec.rake +26 -0
  67. data/tasks/yard.rake +9 -0
  68. data/virtus.gemspec +48 -33
  69. metadata +51 -41
  70. data/lib/virtus/attributes/array.rb +0 -8
  71. data/lib/virtus/attributes/attribute.rb +0 -214
  72. data/lib/virtus/attributes/boolean.rb +0 -39
  73. data/lib/virtus/attributes/date.rb +0 -44
  74. data/lib/virtus/attributes/date_time.rb +0 -43
  75. data/lib/virtus/attributes/decimal.rb +0 -24
  76. data/lib/virtus/attributes/float.rb +0 -20
  77. data/lib/virtus/attributes/hash.rb +0 -8
  78. data/lib/virtus/attributes/integer.rb +0 -20
  79. data/lib/virtus/attributes/string.rb +0 -11
  80. data/lib/virtus/attributes/time.rb +0 -45
  81. data/lib/virtus/attributes/typecast/numeric.rb +0 -32
  82. data/lib/virtus/attributes/typecast/time.rb +0 -27
  83. data/spec/unit/virtus/attributes/attribute_spec.rb +0 -13
  84. data/spec/unit/virtus/attributes/numeric/class_methods/descendants_spec.rb +0 -15
  85. data/spec/unit/virtus/attributes/object/class_methods/descendants_spec.rb +0 -16
@@ -1,39 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Boolean < Object
4
- primitive TrueClass
5
-
6
- TRUE_VALUES = [ 1, '1', 't', 'T', 'true', 'TRUE' ].freeze
7
- FALSE_VALUES = [ 0, '0', 'f', 'F', 'false', 'FALSE' ].freeze
8
- BOOLEAN_MAP = Hash[
9
- TRUE_VALUES.product([ true ]) + FALSE_VALUES.product([ false ]) ].freeze
10
-
11
- def primitive?(value)
12
- value == true || value == false
13
- end
14
-
15
- def typecast_to_primitive(value, model = nil)
16
- BOOLEAN_MAP.fetch(value, value)
17
- end
18
-
19
- private
20
-
21
- # Creates standard and boolean attribute reader methods.
22
- #
23
- # @api private
24
- def _create_reader
25
- super
26
-
27
- model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
28
- chainable(:attribute) do
29
- #{reader_visibility}
30
-
31
- def #{name}?
32
- #{name}
33
- end
34
- end
35
- RUBY
36
- end
37
- end # Boolean
38
- end # Attributes
39
- end # Virtus
@@ -1,44 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Date < Object
4
- include Typecast::Time
5
-
6
- primitive ::Date
7
-
8
- # Typecasts an arbitrary value to a Date
9
- # Handles both Hashes and Date instances.
10
- #
11
- # @param [Hash, #to_mash, #to_s] value
12
- # value to be typecast
13
- #
14
- # @return [Date]
15
- # Date constructed from value
16
- #
17
- # @api private
18
- def typecast_to_primitive(value)
19
- if value.respond_to?(:to_date)
20
- value.to_date
21
- elsif value.is_a?(::Hash)
22
- typecast_hash_to_date(value)
23
- else
24
- ::Date.parse(value.to_s)
25
- end
26
- rescue ArgumentError
27
- value
28
- end
29
-
30
- # Creates a Date instance from a Hash with keys :year, :month, :day
31
- #
32
- # @param [Hash, #to_mash] value
33
- # value to be typecast
34
- #
35
- # @return [Date]
36
- # Date constructed from hash
37
- #
38
- # @api private
39
- def typecast_hash_to_date(value)
40
- ::Date.new(*extract_time(value)[0, 3])
41
- end
42
- end # Date
43
- end # Attributes
44
- end # Virtus
@@ -1,43 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class DateTime < Object
4
- primitive ::DateTime
5
-
6
- include Typecast::Time
7
-
8
- # Typecasts an arbitrary value to a DateTime.
9
- # Handles both Hashes and DateTime instances.
10
- #
11
- # @param [Hash, #to_mash, #to_s] value
12
- # value to be typecast
13
- #
14
- # @return [DateTime]
15
- # DateTime constructed from value
16
- #
17
- # @api private
18
- def typecast_to_primitive(value, model = nil)
19
- if value.is_a?(::Hash)
20
- typecast_hash_to_datetime(value)
21
- else
22
- ::DateTime.parse(value.to_s)
23
- end
24
- rescue ArgumentError
25
- value
26
- end
27
-
28
- # Creates a DateTime instance from a Hash with keys :year, :month, :day,
29
- # :hour, :min, :sec
30
- #
31
- # @param [Hash, #to_mash] value
32
- # value to be typecast
33
- #
34
- # @return [DateTime]
35
- # DateTime constructed from hash
36
- #
37
- # @api private
38
- def typecast_hash_to_datetime(value)
39
- ::DateTime.new(*extract_time(value))
40
- end
41
- end # DateTime
42
- end # Attributes
43
- end # Virtus
@@ -1,24 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Decimal < Numeric
4
- primitive ::BigDecimal
5
-
6
- # Typecast a value to a BigDecimal
7
- #
8
- # @param [#to_str, #to_d, Integer] value
9
- # value to typecast
10
- #
11
- # @return [BigDecimal]
12
- # BigDecimal constructed from value
13
- #
14
- # @api private
15
- def typecast_to_primitive(value, model = nil)
16
- if value.kind_of?(::Integer)
17
- value.to_s.to_d
18
- else
19
- typecast_to_numeric(value, :to_d)
20
- end
21
- end
22
- end # Decimal
23
- end # Attributes
24
- end # Virtus
@@ -1,20 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Float < Numeric
4
- primitive ::Float
5
-
6
- # Typecast a value to a Float
7
- #
8
- # @param [#to_str, #to_f] value
9
- # value to typecast
10
- #
11
- # @return [Float]
12
- # Float constructed from value
13
- #
14
- # @api private
15
- def typecast_to_primitive(value, model = nil)
16
- typecast_to_numeric(value, :to_f)
17
- end
18
- end # Float
19
- end # Attributes
20
- end # Virtus
@@ -1,8 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Hash < Object
4
- primitive ::Hash
5
- complex true
6
- end # Integer
7
- end # Attributes
8
- end # Virtus
@@ -1,20 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Integer < Numeric
4
- primitive ::Integer
5
-
6
- # Typecast a value to an Integer
7
- #
8
- # @param [#to_str, #to_i] value
9
- # value to typecast
10
- #
11
- # @return [Integer]
12
- # Integer constructed from value
13
- #
14
- # @api private
15
- def typecast_to_primitive(value, model = nil)
16
- typecast_to_numeric(value, :to_i)
17
- end
18
- end # Integer
19
- end # Attributes
20
- end # Virtus
@@ -1,11 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class String < Object
4
- primitive ::String
5
-
6
- def typecast_to_primitive(value, model = nil)
7
- value.to_s
8
- end
9
- end # String
10
- end # Attributes
11
- end # Virtus
@@ -1,45 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- class Time < Object
4
- include Typecast::Time
5
-
6
- primitive ::Time
7
-
8
- # Typecasts an arbitrary value to a Time
9
- # Handles both Hashes and Time instances.
10
- #
11
- # @param [Hash, #to_mash, #to_s] value
12
- # value to be typecast
13
- #
14
- # @return [Time]
15
- # Time constructed from value
16
- #
17
- # @api private
18
- def typecast_to_primitive(value, model = nil)
19
- if value.respond_to?(:to_time)
20
- value.to_time
21
- elsif value.is_a?(::Hash)
22
- typecast_hash_to_time(value)
23
- else
24
- ::Time.parse(value.to_s)
25
- end
26
- rescue ArgumentError
27
- value
28
- end
29
-
30
- # Creates a Time instance from a Hash with keys :year, :month, :day,
31
- # :hour, :min, :sec
32
- #
33
- # @param [Hash, #to_mash] value
34
- # value to be typecast
35
- #
36
- # @return [Time]
37
- # Time constructed from hash
38
- #
39
- # @api private
40
- def typecast_hash_to_time(value)
41
- ::Time.local(*extract_time(value))
42
- end
43
- end # Time
44
- end # Attributes
45
- end # Virtus
@@ -1,32 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- module Typecast
4
- module Numeric
5
- # Match numeric string
6
- #
7
- # @param [#to_str, Numeric] value
8
- # value to typecast
9
- # @param [Symbol] method
10
- # method to typecast with
11
- #
12
- # @return [Numeric]
13
- # number if matched, value if no match
14
- #
15
- # @api private
16
- def typecast_to_numeric(value, method)
17
- if value.respond_to?(:to_str)
18
- if value.to_str =~ /\A(-?(?:0|[1-9]\d*)(?:\.\d+)?|(?:\.\d+))\z/
19
- $1.send(method)
20
- else
21
- value
22
- end
23
- elsif value.respond_to?(method)
24
- value.send(method)
25
- else
26
- value
27
- end
28
- end
29
- end # Numeric
30
- end # Typecast
31
- end # Attributes
32
- end # Virtus
@@ -1,27 +0,0 @@
1
- module Virtus
2
- module Attributes
3
- module Typecast
4
- module Time
5
- include Numeric
6
-
7
- # Extracts the given args from the hash. If a value does not exist, it
8
- # uses the value of Time.now.
9
- #
10
- # @param [Hash, #to_mash] value
11
- # value to extract time args from
12
- #
13
- # @return [Array]
14
- # Extracted values
15
- #
16
- # @api private
17
- def extract_time(value)
18
- now = ::Time.now
19
-
20
- [ :year, :month, :day, :hour, :min, :sec ].map do |segment|
21
- typecast_to_numeric(value.fetch(segment, now.send(segment)), :to_i)
22
- end
23
- end
24
- end # Time
25
- end # Typecast
26
- end # Attributes
27
- end # Virtus
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Attributes::Attribute do
4
- describe '#typecast_to_primitive' do
5
- let(:model) { Class.new { include Virtus } }
6
- let(:attribute) { Virtus::Attributes::Attribute.new(:name, model) }
7
- let(:value) { 'value' }
8
-
9
- it "returns original value" do
10
- attribute.typecast_to_primitive(value, model).should == value
11
- end
12
- end
13
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Attributes::Numeric, '.descendants' do
4
- subject { described_class.descendants }
5
-
6
- let(:known_descendants) do
7
- [ Virtus::Attributes::Decimal,
8
- Virtus::Attributes::Float,
9
- Virtus::Attributes::Integer ]
10
- end
11
-
12
- it "should return all known attribute classes" do
13
- subject.should == known_descendants
14
- end
15
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Attributes::Object, '.descendants' do
4
- subject { described_class.descendants }
5
-
6
- let(:known_descendants) do
7
- [ Virtus::Attributes::Array, Virtus::Attributes::Boolean,
8
- Virtus::Attributes::Date, Virtus::Attributes::DateTime,
9
- Virtus::Attributes::Numeric, Virtus::Attributes::Hash,
10
- Virtus::Attributes::String, Virtus::Attributes::Time ]
11
- end
12
-
13
- it "should return all known attribute classes" do
14
- subject.should == known_descendants
15
- end
16
- end