trax_core 0.0.84 → 0.0.85

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +2 -2
  4. data/lib/trax/core/definitions.rb +4 -4
  5. data/lib/trax/core/ext/hash.rb +15 -5
  6. data/lib/trax/core/ext/method.rb +95 -0
  7. data/lib/trax/core/ext/object.rb +7 -2
  8. data/lib/trax/core/fields.rb +4 -0
  9. data/lib/trax/core/has_mixins.rb +5 -1
  10. data/lib/trax/core/transformer.rb +244 -0
  11. data/lib/trax/core/types/boolean.rb +1 -0
  12. data/lib/trax/core/types/enum.rb +7 -8
  13. data/lib/trax/core/types/enum_value.rb +4 -10
  14. data/lib/trax/core/types/json.rb +8 -0
  15. data/lib/trax/core/types/struct.rb +45 -4
  16. data/lib/trax/core/types/value_object.rb +7 -1
  17. data/lib/trax/core.rb +13 -0
  18. data/lib/trax_core/version.rb +1 -1
  19. data/spec/support/defs.rb +29 -1
  20. data/spec/support/storefront/product.rb +2 -0
  21. data/spec/trax/array_spec.rb +2 -6
  22. data/spec/trax/core/definitions_spec.rb +76 -2
  23. data/spec/trax/core/eager_autoload_namespace_spec.rb +4 -4
  24. data/spec/trax/core/errors_spec.rb +10 -15
  25. data/spec/trax/core/ext/array_spec.rb +2 -2
  26. data/spec/trax/core/ext/class_spec.rb +3 -3
  27. data/spec/trax/core/ext/hash_spec.rb +10 -0
  28. data/spec/trax/core/ext/method_spec.rb +104 -0
  29. data/spec/trax/core/ext/module_spec.rb +5 -5
  30. data/spec/trax/core/ext/object_spec.rb +5 -5
  31. data/spec/trax/core/transformer_spec.rb +170 -0
  32. data/spec/trax/core/types/array_spec.rb +4 -4
  33. data/spec/trax/core/types/enum_spec.rb +23 -18
  34. data/spec/trax/core/types/struct_spec.rb +50 -7
  35. data/spec/trax/core/types/value_object_spec.rb +6 -0
  36. data/spec/trax/core_spec.rb +1 -3
  37. data/spec/trax/hash_spec.rb +13 -15
  38. data/trax_core.gemspec +7 -6
  39. metadata +97 -5
  40. data/spec/trax/core/inheritance_spec.rb +0 -0
data/lib/trax/core.rb CHANGED
@@ -4,6 +4,7 @@ require_relative './core/fs'
4
4
  require_relative './core/ext/array'
5
5
  require_relative './core/ext/class'
6
6
  require_relative './core/ext/enumerable'
7
+ require_relative './core/ext/method'
7
8
  require_relative './core/ext/module'
8
9
  require_relative './core/ext/hash'
9
10
  require_relative './core/ext/object'
@@ -14,6 +15,17 @@ require_relative './core/ext/uri'
14
15
  require_relative './core/primitives/enum_value'
15
16
  require_relative './core/primitives/enum'
16
17
 
18
+ if(::RUBY_VERSION < '2.3')
19
+ begin
20
+ require 'ruby_dig'
21
+ rescue LoadError => e
22
+ raise unless e.message =~ /ruby_dig/
23
+ error = e.exception("Trax::Core::Transformer relies on ruby_dig shim, add gem 'ruby_dig' to gemfile")
24
+ error.set_backtrace(e.backtrace)
25
+ raise error
26
+ end
27
+ end
28
+
17
29
  module Trax
18
30
  module Core
19
31
  extend ::ActiveSupport::Autoload
@@ -37,6 +49,7 @@ module Trax
37
49
  autoload :NamedClass
38
50
  autoload :NamedModule
39
51
  autoload :SilenceWarnings
52
+ autoload :Transformer
40
53
  autoload :Types
41
54
  autoload :PathPermutations
