openhash 0.0.5 → 0.0.6

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 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.