o_patch 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- N2EzZDY2NDZjYWM5NTFmMzA1OWVjNmE0MmU4YTE3NzQzZmZiNzA2YQ==
5
- data.tar.gz: !binary |-
6
- MTBmOTIzNmQ0NjhlMzcyY2I4ZGI2NWM1MjE4YThkYTM4ZTc1NTk2MA==
2
+ SHA1:
3
+ metadata.gz: 2acac7437a2fda4c9d014ce2aea3f2c6ee7fd927
4
+ data.tar.gz: 33f410f04aae3cc1ad121c814309d13b380fde43
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZDFmM2Q2OTJkZTgzNTFiNTM1ZmMzZTFlMTQ3ZGNhYTFkZWIxOGQ1NDQ1YmIy
10
- NTRhMDY0NjliYTI1MzgxZDk4NjNhMzQ1MzI3NzFiYjRiMzU5ZDk4MTc5MDU0
11
- ODFkMjI5MmVjMWMxZGZlODMxODVjOWU0ZTE4OWQyN2VjNDE0NmE=
12
- data.tar.gz: !binary |-
13
- NGRmYTFiZDEyYWVkN2E0ZDlkYTEwMTdkZmNlYTkxYWM2ZDZkZWExZTVmODVk
14
- YjllZTI3YzY5NTYxMzU5Nzk4ZTBjNzQ3MmNiMjcyYzAxZDkyZTBlY2JhMWQ5
15
- NTIxYmU2NjBkNzQ1MWMzZjQ5ZmZlNWY4ZTFkMDg1NjYxMzI2MTk=
6
+ metadata.gz: 89e83a940dcad0c3b670ba7b7d80033ab3a0495d8d871c282d6669bf46c4719db26031961e6d8548265ad2c557085998d1014147981040253ba776268fba38d2
7
+ data.tar.gz: 1856749f67be4da20d40aa9e3f014964d46c20faed70273e053bf59fd36dfda7c2eee54f4f52a2a4a8b6073471e383183109727d5157fb038e06facca597c030
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  /.bundle
2
2
  /vendor/bundle
3
3
  .DS_Store