42
55
  end
@@ -1,3 +1,3 @@
1
1
  module TraxCore
2
- VERSION = "0.0.84"
2
+ VERSION = "0.0.85"
3
3
  end
data/spec/support/defs.rb CHANGED
@@ -8,6 +8,19 @@ module Defs
8
8
  define :accessories, 4
9
9
  end
10
10
 
11
+ struct :ShipmentAttributes do
12
+ string :tracking_number
13
+ float :weight
14
+ integer :insurance_amount
15
+ boolean :is_insured
16
+ array :notes
17
+ enum :shipping_type do
18
+ define :standard, 1
19
+ define :overnight, 2
20
+ define :same_day, 3
21
+ end
22
+ end
23
+
11
24
  struct :ProductAttributes do
12
25
  string :name, :default => ""
13
26
  float :price, :default => 9.99
@@ -16,7 +29,7 @@ module Defs
16
29
  array :categories, :of => "Defs::Category", :default => []
17
30
  end
18
31
 
19
- struct :ShoesAttributes, :extend => "Defs::ProductAttributes" do
32
+ struct :ShoesAttributes, :extends => "Defs::ProductAttributes" do
20
33
  enum :size do
21
34
  define :mens_8, 1
22
35
  define :mens_9, 2
@@ -25,4 +38,19 @@ module Defs
25
38
  define :mens_12, 5
26
39
  end
27
40
  end
41
+
42
+ struct :ShirtAttributes, :extends => "Defs::ProductAttributes" do
43
+ string :name, :default => "Three-Fifty"
44
+ float :price, :default => 3.50
45
+ integer :quantity_in_stock, :default => 5
46
+ boolean :is_active, :default => true
47
+ array :categories, :of => "Defs::Category", :default => [:default, :clothing]
48
+ enum :size, :default => :womens_m do
49
+ define :womens_xs, 1
50
+ define :womens_s, 2
51
+ define :womens_m, 3
52
+ define :womens_l, 4
53
+ define :womens_xl, 5
54
+ end
55
+ end
28
56
  end
@@ -1,3 +1,5 @@
1
+ require_relative "../fake_namespace"
2
+
1
3
  module Storefront
2
4
  class Product
3
5
  include ::FakeNamespace::Mixable
@@ -9,9 +9,7 @@ describe ::Array do
9
9
  end
10
10
 
11
11
  describe "#to_proc" do
12
- it{
13
- subject.map(&[:name, :price]).map(&:last).sum.should eq 90
14
- }
12
+ it { expect(subject.map(&[:name, :price]).map(&:last).sum).to eq 90 }
15
13
 
16
14
  context "array of non hash objects" do
17
15
  subject {
@@ -21,9 +19,7 @@ describe ::Array do
21
19
  ]
22
20
  }
23
21
 
24
- it {
25
- subject.map(&[:name, :price]).map(&[:price]).sum.should eq 90
26
- }
22
+ it { expect(subject.map(&[:name, :price]).map(&[:price]).sum).to eq 90 }
27
23
  end
28
24
  end
29
25
  end
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ::Trax::Core::Definitions do
4
- subject { ::Defs }
4
+ subject(:definitions) { ::Defs }
5
5
 
6
6
  context "fields" do
7
- it { subject[:category].should eq subject::Category }
7
+ it { expect(subject[:category]).to eq subject::Category }
8
8
  end
9
9
 
10
10
  context "enum" do
@@ -42,4 +42,78 @@ describe ::Trax::Core::Definitions do
42
42
  it { expect(subject::ShoesAttributes.new).to have_key(:price) }
43
43
  it { expect(subject::ShoesAttributes.new(:size => :mens_8).size.to_i).to eq 1 }
44
44
  end
