openhash 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5c30dafd59bad88a02579854f2120de84429227a4af28971ed57e011247cd8d
4
- data.tar.gz: 48f1a789215c4869d3aabb0898f1e89078caed467fde027b25da303d69a46c51
3
+ metadata.gz: 67d8084ef667ae484317c9be75e958b00aeed1cc2e8b154fe94c4838368ef5a9
4
+ data.tar.gz: 8309b6ca1c44e37df79ab49e1604795c8af519541e0890aab3cbf44082d6bf32
5
5
  SHA512:
6
- metadata.gz: 857cd4505010c425def7893aceaba8deb5c00ce1374d7ececd501485b4a12b73e63f6e03a57c1adada4e294df45130dd9470ed11a8320fd209dba409a92e41ef
7
- data.tar.gz: 29c6c529385da83d5dd8c6dea6d78f8722b647d4cecc4607a9ccf7801c255d5cb758d07154cbdaec205a049b9de8605c50c436454d9c607fc8b8098cafb78271
6
+ metadata.gz: 9516725c185c703941a947e6a57cb26bee9179d09c4f141ad6fd15d0c0d70d4ff67570978f3826ccb518ca25a70039012afe3037af137fd58b0f263d0c5e8a75
7
+ data.tar.gz: 6b5a97958ad18f0494b7f33f21263903781f3c352388113578b25e6476d18925e868984274e2140200d075ec36ff9fa60d25ca8536c864c8c6482b7d6fa01bca
@@ -7,7 +7,7 @@ GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  diff-lcs (1.3)
10
- rake (10.5.0)
10
+ rake (12.3.3)
11
11
  rspec (3.8.0)
12
12
  rspec-core (~> 3.8.0)
13
13
  rspec-expectations (~> 3.8.0)
@@ -28,8 +28,8 @@ PLATFORMS
28
28
  DEPENDENCIES
29
29
  bundler (~> 2.0)
30
30
  openhash!
31
- rake (~> 10.0)
31
+ rake (~> 12.3)
32
32
  rspec (~> 3.0)
33
33
 
34
34
  BUNDLED WITH
35
- 2.0.1
35
+ 2.0.2
data/README.md CHANGED
@@ -11,15 +11,50 @@
11
11
 
12
12
  ### Usage ###
13
13
  ```ruby
14
- # person = OpenHash.new(name: "John", hometown: { city: "London" })
15
- # person.name #=> "John"
16
- # person.hometown.city #=> "London"
17
- #
18
- # person = OpenHash.new
19
- # person.name = "Lion"
20
- # person.hometown.city = "Paris"
21
- # person.parents.father.name = "Heron"
22
- # person #=> { name: "Lion", hometown: { city: "Paris" }, parents: { father: { name: "Heron" } } }
14
+ person = OpenHash.new(name: "John", hometown: { city: "London" }, pets: [{ name: "Mia", animal: "Cat" }])
15
+ person.name #=> "John"
16
+ person.hometown.city #=> "London"
17
+ person.pets[0].name #=> "Mia"
18
+
19
+ person = OpenHash.new
20
+ person.name = "Lion"
21
+ person.hometown.city = "Paris"
22
+ person.parents.father.name = "Heron"
23
+ person #=> { name: "Lion", hometown: { city: "Paris" }, parents: { father: { name: "Heron" } } }
23
24
  ```
25
+
26
+ ### Known Issue ###
27
+
28
+ Since Ruby doesn't support to override logic oprators,
29
+ so please pay attention to use oprators below when you are using `OpenHash`:
30
+
31
+ - `&&`, `and`
32
+ - `||`, `or`
33
+ - `&.`
34
+
35
+ The most recommend way once you have to do some logic checking:
36
+
37
+ ```ruby
38
+ person = OpenHash.new
39
+
40
+ # Wrong
41
+ city = person.city || "London"
42
+
43
+ # Right
44
+ city = person.city.nil? ? "London" : person.city
45
+
46
+ # Wrong
47
+ state = person.is_succeed && "Success"
48
+
49
+ # Right
50
+ state = "Success" if !person.is_succeed.nil?
51
+
52
+ # Wrong
53
+ person.city&.upcase
54
+
55
+ # Right
56
+ !person.city.nil? && person.city.upcase
57
+ ```
58
+
24
59
  ### License ###
