adaptive 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7f06b9047fcdfc278213e2d9bd60793fc3713f51
4
+ data.tar.gz: e67ed1d6eeadcad3ee078ac81b907bac45bd7f31
5
+ SHA512:
6
+ metadata.gz: 5fb061714b7fb9f7d177c4ecb8aeeb5a7196195460d56500f0be84877e4e287687d16ba416e7fec1b3938629345d95427a353c1fcecb10bf5474c4560cd6b23f
7
+ data.tar.gz: 0a49bf055c4311e9f703ded419d7c39c44f16bc7137308e717d6faee4ef31a02cadbe37137c598ca539e1550d0a4961ceb3af27be381774aaa5afb73c40d76c8
@@ -0,0 +1 @@
1
+ coverage
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ -I .
2
+ --color
3
+ --order random
@@ -0,0 +1 @@
1
+ 2.0.0-p247
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
@@ -0,0 +1,32 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ id (0.0.1)
5
+ optional
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.2.4)
11
+ multi_json (1.7.8)
12
+ optional (0.0.7)
13
+ rspec (2.14.1)
14
+ rspec-core (~> 2.14.0)
15
+ rspec-expectations (~> 2.14.0)
16
+ rspec-mocks (~> 2.14.0)
17
+ rspec-core (2.14.4)
18
+ rspec-expectations (2.14.1)
19
+ diff-lcs (>= 1.1.3, < 2.0)
20
+ rspec-mocks (2.14.3)
21
+ simplecov (0.7.1)
22
+ multi_json (~> 1.0)
23
+ simplecov-html (~> 0.7.1)
24
+ simplecov-html (0.7.1)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ id!
31
+ rspec
32
+ simplecov
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'adaptive'
3
+ s.version = '0.0.1'
4
+ s.date = '2013-08-09'
5
+ s.summary = "Simple adapting utilty"
6
+ s.description = "Developed at On The Beach Ltd. Contact radek.molenda@onthebeach.co.uk"
7
+ s.authors = ["Radek Molenda"]
8
+ s.email = ['radek.molenda@gmail.com']
9
+ s.files = `git ls-files`.split($\)
10
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
11
+ s.require_paths = ["lib"]
12
+ s.homepage = 'http://github.com/onthebeach/adaptive'
13
+
14
+ s.add_dependency "optional"
15
+
16
+ s.add_development_dependency "rspec"
17
+ s.add_development_dependency "simplecov"
18
+
19
+ end
@@ -0,0 +1,2 @@
1
+ require 'optional'
2
+ require './lib/adaptive/hash'
@@ -0,0 +1,32 @@
1
+ module Adaptive
2
+ module Hash
3
+
4
+ def adapt_to_hash
5
+ ::Hash[adaptive.map{|k, methods| [k.to_s, resolve(object, methods)]}]
6
+ end
7
+ alias_method :adapt, :adapt_to_hash
8
+
9
+ private
10
+
11
+ def chained_methods(methods)
12
+ methods.split(".")
13
+ end
14
+
15
+ def resolve(object, methods)
16
+ object.map_through(*chained_methods(methods)).flatten.value_or(nil)
17
+ end
18
+
19
+ def object
20
+ Option[to_adapt]
21
+ end
22
+
23
+ def to_adapt
24
+ self
25
+ end
26
+
27
+ def adaptive
28
+ raise NotImplementedError, "#{self.class.name} must implement #adaptive"
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ class Address
4
+ def self.of(person)
5
+ Struct.new(:street, :city).new("34 Mountain Hill", "Chicago")
6
+ end
7
+ end
8
+
9
+ class SomePerson
10
+ include Adaptive::Hash
11
+
12
+ def name
13
+ Some["John"]
14
+ end
15
+
16
+ private
17
+ def adaptive
18
+ {
19
+ full_name: "name"
20
+ }
21
+ end
22
+ end
23
+
24
+ class Person
25
+ include Adaptive::Hash
26
+
27
+ def name
28
+ "John"
29
+ end
30
+
31
+ def surname
32
+ "Doe"
33
+ end
34
+
35
+ def address
36
+ Address.of(self)
37
+ end
38
+
39
+ private
40
+ def adaptive
41
+ {
42
+ full_name: "full_name",
43
+ street: "address.street",
44
+ city: "address.city"
45
+ }
46
+ end
47
+
48
+ def full_name
49
+ "#{name} #{surname}"
50
+ end
51
+
52
+ end
53
+
54
+ class Empty
55
+ include Adaptive::Hash
56
+ end
57
+
58
+ describe Adaptive::Hash do
59
+ describe "obligatory methods" do
60
+ let(:empty_class) { Empty.new }
61
+
62
+ it "should have private #adaptive defined" do
63
+ expect{empty_class.send(:adaptive)}.to raise_error NotImplementedError, "Empty must implement #adaptive"
64
+ end
65
+
66
+ end
67
+
68
+ describe "#adapt" do
69
+ let(:person) { Person.new }
70
+ let(:adapted) { {"full_name" => "John Doe",
71
+ "street" => "34 Mountain Hill",
72
+ "city" => "Chicago"} }
73
+
74
+ subject { person.adapt }
75
+
76
+ it { should eq adapted }
77
+
78
+ describe "#adapt_to_hash" do
79
+
80
+ subject { person.adapt_to_hash }
81
+
82
+ it { should eq adapted }
83
+ end
84
+
85
+ context "when some values are optional" do
86
+ let(:person) { SomePerson.new }
87
+
88
+ it { should eq({ "full_name" => "John" }) }
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,5 @@
1
+ require 'rspec'
2
+ require 'lib/adaptive'
3
+ require 'simplecov'
4
+
5
+ SimpleCov.start
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adaptive
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Radek Molenda
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: optional
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Developed at On The Beach Ltd. Contact radek.molenda@onthebeach.co.uk
56
+ email:
57
+ - radek.molenda@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .rspec
64
+ - .ruby-version
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - adaptive.gemspec
68
+ - lib/adaptive.rb
69
+ - lib/adaptive/hash.rb
70
+ - spec/lib/adaptive_spec.rb
71
+ - spec/spec_helper.rb
72
+ homepage: http://github.com/onthebeach/adaptive
73
+ licenses: []
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project:
91
+ rubygems_version: 2.0.3
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Simple adapting utilty
95
+ test_files:
96
+ - spec/lib/adaptive_spec.rb
97
+ - spec/spec_helper.rb