45
+
46
+ context "schema" do
47
+ let(:schema) { definitions.to_schema }
48
+
49
+ context "field defaults" do
50
+ context "with defaults" do
51
+ subject { schema[:shirt_attributes][:fields][field_name][:default] }
52
+
53
+ context "string" do
54
+ let(:field_name) { :name }
55
+ it { is_expected.to eq("Three-Fifty") }
56
+ end
57
+
58
+ context "float" do
59
+ let(:field_name) { :price }
60
+ it { is_expected.to eq(3.50) }
61
+ end
62
+
63
+ context "integer" do
64
+ let(:field_name) { :quantity_in_stock }
65
+ it { is_expected.to eq(5) }
66
+ end
67
+
68
+ context "boolean" do
69
+ let(:field_name) { :is_active }
70
+ it { is_expected.to eq(true) }
71
+ end
72
+
73
+ context "array" do
74
+ let(:field_name) { :categories }
75
+ it { is_expected.to eq([:default, :clothing]) }
76
+ end
77
+
78
+ context "enum" do
79
+ let(:field_name) { :size }
80
+ it { is_expected.to eq(:womens_m) }
81
+ end
82
+ end
83
+
84
+ context "without defaults" do
85
+ subject { schema[:shipment_attributes][:fields][field_name] }
86
+
87
+ context "string" do
88
+ let(:field_name) { :tracking_number }
89
+ it { is_expected.to_not have_key(:default) }
90
+ end
91
+
92
+ context "float" do
93
+ let(:field_name) { :weight }
94
+ it { is_expected.to_not have_key(:default) }
95
+ end
96
+
97
+ context "integer" do
98
+ let(:field_name) { :insurance_amount }
99
+ it { is_expected.to_not have_key(:default) }
100
+ end
101
+
102
+ context "boolean" do
103
+ let(:field_name) { :is_insured }
104
+ it { is_expected.to_not have_key(:default) }
105
+ end
106
+
107
+ context "array" do
108
+ let(:field_name) { :notes }
109
+ it { is_expected.to_not have_key(:default) }
110
+ end
111
+
112
+ context "enum" do
113
+ let(:field_name) { :shipping_type }
114
+ it { is_expected.to_not have_key(:default) }
115
+ end
116
+ end
117
+ end
118
+ end
45
119
  end
@@ -3,8 +3,8 @@ require 'spec_helper'
3
3
  describe ::Trax::Core::EagerAutoloadNamespace do
4
4
  subject { ::Ecom }
5
5
 
6
- its('autoload_class_names.length') { should eq 2 }
7
- its('autoload_file_paths.length') { should eq 2 }
8
- its(:eager_autoload_filepath) { should include('ecom') }
9
- its(:module_path) { should be_a(::Pathname) }
6
+ its('autoload_class_names.length') { is_expected.to eq 2 }
7
+ its('autoload_file_paths.length') { is_expected.to eq 2 }
8
+ its(:eager_autoload_filepath) { is_expected.to include('ecom') }
9
+ its(:module_path) { is_expected.to be_a(::Pathname) }
10
10
  end
@@ -1,23 +1,18 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ::Trax::Core::Errors do
4
+ let(:error_attributes) do
5
+ {
6
+ :request_url => 'http://www.somewhere.com',
7
+ :request_id => 'asdasdsdad1231421'
8
+ }
9
+ end
10
+
4
11
  subject { ::Errors::SiteBrokenError }
5
12
 
6
- it { expect{ subject.new }.to raise_error(ArgumentError) }
13
+ it { expect { subject.new }.to raise_error(ArgumentError) }
7
14
 
8
- it do
9
- expect do
10
- raise subject.new(
11
- :request_url => 'http://www.somewhere.com',
12
- :request_id => 'asdasdsdad1231421'
13
- )
14
- end.to raise_error(subject)
15
- end
15
+ it { expect { raise subject.new(error_attributes) }.to raise_error(subject) }
16
16
 
17
- it do
18
- subject.new(
19
- :request_url => 'http://www.somewhere.com',
20
- :request_id => 'asdasdsdad1231421'
21
- ).to_s.should include('http://www.somewhere.com')
22
- end
17
+ it { expect(subject.new(error_attributes).to_s).to include('http://www.somewhere.com') }
23
18
  end