25
60
  Released under the [MIT](http://opensource.org/licenses/MIT) license. See LICENSE file for details.
@@ -5,9 +5,10 @@ require 'ostruct'
5
5
  # OpenHash lets Hash called and assigned by the key in chainable way.
6
6
  # Example:
7
7
  #
8
- # person = OpenHash.new(name: "John", hometown: { city: "London" })
8
+ # person = OpenHash.new(name: "John", hometown: { city: "London" }, pets: [{ name: "Mia", animal: "Cat" }])
9
9
  # person.name #=> "John"
10
10
  # person.hometown.city #=> "London"
11
+ # person.pets[0].name #=> "Mia"
11
12
  #
12
13
  # person = OpenHash.new
13
14
  # person.name = "Lion"
@@ -18,7 +19,14 @@ require 'ostruct'
18
19
  class OpenHash < OpenStruct
19
20
  def initialize(hash = {})
20
21
  hash = hash.each_with_object({}) do |(k, v), r|
21
- r[k] = v.is_a?(Hash) ? OpenHash.new(v) : v
22
+ r[k] = case v
23
+ when Hash, OpenStruct
24
+ OpenHash.new(v)
25
+ when Array
26
+ v.map { |x| OpenHash.new(x) }
27
+ else
28
+ v
29
+ end
22
30
  end
23
31
 
24
32
  super
@@ -32,24 +40,19 @@ class OpenHash < OpenStruct
32
40
 
33
41
  # BlackHole Class
34
42
  class BlackHole < BasicObject
35
- DELEGATE_REGEX = /(.+\?)|(to_.+)|(={2,3})\z/.freeze
36
- @nil_methods = ::NilClass.instance_methods(false).grep(DELEGATE_REGEX)
43
+ NIL_METHODS = ::NilClass.instance_methods(false) | %i[== != ! equal? is_a? kind_of? instance_of?]
37
44
 
38
45
  def initialize(ohash, *args)
39
46
  @ohash = ohash
40
47
  @chain_methods = args
41
48
  end
42
49
 
43
- @nil_methods.each do |method_name|
50
+ NIL_METHODS.each do |method_name|
44
51
  define_method method_name do |*args|
45
52
  nil.send(method_name, *args)
46
53
  end
47
54
  end
48
55
 
49
- def inspect
50
- "nil"
51
- end
52
-
53
56
  # Append a method name to chain methods
54
57
  def <<(method_name)
55
58
  @chain_methods << method_name
@@ -70,6 +73,8 @@ class OpenHash < OpenStruct
70
73
  end
71
74
 
72
75
  last_ohash[$1] = args[0]
76
+ when /\A[^a-z_A-Z]+/
77
+ nil.send(name, *args)
73
78
  else
74
79
  self << name
75
80
  end
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "openhash"
8
- spec.version = '0.0.5'
8
+ spec.version = '0.0.6'
9
9
  spec.authors = ["cenxky"]
10
10
  spec.email = ["cenxky@gmail.com"]
11
11
 
@@ -25,6 +25,6 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ["lib"]
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 2.0"
28
- spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rake", "~> 12.3"
29
29
  spec.add_development_dependency "rspec", "~> 3.0"
30
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - cenxky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-25 00:00:00.000000000 Z
11
+ date: 2020-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '12.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '12.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -91,8 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  - !ruby/object:Gem::Version
92
92
  version: '0'
93
93
  requirements: []
94
- rubyforge_project:
95
- rubygems_version: 2.7.6
94
+ rubygems_version: 3.0.3
96
95
  signing_key:
97
96
  specification_version: 4
98
97
  summary: OpenHash lets Hash called and assigned by the key in chainable way.