wardrobe 0.1.0
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.
- checksums.yaml +7 -0
- data/.codeclimate.yml +10 -0
- data/.gitignore +19 -0
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +18 -0
- data/Guardfile +42 -0
- data/LICENSE +19 -0
- data/README.md +227 -0
- data/Rakefile +20 -0
- data/examples/new_york_times_article.rb +55 -0
- data/lib/wardrobe/attribute.rb +76 -0
- data/lib/wardrobe/attribute_store.rb +16 -0
- data/lib/wardrobe/block_setup.rb +124 -0
- data/lib/wardrobe/boolean.rb +6 -0
- data/lib/wardrobe/class_methods.rb +127 -0
- data/lib/wardrobe/getter_setter.rb +48 -0
- data/lib/wardrobe/instance_methods.rb +56 -0
- data/lib/wardrobe/module_methods.rb +51 -0
- data/lib/wardrobe/option.rb +30 -0
- data/lib/wardrobe/option_store.rb +22 -0
- data/lib/wardrobe/plugin.rb +39 -0
- data/lib/wardrobe/plugin_store.rb +28 -0
- data/lib/wardrobe/plugins/alias_setters.rb +35 -0
- data/lib/wardrobe/plugins/coercible/refinements/array.rb +63 -0
- data/lib/wardrobe/plugins/coercible/refinements/boolean.rb +36 -0
- data/lib/wardrobe/plugins/coercible/refinements/date.rb +31 -0
- data/lib/wardrobe/plugins/coercible/refinements/date_time.rb +29 -0
- data/lib/wardrobe/plugins/coercible/refinements/float.rb +23 -0
- data/lib/wardrobe/plugins/coercible/refinements/hash.rb +65 -0
- data/lib/wardrobe/plugins/coercible/refinements/integer.rb +23 -0
- data/lib/wardrobe/plugins/coercible/refinements/object.rb +15 -0
- data/lib/wardrobe/plugins/coercible/refinements/set.rb +33 -0
- data/lib/wardrobe/plugins/coercible/refinements/string.rb +21 -0
- data/lib/wardrobe/plugins/coercible/refinements/symbol.rb +21 -0
- data/lib/wardrobe/plugins/coercible/refinements/time.rb +30 -0
- data/lib/wardrobe/plugins/coercible/refinements/unsupported_error.rb +11 -0
- data/lib/wardrobe/plugins/coercible.rb +52 -0
- data/lib/wardrobe/plugins/configurable/configurable_store.rb +26 -0
- data/lib/wardrobe/plugins/configurable.rb +40 -0
- data/lib/wardrobe/plugins/default.rb +33 -0
- data/lib/wardrobe/plugins/dirty_tracker.rb +66 -0
- data/lib/wardrobe/plugins/equality.rb +19 -0
- data/lib/wardrobe/plugins/html_initializer.rb +38 -0
- data/lib/wardrobe/plugins/immutable.rb +164 -0
- data/lib/wardrobe/plugins/ivy_presenter.rb +42 -0
- data/lib/wardrobe/plugins/json_initializer.rb +41 -0
- data/lib/wardrobe/plugins/nil_if_empty.rb +27 -0
- data/lib/wardrobe/plugins/nil_if_zero.rb +19 -0
- data/lib/wardrobe/plugins/optional_getter.rb +21 -0
- data/lib/wardrobe/plugins/optional_setter.rb +24 -0
- data/lib/wardrobe/plugins/presenter/refinements/array.rb +15 -0
- data/lib/wardrobe/plugins/presenter/refinements/hash.rb +15 -0
- data/lib/wardrobe/plugins/presenter/refinements/object.rb +15 -0
- data/lib/wardrobe/plugins/presenter/refinements/time.rb +19 -0
- data/lib/wardrobe/plugins/presenter/refinements.rb +6 -0
- data/lib/wardrobe/plugins/presenter.rb +25 -0
- data/lib/wardrobe/plugins/validation/block_handler.rb +83 -0
- data/lib/wardrobe/plugins/validation/class_methods.rb +13 -0
- data/lib/wardrobe/plugins/validation/deep_merge.rb +27 -0
- data/lib/wardrobe/plugins/validation/error_store.rb +27 -0
- data/lib/wardrobe/plugins/validation/instance_methods.rb +39 -0
- data/lib/wardrobe/plugins/validation/refinements/_size.rb +30 -0
- data/lib/wardrobe/plugins/validation/refinements/array.rb +26 -0
- data/lib/wardrobe/plugins/validation/refinements/date.rb +15 -0
- data/lib/wardrobe/plugins/validation/refinements/hash.rb +27 -0
- data/lib/wardrobe/plugins/validation/refinements/integer.rb +21 -0
- data/lib/wardrobe/plugins/validation/refinements/nil_class.rb +19 -0
- data/lib/wardrobe/plugins/validation/refinements/numeric.rb +31 -0
- data/lib/wardrobe/plugins/validation/refinements/object.rb +35 -0
- data/lib/wardrobe/plugins/validation/refinements/set.rb +25 -0
- data/lib/wardrobe/plugins/validation/refinements/string.rb +55 -0
- data/lib/wardrobe/plugins/validation/refinements/symbol.rb +26 -0
- data/lib/wardrobe/plugins/validation/refinements.rb +13 -0
- data/lib/wardrobe/plugins/validation/validation.rb +63 -0
- data/lib/wardrobe/plugins/validation/validation_error.rb +19 -0
- data/lib/wardrobe/plugins/validation/validaton_runner.rb +38 -0
- data/lib/wardrobe/plugins/validation/validator.rb +119 -0
- data/lib/wardrobe/plugins/validation.rb +28 -0
- data/lib/wardrobe/root_config.rb +31 -0
- data/lib/wardrobe/store.rb +62 -0
- data/lib/wardrobe/stores.rb +106 -0
- data/lib/wardrobe/version.rb +5 -0
- data/lib/wardrobe.rb +34 -0
- data/sandbox/Gemfile +5 -0
- data/sandbox/Gemfile.lock +52 -0
- data/sandbox/bench_mutable_coercion.rb +91 -0
- data/sandbox/bench_test_1.rb +50 -0
- data/sandbox/bench_test_2.rb +48 -0
- data/sandbox/bench_test_3.rb +92 -0
- data/sandbox/cnn_article_find.rb +20 -0
- data/sandbox/define_method_procs.rb +139 -0
- data/sandbox/hanami_validations.rb +40 -0
- data/sandbox/middleware_bench_test.rb +97 -0
- data/sandbox/middleware_bench_v2_test.rb +130 -0
- data/test/assertions.rb +22 -0
- data/test/test_helper.rb +37 -0
- data/test/unit/atrs_config_test.rb +33 -0
- data/test/unit/atrs_root_module_test.rb +19 -0
- data/test/unit/attribute_test.rb +44 -0
- data/test/unit/block_runner/array_test.rb +29 -0
- data/test/unit/block_setup_test.rb +41 -0
- data/test/unit/class_methods_test.rb +92 -0
- data/test/unit/create_class_from_hash_test.rb +28 -0
- data/test/unit/define_getter_test.rb +94 -0
- data/test/unit/define_setter_test.rb +0 -0
- data/test/unit/disable_coercion_test.rb +19 -0
- data/test/unit/inheritance_composition_test.rb +36 -0
- data/test/unit/method_override_test.rb +18 -0
- data/test/unit/method_polution_test.rb +48 -0
- data/test/unit/option_test.rb +17 -0
- data/test/unit/plugin_test.rb +12 -0
- data/test/unit/plugins/alias_setters_test.rb +24 -0
- data/test/unit/plugins/coercible/array_test.rb +79 -0
- data/test/unit/plugins/coercible/boolean_test.rb +68 -0
- data/test/unit/plugins/coercible/custom_class_test.rb +61 -0
- data/test/unit/plugins/coercible/date_test.rb +38 -0
- data/test/unit/plugins/coercible/date_time_test.rb +44 -0
- data/test/unit/plugins/coercible/float_test.rb +42 -0
- data/test/unit/plugins/coercible/hash_test.rb +62 -0
- data/test/unit/plugins/coercible/integer_test.rb +42 -0
- data/test/unit/plugins/coercible/nested_wardrobe_test.rb +63 -0
- data/test/unit/plugins/coercible/set_test.rb +49 -0
- data/test/unit/plugins/coercible/string_test.rb +36 -0
- data/test/unit/plugins/coercible/symbol_test.rb +30 -0
- data/test/unit/plugins/coercible/time_test.rb +43 -0
- data/test/unit/plugins/configurable_test.rb +64 -0
- data/test/unit/plugins/default_value_test.rb +78 -0
- data/test/unit/plugins/dirty_tracker_test.rb +78 -0
- data/test/unit/plugins/equality_test.rb +36 -0
- data/test/unit/plugins/html_initializer_test.rb +19 -0
- data/test/unit/plugins/immutable_test.rb +149 -0
- data/test/unit/plugins/ivy_presenter_test.rb +57 -0
- data/test/unit/plugins/json_initializer_test.rb +67 -0
- data/test/unit/plugins/nil_if_empty_test.rb +39 -0
- data/test/unit/plugins/nil_if_zero_test.rb +26 -0
- data/test/unit/plugins/presenter_test.rb +68 -0
- data/test/unit/plugins/validate/inheritance_test.rb +36 -0
- data/test/unit/plugins/validate/nested_model_test.rb +40 -0
- data/test/unit/plugins/validate/predicates/each_key_each_value_test.rb +34 -0
- data/test/unit/plugins/validate/predicates/each_test.rb +33 -0
- data/test/unit/plugins/validate/predicates/empty_test.rb +37 -0
- data/test/unit/plugins/validate/predicates/even_test.rb +33 -0
- data/test/unit/plugins/validate/predicates/excluded_from_test.rb +55 -0
- data/test/unit/plugins/validate/predicates/filled_test.rb +49 -0
- data/test/unit/plugins/validate/predicates/format_test.rb +28 -0
- data/test/unit/plugins/validate/predicates/gt_test.rb +36 -0
- data/test/unit/plugins/validate/predicates/gteq_test.rb +36 -0
- data/test/unit/plugins/validate/predicates/included_in_test.rb +55 -0
- data/test/unit/plugins/validate/predicates/lt_test.rb +36 -0
- data/test/unit/plugins/validate/predicates/lteq_test.rb +36 -0
- data/test/unit/plugins/validate/predicates/max_size_test.rb +43 -0
- data/test/unit/plugins/validate/predicates/min_size_test.rb +43 -0
- data/test/unit/plugins/validate/predicates/none_test.rb +49 -0
- data/test/unit/plugins/validate/predicates/odd_test.rb +33 -0
- data/test/unit/plugins/validate/predicates/size_range_test.rb +43 -0
- data/test/unit/plugins/validate/predicates/size_test.rb +43 -0
- data/test/unit/plugins/validate/predicates/type_test.rb +77 -0
- data/test/unit/plugins/validate/predicates_test.rb +73 -0
- data/test/unit/plugins/validate/validate_bang_test.rb +30 -0
- data/test/unit/store_test.rb +15 -0
- data/test/unit/stores_test.rb +18 -0
- data/wardrobe.gemspec +26 -0
- metadata +344 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class WardrobeRootModuleTest < TestBase
|
6
|
+
def test_wardrobe_module
|
7
|
+
assert Wardrobe.config.is_a?(Wardrobe::RootConfig)
|
8
|
+
assert Wardrobe.respond_to?(:create_class)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_wardrobe_method_generated_module
|
12
|
+
mod = Module.new do
|
13
|
+
extend Wardrobe::ModuleMethods
|
14
|
+
include Wardrobe
|
15
|
+
end
|
16
|
+
assert mod.respond_to?(:create_class)
|
17
|
+
assert mod.config.is_a?(Wardrobe::RootConfig)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class AttributeTest < TestBase
|
5
|
+
class One
|
6
|
+
include Wardrobe
|
7
|
+
attribute :name, String
|
8
|
+
end
|
9
|
+
|
10
|
+
class Two < One
|
11
|
+
plugin :optional_getter
|
12
|
+
end
|
13
|
+
|
14
|
+
class Three < Two
|
15
|
+
attribute :name, String, getter: false
|
16
|
+
end
|
17
|
+
|
18
|
+
module Override
|
19
|
+
def getters
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_attribute_parent
|
25
|
+
assert_equal 'Test', One.new(name: 'Test').name
|
26
|
+
assert_equal 'Test', Two.new(name: 'Test').name
|
27
|
+
assert_raises(NoMethodError) {
|
28
|
+
Three.new(name: 'Test').name
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_getter
|
33
|
+
assert_instance_method_call_count(2, Wardrobe::Attribute, :build_getter_array) do
|
34
|
+
klass = Class.new do
|
35
|
+
include Wardrobe
|
36
|
+
attribute :name, String
|
37
|
+
end
|
38
|
+
Class.new(klass) do
|
39
|
+
include Wardrobe
|
40
|
+
attribute :name, String
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BlockRunnerArray
|
4
|
+
include Wardrobe
|
5
|
+
plugin :ivy_presenter
|
6
|
+
|
7
|
+
attributes preset: :one do
|
8
|
+
attribute :name, String
|
9
|
+
preset :two do
|
10
|
+
attribute :address, String
|
11
|
+
preset :three do
|
12
|
+
attribute :uuid, String
|
13
|
+
attribute :id, Integer, preset: [:four, :five]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
class BlockRunnerArrayTest < TestBase
|
21
|
+
def test_one
|
22
|
+
instance = BlockRunnerArray.new(name: 'Name', address: 'Address', uuid: 1, id: 123 )
|
23
|
+
set = instance._attribute_store
|
24
|
+
assert_equal [:one], set.name.options[:preset].to_a
|
25
|
+
assert_equal [:one, :two], set.address.options[:preset].to_a
|
26
|
+
assert_equal [:one, :two, :three], set.uuid.options[:preset].to_a
|
27
|
+
assert_equal [:one, :two, :three, :four, :five], set.id.options[:preset].to_a
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BlockModel
|
4
|
+
include Wardrobe
|
5
|
+
plugin :nil_if_empty
|
6
|
+
plugin :nil_if_zero
|
7
|
+
plugin :ivy_presenter
|
8
|
+
plugin :alias_setters
|
9
|
+
plugin :validation
|
10
|
+
|
11
|
+
attributes nil_if_empty: true, nil_if_zero: true, preset: :one, validates: { method: :int?, arguments: 1 }, alias_setter: :nested_int_alias do
|
12
|
+
attribute :name, String, preset: :two, validates: { method: :str?, arguments: 1 }
|
13
|
+
attribute :status, Integer
|
14
|
+
attribute :friends, Array
|
15
|
+
nil_if_empty false do
|
16
|
+
attribute :address, String
|
17
|
+
nil_if_zero false do
|
18
|
+
attribute :id, Integer
|
19
|
+
attribute :uuid, Integer, nil_if_zero: true
|
20
|
+
nil_if_zero true do
|
21
|
+
attributes nil_if_zero: false do
|
22
|
+
attribute :nested_int, Integer, alias_setter: :nested_int_alias_2
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class BlockSetupTest < TestBase
|
31
|
+
def test_one
|
32
|
+
instance = BlockModel.new(name: '', status: 0, friends: [], address: '', id: 0, uuid: 0, nested_int: 0 )
|
33
|
+
assert_nil instance.name
|
34
|
+
assert_nil instance.status
|
35
|
+
assert_nil instance.friends
|
36
|
+
assert_equal '', instance.address
|
37
|
+
assert_equal 0, instance.id
|
38
|
+
assert_nil instance.uuid
|
39
|
+
assert_equal 0, instance.nested_int
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class WithFourAttributes
|
4
|
+
include Wardrobe
|
5
|
+
attribute :first_name, String
|
6
|
+
attribute :last_name, String
|
7
|
+
attribute :email, String
|
8
|
+
attribute :phone_number, String
|
9
|
+
end
|
10
|
+
|
11
|
+
class WithOneAttributeRemoved < WithFourAttributes
|
12
|
+
remove_attribute :last_name
|
13
|
+
remove_attributes :email, :phone_number
|
14
|
+
end
|
15
|
+
|
16
|
+
module Essentials
|
17
|
+
include Wardrobe
|
18
|
+
attribute :id, String
|
19
|
+
end
|
20
|
+
|
21
|
+
module SomeExtraAttributes
|
22
|
+
include Wardrobe
|
23
|
+
attribute :hair_style, String
|
24
|
+
end
|
25
|
+
|
26
|
+
module ComposedModule
|
27
|
+
include Essentials
|
28
|
+
include SomeExtraAttributes
|
29
|
+
end
|
30
|
+
|
31
|
+
class KlassWithIncludedModule < WithFourAttributes
|
32
|
+
include SomeExtraAttributes
|
33
|
+
end
|
34
|
+
|
35
|
+
class CoerceToStringTest
|
36
|
+
include Wardrobe
|
37
|
+
attribute :number, Integer
|
38
|
+
end
|
39
|
+
|
40
|
+
class WithExtendedModule
|
41
|
+
include Essentials
|
42
|
+
attribute :another, String
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
class ClassMethodsTest < TestBase
|
47
|
+
def test_with_two_attributes
|
48
|
+
klass = WithFourAttributes
|
49
|
+
instance = klass.new(first_name: 'Foo', last_name: 'Bar')
|
50
|
+
|
51
|
+
assert klass.singleton_class.included_modules.include?(Wardrobe::ClassMethods)
|
52
|
+
assert klass.attribute_store.first_name
|
53
|
+
assert klass.attribute_store[:last_name]
|
54
|
+
assert_equal 4, klass.attribute_store.count
|
55
|
+
assert_equal 'Foo', instance.first_name
|
56
|
+
assert_equal 'Bar', instance.last_name
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_with_one_attribute
|
60
|
+
klass = WithOneAttributeRemoved
|
61
|
+
assert_equal 1, klass.attribute_store.count
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_class_with_added_module
|
65
|
+
klass = KlassWithIncludedModule
|
66
|
+
assert_equal 5, klass.attribute_store.count
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_class_with_includeed_module
|
70
|
+
klass = WithExtendedModule
|
71
|
+
assert_equal 2, klass.attribute_store.count
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_coercien
|
75
|
+
instance = CoerceToStringTest.new(number: '1')
|
76
|
+
assert_equal 1, instance.number
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_adding_attribute_to_instance
|
80
|
+
klass = WithFourAttributes
|
81
|
+
instance = klass.new(first_name: 'Test')
|
82
|
+
instance2 = klass.new(first_name: 'Test2')
|
83
|
+
instance._add_attribute(:dynamic, Integer)
|
84
|
+
instance2._add_attribute(:dynamic, String)
|
85
|
+
assert_equal 4, klass.attribute_store.count
|
86
|
+
assert_equal 5, instance._attribute_store.count
|
87
|
+
assert_equal 5, instance2._attribute_store.count
|
88
|
+
assert_equal Integer, instance._attribute_store.dynamic.klass
|
89
|
+
assert_equal String, instance2._attribute_store.dynamic.klass
|
90
|
+
assert_nil klass.attribute_store[:dynamic]
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CreateClassFromHashTest < TestBase
|
4
|
+
def test_one
|
5
|
+
config = {
|
6
|
+
plugins: [
|
7
|
+
:default
|
8
|
+
],
|
9
|
+
attributes: [
|
10
|
+
{
|
11
|
+
name: :email,
|
12
|
+
class: 'String',
|
13
|
+
options: {
|
14
|
+
default: 'test@example.com'
|
15
|
+
}
|
16
|
+
},
|
17
|
+
{
|
18
|
+
name: :name,
|
19
|
+
class: 'String'
|
20
|
+
}
|
21
|
+
]
|
22
|
+
}
|
23
|
+
|
24
|
+
klass = Wardrobe.create_class(config)
|
25
|
+
instance = klass.new
|
26
|
+
assert_equal 'test@example.com', instance.email
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
class DefineGetterTest < TestBase
|
3
|
+
class Zero
|
4
|
+
include Wardrobe
|
5
|
+
plugin :optional_getter
|
6
|
+
attribute :name, String, getter: false
|
7
|
+
end
|
8
|
+
|
9
|
+
class One
|
10
|
+
include Wardrobe
|
11
|
+
attribute :name, String
|
12
|
+
end
|
13
|
+
|
14
|
+
class Two < One
|
15
|
+
def name
|
16
|
+
'overridden in two'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ModOne
|
21
|
+
def name
|
22
|
+
'overridden in mod one'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Three < Two
|
27
|
+
include ModOne
|
28
|
+
end
|
29
|
+
|
30
|
+
module Part1
|
31
|
+
def name
|
32
|
+
'overridden in mod part_1'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Part2
|
37
|
+
def name
|
38
|
+
'overridden in mod part_2'
|
39
|
+
end
|
40
|
+
def email
|
41
|
+
'email overridden in mod part_2'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module Part3
|
46
|
+
include Wardrobe
|
47
|
+
attribute :email, String
|
48
|
+
end
|
49
|
+
|
50
|
+
module ComposedModule
|
51
|
+
include Part1
|
52
|
+
include Part2
|
53
|
+
include Part3
|
54
|
+
end
|
55
|
+
|
56
|
+
class Four < Three
|
57
|
+
include ComposedModule
|
58
|
+
end
|
59
|
+
|
60
|
+
class Five < Three
|
61
|
+
include Part3
|
62
|
+
include Part2
|
63
|
+
include Part1
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def test_class_zero
|
68
|
+
assert_raises(NoMethodError) {
|
69
|
+
Zero.new.name
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_class_one
|
74
|
+
assert_nil One.new.name
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_class_two
|
78
|
+
assert_equal 'overridden in two', Two.new.name
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_class_three
|
82
|
+
assert_equal 'overridden in mod one', Three.new.name
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_class_four
|
86
|
+
assert_equal 'overridden in mod part_2', Four.new.name
|
87
|
+
assert_nil Four.new.email
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_class_five
|
91
|
+
assert_equal 'email overridden in mod part_2', Five.new.email
|
92
|
+
assert_equal 'overridden in mod part_1', Five.new.name
|
93
|
+
end
|
94
|
+
end
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
class DisableCoercionTest < TestBase
|
3
|
+
class NoCoercion
|
4
|
+
include Wardrobe(coerce: false)
|
5
|
+
attribute :name, String
|
6
|
+
end
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@instance = NoCoercion.new(name: :test)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_model
|
13
|
+
assert_equal false, NoCoercion.root_config.coerce
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_no_coercion
|
17
|
+
assert_equal :test, @instance.name
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class InheritanceCompositionTest < TestBase
|
6
|
+
# Test a simple class with Wardrobe included
|
7
|
+
class SimpleClass
|
8
|
+
include Wardrobe
|
9
|
+
attribute :name, String
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_simple_class
|
13
|
+
instance = SimpleClass.new(name: 'Test')
|
14
|
+
assert_equal 'Test', instance.name
|
15
|
+
end
|
16
|
+
|
17
|
+
# Test a class inherits from SimpleClass
|
18
|
+
|
19
|
+
class InheritedClass < SimpleClass
|
20
|
+
plugin :default
|
21
|
+
attribute :age, Integer, default: 18
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_plugin_registered_on_inherited_class_only
|
25
|
+
assert_nil SimpleClass.plugin_store[:default]
|
26
|
+
assert InheritedClass.plugin_store[:default]
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_inherited_class
|
30
|
+
instance = InheritedClass.new(name: 'Test Inherited')
|
31
|
+
assert_equal 'Test Inherited', instance.name
|
32
|
+
assert_equal 18, instance.age
|
33
|
+
end
|
34
|
+
|
35
|
+
# Add tests for different modules
|
36
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MethodOverrideTest < TestBase
|
4
|
+
class Person
|
5
|
+
include Wardrobe
|
6
|
+
plugin :nil_if_empty
|
7
|
+
attribute :name, String, nil_if_empty: true
|
8
|
+
|
9
|
+
def name
|
10
|
+
super + ' added'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_one
|
15
|
+
person = Person.new(name: 'hi')
|
16
|
+
assert_equal 'hi added', person.name
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MethodPolutionTest < TestBase
|
4
|
+
|
5
|
+
ALLOWED_POLUTING_PLUGINS = { immutable: [:mutate] }
|
6
|
+
|
7
|
+
class WardrobeClassWithoutPlugins
|
8
|
+
include Wardrobe
|
9
|
+
end
|
10
|
+
|
11
|
+
class WardrobeClassWithCleanPlugins
|
12
|
+
include Wardrobe
|
13
|
+
(Wardrobe.plugins.keys - ALLOWED_POLUTING_PLUGINS.keys).each do |plugin_name|
|
14
|
+
plugin plugin_name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class WardrobeClassWithAllowedPolutingPlugins
|
19
|
+
include Wardrobe
|
20
|
+
ALLOWED_POLUTING_PLUGINS.keys.each do |plugin_name|
|
21
|
+
plugin plugin_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def methods_class_without_plugins
|
26
|
+
WardrobeClassWithoutPlugins.new.methods - Object.methods
|
27
|
+
end
|
28
|
+
|
29
|
+
def methods_class_with_clean_plugins
|
30
|
+
WardrobeClassWithCleanPlugins.new.methods - Object.methods
|
31
|
+
end
|
32
|
+
|
33
|
+
def methods_class_with_polution_allowed_plugins
|
34
|
+
WardrobeClassWithAllowedPolutingPlugins.new.methods - Object.methods
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_without_plugins
|
38
|
+
assert_equal [], methods_class_without_plugins.delete_if { |m| m.to_s[/^_/] }
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_with_plugins
|
42
|
+
assert_equal [], methods_class_with_clean_plugins.delete_if { |m| m.to_s[/^_/] }
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_allowed_methods
|
46
|
+
assert_equal ALLOWED_POLUTING_PLUGINS.values.flatten, methods_class_with_polution_allowed_plugins.delete_if { |m| m.to_s[/^_/] }
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class OptionTest < TestBase
|
4
|
+
|
5
|
+
def test_invalid_option
|
6
|
+
assert_raises(Wardrobe::UnavailableOptionError) do
|
7
|
+
Class.new do
|
8
|
+
include Wardrobe
|
9
|
+
attribute :name, String, should_fail: :option
|
10
|
+
end
|
11
|
+
end
|
12
|
+
Class.new do
|
13
|
+
include Wardrobe
|
14
|
+
attribute :name, String, coerce: :option
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class AliasPerson
|
4
|
+
include Wardrobe
|
5
|
+
plugin :alias_setters
|
6
|
+
attributes do
|
7
|
+
alias_setter :profile_name do
|
8
|
+
attribute :name, String, alias_setter: :full_name
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
class AliasSetterTest < TestBase
|
15
|
+
def test_block_setup_alias_setter
|
16
|
+
person = AliasPerson.new(profile_name: 'Test Person')
|
17
|
+
assert_equal 'Test Person', person.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_attribute_alias_setter
|
21
|
+
person = AliasPerson.new(full_name: 'Test Person')
|
22
|
+
assert_equal 'Test Person', person.name
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ArrayCoercionTest < TestBase
|
4
|
+
class Person
|
5
|
+
include Wardrobe
|
6
|
+
attribute :name, String
|
7
|
+
end
|
8
|
+
|
9
|
+
class ArrayObject
|
10
|
+
include Wardrobe
|
11
|
+
attribute :set, Array
|
12
|
+
attribute :array, Array
|
13
|
+
attribute :array_integer, Array[Integer]
|
14
|
+
attribute :array_string, Array[String]
|
15
|
+
attribute :array_hash, Array[Hash]
|
16
|
+
attribute :array_hash_integer_symbol, Array[Hash[Integer => Symbol]]
|
17
|
+
attribute :array_wardrobe_objects, Array[Person]
|
18
|
+
attribute :nil, Array
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup
|
22
|
+
@object = ArrayObject.new(
|
23
|
+
set: Set.new([1,2]),
|
24
|
+
array: [3,4],
|
25
|
+
array_integer: ['1', '2.0', 3, 4.3],
|
26
|
+
array_string: [1, 2.0, '3'],
|
27
|
+
array_hash: [{one: '1'}, ['two', 2.4]],
|
28
|
+
array_hash_integer_symbol: [{1.0 => 'one'}, ['2', 'two']],
|
29
|
+
array_wardrobe_objects: [{name: 'Test Person'}],
|
30
|
+
nil: nil
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_coercion
|
35
|
+
assert_equal [1,2], @object.set
|
36
|
+
assert_equal [3,4], @object.array
|
37
|
+
assert_equal [1,2,3,4], @object.array_integer
|
38
|
+
assert_equal ['1','2.0','3'], @object.array_string
|
39
|
+
assert_equal [{one: '1'}, {'two' => 2.4}], @object.array_hash
|
40
|
+
assert_equal [{1 => :one}, {2 => :two}], @object.array_hash_integer_symbol
|
41
|
+
assert Person === @object.array_wardrobe_objects[0]
|
42
|
+
assert_equal [], @object.nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_array_with_multiple_items
|
46
|
+
assert_raises(StandardError) do
|
47
|
+
Class.new do
|
48
|
+
include Wardrobe
|
49
|
+
attribute :array, Array[Integer, Hash]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_coercion_when_modifying_person_array
|
55
|
+
@object.array_wardrobe_objects << { name: '1' }
|
56
|
+
assert Person === @object.array_wardrobe_objects[1]
|
57
|
+
@object.array_wardrobe_objects.push({ name: '2' })
|
58
|
+
assert Person === @object.array_wardrobe_objects[2]
|
59
|
+
@object.array_wardrobe_objects.unshift({ name: '3' })
|
60
|
+
assert Person === @object.array_wardrobe_objects[3]
|
61
|
+
assert_equal 4, @object.array_wardrobe_objects.count
|
62
|
+
assert @object.array_wardrobe_objects.all? { |item| Person === item }
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_coercion_return_value
|
66
|
+
@object.array_integer << '5'
|
67
|
+
@object.array_string << 4.1
|
68
|
+
@object.array_hash_integer_symbol << { '3.1' => 'three' }
|
69
|
+
assert_equal 5, @object.array_integer.last
|
70
|
+
assert_equal '4.1', @object.array_string.last
|
71
|
+
assert_equal({ 3 => :three }, @object.array_hash_integer_symbol.last)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_error
|
75
|
+
assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
|
76
|
+
ArrayObject.new(set: :symbol)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BooleanCoercionTest < TestBase
|
4
|
+
class BooleanObject
|
5
|
+
include Wardrobe
|
6
|
+
attribute :true, Wardrobe::Boolean
|
7
|
+
attribute :false, Wardrobe::Boolean
|
8
|
+
attribute :integer_one, Wardrobe::Boolean
|
9
|
+
attribute :integer_zero, Wardrobe::Boolean
|
10
|
+
attribute :yes, Wardrobe::Boolean
|
11
|
+
attribute :no, Wardrobe::Boolean
|
12
|
+
attribute :string_1, Wardrobe::Boolean
|
13
|
+
attribute :string_0, Wardrobe::Boolean
|
14
|
+
attribute :string_true, Wardrobe::Boolean
|
15
|
+
attribute :string_false, Wardrobe::Boolean
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_coercion_to_true
|
19
|
+
object = BooleanObject.new(
|
20
|
+
true: true,
|
21
|
+
integer_one: 1,
|
22
|
+
yes: 'yes',
|
23
|
+
string_1: '1',
|
24
|
+
string_true: 'true'
|
25
|
+
)
|
26
|
+
|
27
|
+
assert_equal true, object.true
|
28
|
+
assert_equal true, object.integer_one
|
29
|
+
assert_equal true, object.yes
|
30
|
+
assert_equal true, object.string_1
|
31
|
+
assert_equal true, object.string_true
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_coercion_to_false
|
35
|
+
object = BooleanObject.new(
|
36
|
+
false: false,
|
37
|
+
integer_zero: 0,
|
38
|
+
no: 'no',
|
39
|
+
string_0: '0',
|
40
|
+
string_false: 'false'
|
41
|
+
)
|
42
|
+
assert_equal false, object.false
|
43
|
+
assert_equal false, object.integer_zero
|
44
|
+
assert_equal false, object.no
|
45
|
+
assert_equal false, object.string_0
|
46
|
+
assert_equal false, object.string_false
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_coercion_from_setter
|
50
|
+
object = BooleanObject.new
|
51
|
+
object.false = false
|
52
|
+
object.integer_zero = 0
|
53
|
+
assert_equal false, object.false
|
54
|
+
assert_equal false, object.integer_zero
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_error
|
58
|
+
assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
|
59
|
+
BooleanObject.new(yes: 'ja')
|
60
|
+
end
|
61
|
+
assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
|
62
|
+
BooleanObject.new(yes: 11)
|
63
|
+
end
|
64
|
+
assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
|
65
|
+
BooleanObject.new(yes: [1])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|