4
+ /pkg
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - 2.0.0
3
+ script: "bundle exec rspec spec/"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- o_patch (0.0.1)
4
+ o_patch (0.0.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,4 +1,89 @@
1
- opatch
2
- ======
1
+ # OPatch [![Build Status](https://travis-ci.org/AlbertGazizov/opatch.png)](https://travis-ci.org/AlbertGazizov/opatch) [![Code Climate](https://codeclimate.com/github/AlbertGazizov/opatch.png)](https://codeclimate.com/github/AlbertGazizov/opatch)
2
+
3
+
4
+
5
+ OPatch is ruby objects patcher in declarative way. By providing simple DSL it allows you write complex patch logic with ease
6
+
7
+ ## Usage
8
+ Let's say you have the folowing plain ruby classes:
9
+ ```ruby
10
+ class Person
11
+ attr_accessor :name, :address
12
+
13
+ def initialize(name:, address: nil)
14
+ @name = name
15
+ @address = address
16
+ end
17
+ end
18
+
19
+ class Address
20
+ attr_accessor :city, :country
21
+
22
+ def initialize(city:, country:)
23
+ @city = city
24
+ @country = country
25
+ end
26
+ end
27
+ ```
28
+ And you have the following instance of the Person class:
29
+ ```ruby
30
+ person = Person.new(name: "John Smith", address: Address.new(city: "Kazan", country: "Russia"))
31
+ ```
32
+ Now you want to update person's name and address fields, let's use OPatch for that.
33
+ You need to call OPatch with attributes you want to update:
34
+ ```ruby
35
+ new_attributes = { name: "Jim White", address: { country: "USA", city: "New York" } }
36
+ OPatch.patch(person, new_attributes) do
37
+ field :name
38
+ object :address do
39
+ field :country
40
+ field :city
41
+ end
42
+ end
43
+ ```
44
+ That's all! Now you have the person updated:
45
+ ```ruby
46
+ => #<Person:0x007f8bc42487c0 @name="Jim White", @address=#<Address:0x007f8bc4248838 @city="New York", @country="USA">>
47
+ ```
48
+
49
+ ### Creating nested objects
50
+ Opatch allows you to build nested objects if you specify build block.
51
+ Lets see how it works if we want to build address when it wasn't created initialilly:
52
+ ```ruby
53
+ person = Person.new(name: "John Smith")
54
+ => #<Person:0x007f8bc40239e0 @name="John Smith", @address=nil>
55
+ ```
56
+ ```ruby
57
+ new_attributes = { address: { country: "USA", city: "New York" } }
58
+ OPatch.patch(person, new_attributes) do
59
+ field :name
60
+ object :address, build: proc { |person, attributes| person.address = Address.new(attributes) } do
61
+ field :country
62
+ field :city
63
+ end
64
+ end
65
+ ```
66
+ ```ruby
67
+ => #<Person:0x007f8bc4130590 @name="John Smith", @address=#<Address:0x007f8bc4049a28 @city="New York", @country="USA">>
68
+ ```
69
+
70
+
71
+ ### Deleting nested objects
72
+ If you provide nil for the nested object the object will be removed:
73
+ ```ruby
74
+ person = Person.new(name: "John Smith", address: Address.new(city: "Kazan", country: "Russia"))
75
+
76
+ OPatch.patch(person, name: 'Vasya', address: nil) do
77
+ field :name
78
+ object :address do
79
+ field :country
80
+ field :city
81
+ end
82
+ end
83
+
84
+ => #<Person:0x007f8bc400a850 @name="Vasya", @address=nil>
85
+ ```
86
+
87
+ ### Author
88
+ Albert Gazizov, [@deeper4k](https://twitter.com/deeper4k)
3
89
 
4
- Declarative ruby objects patcher
@@ -56,12 +56,12 @@ class OPatch::Patcher
56
56
  attributes[collection_name].each do |child_attributes|
57
57
  key_value = attributes_key_value(child_attributes, key)
58
58
  if key_value
59
- child_object = collection_hash[key_value].first
59
+ child_object = (collection_hash[key_value] || []).first
60
60
  raise "#{collection_name} don't have an object with key: #{key_value}" unless child_object
61
61
  if child_attributes[:_destroy]
62
62
  collection.delete(child_object)
63
63
  else
64
- self.class.patch(child_object, child_attributes, &block)
64
+ self.class.patch(child_object, child_attributes, &block) if block_given?
65
65
  end
66
66
  else
67
67
  build_block.call(entity, child_attributes)
data/o_patch.gemspec CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "o_patch"
6
- spec.version = "0.0.1"
6
+ spec.version = "0.0.2"
7
7
  spec.authors = ["Albert Gazizov"]
8
8
  spec.description = %q{Declarative ruby objects patcher}
9
9
  spec.summary = %q{Declarative ruby objects patcher}
metadata CHANGED
@@ -1,50 +1,51 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: o_patch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Albert Gazizov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-28 00:00:00.000000000 Z
11
+ date: 2015-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- type: :development
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
- name: bundler
20
+ type: :development
21
+ prerelease: false
21
22
  version_requirements: !ruby/object:Gem::Requirement
22
23
  requirements:
23
- - - ~>
24
+ - - "~>"
24
25
  - !ruby/object:Gem::Version
25
26
  version: '1.3'
26
- prerelease: false
27
27
  - !ruby/object:Gem::Dependency
28
- type: :development
28
+ name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
- name: rake
34
+ type: :development
35
+ prerelease: false
35
36
  version_requirements: !ruby/object:Gem::Requirement
36
37
  requirements:
37
- - - ! '>='
38
+ - - ">="
38
39
  - !ruby/object:Gem::Version
39
40
  version: '0'
40
- prerelease: false
41
41
  description: Declarative ruby objects patcher
42
42
  email:
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
- - .gitignore
47
+ - ".gitignore"
48
+ - ".travis.yml"
48
49
  - Gemfile
49
50
  - Gemfile.lock
50
51
  - LICENSE
@@ -64,17 +65,17 @@ require_paths:
64
65
  - lib
65
66
  required_ruby_version: !ruby/object:Gem::Requirement
66
67
  requirements:
67
- - - ! '>='
68
+ - - ">="
68
69
  - !ruby/object:Gem::Version
69
70
  version: '0'
70
71
  required_rubygems_version: !ruby/object:Gem::Requirement
71
72
  requirements:
72
- - - ! '>='
73
+ - - ">="
73
74
  - !ruby/object:Gem::Version
74
75
  version: '0'
75
76
  requirements: []
76
77
  rubyforge_project:
77
- rubygems_version: 2.4.1
78
+ rubygems_version: 2.2.2
78
79
  signing_key:
79
80
  specification_version: 4
80
81
  summary: Declarative ruby objects patcher