@@ -3,9 +3,9 @@ require 'spec_helper'
3
3
  describe Array do
4
4
  subject { ["one", "two", "three", "one", ["two"]]}
5
5
 
6
- it { subject.flat_compact_uniq!.should eq ["one", "two", "three"] }
6
+ it { expect(subject.flat_compact_uniq!).to eq ["one", "two", "three"] }
7
7
  it "modifies array in place" do
8
8
  test_subject = subject.flat_compact_uniq!
9
- test_subject.object_id.should eq subject.object_id
9
+ expect(test_subject.object_id).to eq subject.object_id
10
10
  end
11
11
  end
@@ -2,11 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  describe ::Class do
4
4
  describe ".superclasses_until" do
5
- it {
6
- ::InheritanceChainNamespace::D.superclasses_until(::InheritanceChainNamespace::A).should eq [
5
+ it do
6
+ expect(::InheritanceChainNamespace::D.superclasses_until(::InheritanceChainNamespace::A)).to eq [
7
7
  ::InheritanceChainNamespace::B,
8
8
  ::InheritanceChainNamespace::C
9
9
  ]
10
- }
10
+ end
11
11
  end
12
12
  end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+ subject { {:one => :two, :three => :four } }
5
+
6
+ describe "#assert_required_keys" do
7
+ it { expect { subject.assert_required_keys(:five) }.to raise_error(ArgumentError) }
8
+ it { expect { subject.assert_required_keys(:one) }.not_to raise_error }
9
+ end
10
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ describe Method do
4
+ before(:all) do
5
+ class MyNewFakeClass < OpenStruct
6
+ def self.i_dont_accept_arguments
7
+ "one"
8
+ end
9
+
10
+ def self.i_accept_ordinal_arguments(one, two)
11
+ return [one, two]
12
+ end
13
+
14
+ def self.i_accept_optional_ordinal_arguments(one=nil, two=nil)
15
+ return [one, two]
16
+ end
17
+
18
+ def self.i_accept_splat_arguments(*args)
19
+ return args
20
+ end
21
+
22
+ def self.i_accept_keyword_arguments(three:nil, one:, two:)
23
+ return [one, two]
24
+ end
25
+
26
+ def self.i_accept_keyword_arguments_splat(**options)
27
+ return options
28
+ end
29
+ end
30
+ end
31
+
32
+ subject { MyNewFakeClass.method(target_method) }
33
+
34
+ let(:fake_args) { ['something'] }
35
+ let(:fake_params) { {:else => 'anything'} }
36
+
37
+ context "method knows what it accepts" do
38
+ describe '.i_dont_accept_arguments' do
39
+ let(:target_method) { 'i_dont_accept_arguments' }
40
+
41
+ it { expect(subject.accepts_arguments?).to eq false }
42
+ it { expect(subject.accepts_keywords?).to eq false }
43
+ it { expect(subject.accepts_arguments_splat?).to eq false }
44
+ it {
45
+ expect(subject).to receive(:strategy_for_method_without_arguments)
46
+ subject.execute_call_strategy(*fake_args, **fake_params)
47
+ }
48
+ end
49
+
50
+ describe '.i_accept_ordinal_arguments' do
51
+ let(:target_method) { 'i_accept_ordinal_arguments' }
52
+
53
+ it { expect(subject.accepts_arguments?).to eq true }
54
+ it { expect(subject.accepts_keywords?).to eq false }
55
+ it { expect(subject.accepts_arguments_splat?).to eq false }
56
+ it {
57
+ expect(subject).to receive(:strategy_for_method_with_arguments)
58
+ subject.execute_call_strategy(*fake_args, **fake_params)
59
+ }
60
+ end
61
+
62
+ describe '.i_accept_optional_ordinal_arguments' do
63
+ let(:target_method) { 'i_accept_optional_ordinal_arguments' }
64
+
65
+ it { expect(subject.accepts_arguments?).to eq true }
66
+ it { expect(subject.accepts_optional_arguments?).to eq true }
67
+ it { expect(subject.accepts_keywords?).to eq false }
68
+ it { expect(subject.accepts_arguments_splat?).to eq false }
69
+ it {
70
+ expect(subject).to receive(:strategy_for_method_with_arguments)
71
+ subject.execute_call_strategy(*fake_args, **fake_params)
72
+ }
73
+ end
74
+
75
+ describe '.i_accept_splat_arguments' do
76
+ let(:target_method) { 'i_accept_splat_arguments' }
77
+
78
+ it { expect(subject.accepts_arguments?).to eq true }
79
+ it { expect(subject.accepts_keywords?).to eq false }
80
+ it { expect(subject.accepts_arguments_splat?).to eq true }
81
+ it {
82
+ expect(subject).to receive(:strategy_for_method_with_arguments)
83
+ subject.execute_call_strategy(*fake_args, **fake_params)
84
+ }
85
+ end
86
+
87
+ describe '.i_accept_keyword_arguments' do
88
+ let(:target_method) { 'i_accept_keyword_arguments' }
89
+
90
+ it { expect(subject.accepts_arguments?).to eq false }
91
+ it { expect(subject.accepts_keywords?).to eq true }
92
+ it { expect(subject.accepts_arguments_splat?).to eq false }
93
+ end
94
+
95
+ describe '.i_accept_keyword_arguments_splat' do
96
+ let(:target_method) { 'i_accept_keyword_arguments_splat' }
97
+
98
+ it { expect(subject.accepts_arguments?).to eq false }
99
+ it { expect(subject.accepts_arguments_splat?).to eq false }
100
+ it { expect(subject.accepts_keywords?).to eq true }
101
+ it { expect(subject.accepts_keywords_splat?).to eq true }
102
+ end
103
+ end
104
+ end
@@ -10,7 +10,7 @@ describe ::Module do
10
10
  end
11
11
  end
12
12
 
13
- it { Trax.some_fake_hash.should be_a(Hash) }
13
+ it { expect(Trax.some_fake_hash).to be_a(Hash) }
14
14
  end
15
15
 
16
16
  describe ".recursively_define_namespaced_class" do
@@ -27,7 +27,7 @@ describe ::Module do
27
27
  Trax.recursively_define_namespaced_class("Core::FakeKlass", Hash)
28
28
  end
29
29
 
30
- it { Trax::Core::FakeKlass.superclass.should == Hash }
30
+ it { expect(Trax::Core::FakeKlass.superclass).to eq Hash }
31
31
  end
32
32
  end
33
33
 
@@ -42,14 +42,14 @@ describe ::Module do
42
42
 
43
43
  subject{ ::Trax::Core::FakeNamespace::Configuration }
44
44
 
45
- its(:superclass) { should eq ::Trax::Core::Configuration }
45
+ its(:superclass) { is_expected.to eq ::Trax::Core::Configuration }
46
46
 
47
47
  it "sets up configuration options" do
48
48
  ::Trax::Core::FakeNamespace.configure do |config|
49
49
  config.something = 'anything'
50
50
  end
51
51
 
52
- ::Trax::Core::FakeNamespace.config.something.should eq 'anything'
52
+ expect(::Trax::Core::FakeNamespace.config.something).to eq 'anything'
53
53
  end
54
54
  end
55
55
 
@@ -84,7 +84,7 @@ describe ::Module do
84
84
  config.base_url = 'somewhere'
85
85
  end
86
86
 
87
- ::Trax::Core::YetAnotherFakeClass.config.allowed_ips[0].should eq '192.231.1234'
87
+ expect(::Trax::Core::YetAnotherFakeClass.config.allowed_ips[0]).to eq '192.231.1234'
88
88
  end
89
89
  end
90
90
  end
@@ -12,22 +12,22 @@ describe ::Object do
12
12
 
13
13
  describe ".try_chain" do
14
14
  it "wraps multiple calls to try and calls try on return value" do
15
- subject.try_chain(:name, :underscore).should eq "some_fake_class"
15
+ expect(subject.try_chain(:name, :underscore)).to eq "some_fake_class"
16
16
  end
17
17
 
18
18
  it "handles return if nil is in chain" do
19
- subject.try_chain(:name, :somefakemethod).should be_nil
19
+ expect(subject.try_chain(:name, :somefakemethod)).to be_nil
20
20
  end
21
21
 
22
22
  it "handles instances of class" do
23
- SomeFakeClass.new.try_chain(:class, :name, :underscore).should eq "some_fake_class"
23
+ expect(SomeFakeClass.new.try_chain(:class, :name, :underscore)).to eq "some_fake_class"
24
24
  end
25
25
  end
26
26
 
27
27
  describe ".set_fully_qualified_constant" do
28
28
  it "sets a fully qualified constant" do
29
29
  result = Object.set_fully_qualified_constant("SomeFakeClass::SomeFakeNestedClass", Class.new)
30
- result.name.should eq "SomeFakeClass::SomeFakeNestedClass"
30
+ expect(result.name).to eq "SomeFakeClass::SomeFakeNestedClass"
31
31
  end
32
32
 
33
33
  it "raises error if no valid namespace to set constant upon is passed" do
@@ -40,7 +40,7 @@ describe ::Object do
40
40
  obj = SomeFakeClass.new
41
41
  obj.instance_variable_set(:@someivar, "anything")
42
42
  obj.reset_instance_variables(:someivar)
43
- obj.instance_variable_get(:@someivar).should be nil
43
+ expect(obj.instance_variable_get(:@someivar)).to be nil
44
44
  end
45
45
  end
46
46
  end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ describe ::Trax::Core::Transformer do
4
+ let(:payload) do
5
+ {
6
+ "name" => "Uber",
7
+ "legalName" => "Uber, Inc.",
8
+ "url" => "http =>//uber.com",
9
+ "metrics" => {
10
+ "raised" => 1502450000,
11
+ "annualRevenue" => 20000
12
+ },
13
+ "somethingElse" => "somethingElseValue",
14
+ "some_value_transform" => 10,
15
+ "some_value_to_times_by" => 2,
16
+ "some_value" => 30,
17
+ "stats" => {
18
+ "number_of_widgets" => 20,
19
+ "number_of_employees" => 40
20
+ },
21
+ "some_object" => {
22
+ "thing" => 1
23
+ },
24
+ "some_other_object" => {
25
+ "some_value" => 2
26
+ },
27
+ "some_unmapped_var" => 2
28
+ }.with_indifferent_access
29
+ end
30
+
31
+ before do
32
+ class PayloadTransformer < ::Trax::Core::Transformer
33
+ property "name"
34
+ property "something", :default => ->(v) { "anything" }
35
+ property "some_non_proc_default", :default => 5
36
+ property "legal_name", :from => "legalName"
37
+
38
+ property "some_value"
39
+ property "some_value_to_times_by"
40
+ property "some_value_transform", :default => ->(i){ 1 } do |value, instance|
41
+ value * instance["some_value_to_times_by"]
42
+ end
43
+
44
+ transformer "stats" do
45
+ property "number_of_employees"
46
+ property "raised", :from_parent => "metrics/raised"
47
+ property "google_rank", :from_parent => "metrics/googleRank"
48
+ end
49
+
50
+ transformer "website" do
51
+ property "url", :from_parent => "url"
52
+ end
53
+
54
+ transformer "some_object" do
55
+ property "thing"
56
+
57
+ after_transform do
58
+ OpenStruct.new(self)
59
+ end
60
+ end
61
+
62
+ transformer "some_other_object" do
63
+ property "some_value"
64
+
65
+ after_transform do |result|
66
+ self['result'] = result['some_value'] * self.parent.input["some_unmapped_var"]
67
+ OpenStruct.new(self)
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ subject {
74
+ PayloadTransformer.new(payload)
75
+ }
76
+
77
+ context "class methods" do
78
+ describe ".transformer" do
79
+ it {
80
+ expect(subject.class.properties['stats'].is_nested?).to eq true
81
+ }
82
+ end
83
+ end
84
+
85
+ context "property mapping strategies" do
86
+ it "property declration without options" do
87
+ expect(subject["name"]).to eq "Uber"
88
+ end
89
+
90
+ context "property with default value" do
91
+ it "value is a proc" do
92
+ expect(subject["something"]).to eq "anything"
93
+ end
94
+
95
+ it "value is not a proc" do
96
+ expect(subject["some_non_proc_default"]).to eq 5
97
+ end
98
+ end
99
+
100
+ context "property key translated" do
101
+ it {
102
+ expect(subject["legal_name"]).to eq "Uber, Inc."
103
+ }
104
+
105
+ it "removes translated value from hash" do
106
+ expect(subject.to_hash).to_not have_key("legalName")
107
+ end
108
+ end
109
+
110
+ context "nested properties" do
111
+ it "mapping from source hash" do
112
+ expect(subject["stats"]["number_of_employees"]).to eq 40
113
+ end
114
+
115
+ it "mapping from parent nested property" do
116
+ expect(subject["stats"]["raised"]).to eq payload["metrics"]["raised"]
117
+ end
118
+
119
+ it "brand new nested property" do
120
+ expect(subject["website"]["url"]).to eq payload["url"]
121
+ end
122
+ end
123
+
124
+ context "callbacks" do
125
+ context "after transform" do
126
+ it "runs after transform callbacks which can mutate return result" do
127
+ expect(subject["some_object"].thing).to eq 1
128
+ end
129
+
130
+ it "passes instance" do
131
+ expect(subject["some_other_object"].result).to eq 4
132
+ end
133
+ end
134
+
135
+ context "after transform" do
136
+ it "runs after transform callbacks which can mutate return result" do
137
+ expect(subject["some_object"].thing).to eq 1
138
+ end
139
+
140
+ it "wraps return value in class" do
141
+ expect(subject["some_object"].__getobj__.is_a?(::OpenStruct)).to eq true
142
+ end
143
+ end
144
+ end
145
+
146
+ context "to_hash" do
147
+ it "unwraps nested transformers" do
148
+ expect(subject.to_hash["some_object"].is_a?(::OpenStruct)).to eq true
149
+ end
150
+ end
151
+
152
+ context "to_recursive_hash" do
153
+ it "unwraps nested transformers" do
154
+ expect(subject.to_recursive_hash["some_object"].is_a?(::OpenStruct)).to eq true
155
+ end
156
+ end
157
+
158
+ it {
159
+ expect(subject["some_value"]).to eq 30
160
+ }
161
+
162
+ it {
163
+ expect(subject["some_value_to_times_by"]).to eq 2
164
+ }
165
+
166
+ it {
167
+ expect(subject["some_value_transform"]).to eq 20
168
+ }
169
+ end
170
+ end
@@ -15,8 +15,8 @@ describe ::Trax::Core::Types::Array do
15
15
 
16
16
  context ".of" do
17
17
  let(:test_subject) { subject.new({:width => 1}) }
18
- it { test_subject[0].width.should eq 1 }
19
- it { test_subject[0].height.should eq 0 }
18
+ it { expect(test_subject[0].width).to eq 1 }
19
+ it { expect(test_subject[0].height).to eq 0 }
20
20
 
21
21
  context "does not duplicate values" do
22
22
  it {
@@ -35,7 +35,7 @@ describe ::Trax::Core::Types::Array do
35
35
  context "ArrayOf" do
36
36
  subject { ::Trax::Core::Types::ArrayOf[::AnotherFakeStructNamespace::Widget] }
37
37
  let(:test_subject) { subject.new({:width => 1}) }
38
- it { test_subject[0].width.should eq 1 }
39
- it { test_subject[0].height.should eq 0 }
38
+ it { expect(test_subject[0].width).to eq 1 }
39
+ it { expect(test_subject[0].height).to eq 0 }
40
40
  end
41
41
  end