immutable_struct_ex 0.1.1 → 0.2.3

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: d9a93f45b29cdb392b541307fc4d6cf8299cb94b2c70611c65d5837d006be43c
4
- data.tar.gz: 7e9239039e3226bd00ca971716b7470d620d11dc1997182cbe8c388af7b36a47
3
+ metadata.gz: 1a0a34457a9487fc3f303f5605d59b4b16e31621f7d3a3fdeb6ea3c2cb3df0bb
4
+ data.tar.gz: d7e39e8460fac3985e54929ef0ceda6dba990468daaceb666094149a784fbd06
5
5
  SHA512:
6
- metadata.gz: 51ad57864c9b892f7c5327bfba585f5e511b5eeb7dd1b707b5a284fa31b3f3b06c5ef14f808adb7e6d1df0ab372e1ca117843eefc9ec6dcd02265e34c7b08574
7
- data.tar.gz: caa878e4c999c39efd6f55e605518c92e330aa9f9a407cfaea4c9f33196feb4df29224784433623a70c701280409491ce8182cb2cb97a135a2c6117f94886650
6
+ metadata.gz: 9d2058c398d2083f608ad57b1b54f9c4a0379a95645a36479bdb02007ef0acfe0560d58576c47bc754dad21830876f027329f163f1326dd3139700967c8aaa0d
7
+ data.tar.gz: c222c628b6b35c8ef5598c644460246b4f015e754bf5d65cdc3b3dc045e56a0a4fcf0efc5224f2c626ea0d8c41c65eefcde462f35b179ecd4954581f4dc28c3d
data/.gitignore CHANGED
@@ -13,6 +13,7 @@
13
13
  # rspec failure tracking
14
14
  .rspec_status
15
15
 
16
+ /.vscode/
16
17
  *.code-workspace
17
18
 
18
19
  scratch.rb
data/CHANGELOG.md CHANGED
@@ -1,6 +1,24 @@
1
+ ### 0.2.3
2
+ * Bug fix
3
+ * Fix bug in specs that failed to add criteria for passing tests (e.g. ".to eq true/false") so tests could not fail.
4
+
5
+ ### 0.2.2
6
+ * Changes
7
+ * Restructure modules under lib/immutable_structure_ex folder.
8
+ * Make codez to create struct a little cleaner/tighter.
9
+ * Ignore .vscode folder in .gitignore file.
10
+ * Update gems and especially rake gem version to squash CVE-2020-8130, see https://github.com/advisories/GHSA-jppv-gw3r-w3q8.
11
+ * Fix rubocop violations.
12
+
13
+ ### 0.2.1
14
+ * Enhancements
15
+ * General refactors/cleanup.
16
+ * Added Immutable module; when extended on a struct, makes it immutable.
17
+ * Added Comparable module; when extended on a struct, makes it comparable to other structs and hashes.
18
+
1
19
  ### 0.1.1
2
20
  * Enhancements
3
- * Added this CHANGELOG.md
21
+ * Added this CHANGELOG.md.
4
22
  * Bug fix
5
23
  * Equality method #== did not work when comparing objects whose underlying hashes were equal.
6
24
  * Added #== method to compare underlying hashes by calling a.to_h == b.to_h.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- immutable_struct_ex (0.1.1)
4
+ immutable_struct_ex (0.2.3)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -11,6 +11,7 @@ GEM
11
11
  coderay (1.1.3)
12
12
  diff-lcs (1.5.0)
13
13
  docile (1.4.0)
14
+ json (2.6.2)
14
15
  kwalify (0.7.2)
15
16
  method_source (1.0.0)
16
17
  parallel (1.22.1)
@@ -23,7 +24,7 @@ GEM
23
24
  byebug (~> 11.0)
24
25
  pry (~> 0.13.0)
25
26
  rainbow (3.1.1)
26
- rake (10.5.0)
27
+ rake (13.0.6)
27
28
  reek (6.1.1)
28
29
  kwalify (~> 0.7.0)
29
30
  parser (~> 3.1.0)
@@ -43,13 +44,14 @@ GEM
43
44
  diff-lcs (>= 1.2.0, < 2.0)
44
45
  rspec-support (~> 3.11.0)
45
46
  rspec-support (3.11.0)
46
- rubocop (1.9.1)
47
+ rubocop (1.35.0)
48
+ json (~> 2.3)
47
49
  parallel (~> 1.10)
48
- parser (>= 3.0.0.0)
50
+ parser (>= 3.1.2.1)
49
51
  rainbow (>= 2.2.2, < 4.0)
50
52
  regexp_parser (>= 1.8, < 3.0)
51
- rexml
52
- rubocop-ast (>= 1.2.0, < 2.0)
53
+ rexml (>= 3.2.5, < 4.0)
54
+ rubocop-ast (>= 1.20.1, < 2.0)
53
55
  ruby-progressbar (~> 1.7)
54
56
  unicode-display_width (>= 1.4.0, < 3.0)
55
57
  rubocop-ast (1.21.0)
@@ -57,9 +59,8 @@ GEM
57
59
  rubocop-performance (1.14.3)
58
60
  rubocop (>= 1.7.0, < 2.0)
59
61
  rubocop-ast (>= 0.4.0)
60
- rubocop-rspec (2.4.0)
61
- rubocop (~> 1.0)
62
- rubocop-ast (>= 1.1.0)
62
+ rubocop-rspec (2.12.1)
63
+ rubocop (~> 1.31)
63
64
  ruby-progressbar (1.11.0)
64
65
  simplecov (0.21.2)
65
66
  docile (~> 1.1)
@@ -73,15 +74,15 @@ PLATFORMS
73
74
  x86_64-darwin-19
74
75
 
75
76
  DEPENDENCIES
76
- bundler (~> 2.3.0)
77
+ bundler (~> 2.2, >= 2.2.17)
77
78
  immutable_struct_ex!
78
79
  pry-byebug (~> 3.9)
79
- rake (~> 10.0)
80
- reek (~> 6.0, >= 6.0.4)
81
- rspec (~> 3.0)
82
- rubocop (~> 1.9.1)
83
- rubocop-performance (~> 1.11, >= 1.11.3)
84
- rubocop-rspec (~> 2.3)
80
+ rake (~> 13.0, >= 13.0.6)
81
+ reek (~> 6.1, >= 6.1.1)
82
+ rspec (>= 3.10)
83
+ rubocop (~> 1.35)
84
+ rubocop-performance (~> 1.14, >= 1.14.3)
85
+ rubocop-rspec (~> 2.12, >= 2.12.1)
85
86
  simplecov (~> 0.21.2)
86
87
 
87
88
  BUNDLED WITH
data/README.md CHANGED
@@ -1,3 +1,13 @@
1
+ [![GitHub version](http://badge.fury.io/gh/gangelo%2Fimmutable_struct_ex.svg)](https://badge.fury.io/gh/gangelo%2Fimmutable_struct_ex)
2
+ [![Gem Version](https://badge.fury.io/rb/immutable_struct_ex.svg)](https://badge.fury.io/rb/immutable_struct_ex)
3
+
4
+ [![](http://ruby-gem-downloads-badge.herokuapp.com/immutable_struct_ex?type=total)](http://www.rubydoc.info/gems/immutable_struct_ex/)
5
+ [![Documentation](http://img.shields.io/badge/docs-rdoc.info-blue.svg)](http://www.rubydoc.info/gems/immutable_struct_ex/)
6
+
7
+ [![Report Issues](https://img.shields.io/badge/report-issues-red.svg)](https://github.com/gangelo/immutable_struct_ex/issues)
8
+
9
+ [![License](http://img.shields.io/badge/license-MIT-yellowgreen.svg)](#license)
10
+
1
11
  # ImmutableStructEx
2
12
 
3
13
  _ImmutableStructEx_ is yet another immutable struct. What makes ImmutableStructEx different, is that it allows you to create immutable structs in one step _by default_. In other words, other immutable struct gems force you to first define the struct, then instantiate the struct object; or, define the struct and instantiate the struct object via chaining. For example:
@@ -19,13 +29,13 @@ ImmutableStructEx allows you do this in one step:
19
29
 
20
30
  ```ruby
21
31
  immutable_struct_ex = ImmutableStructEx.new(first: 'John', last: 'Doe', phone: '(201) 230-7281')
22
- immutable_struct_ex.first
32
+ immutable_struct_ex.first
23
33
  #=> 'John'
24
34
  immutable_struct_ex[:first]
25
35
  #=> 'John'
26
- immutable_struct_ex.last
36
+ immutable_struct_ex.last
27
37
  #=> 'Doe'
28
- immutable_struct_ex.phone
38
+ immutable_struct_ex.phone
29
39
  #=> '(201) 230-7281'
30
40
  ```
31
41
  ### Immutable
@@ -50,6 +60,39 @@ immutable_struct_ex.john?
50
60
  #=> true
51
61
  ```
52
62
 
63
+ ### Other Examples
64
+ ```ruby
65
+ # Redactable, immutable struct
66
+ user = { username: 'jdoe', password: 'p@55w0rD', ssn: '123-70-9182' }
67
+ immutable_struct_ex = ImmutableStructEx.new(**user) do
68
+ REDACT = %i(password ssn).freeze
69
+
70
+ def inspect
71
+ to_s
72
+ end
73
+
74
+ def to_s
75
+ super.to_s.tap do |string|
76
+ REDACT.each do |redact|
77
+ string.gsub!(/( #{Regexp.quote(redact.to_s)}=")(.*?)(")/, '\1[REDACTED]\3')
78
+ end
79
+ end
80
+ end
81
+
82
+ def to_h
83
+ super.to_h.tap do |hash|
84
+ REDACT.each { |redact| hash[redact] = '[REDACTED]' }
85
+ end
86
+ end
87
+ end
88
+
89
+ immutable_struct_ex.inspect
90
+ #=> "#<struct username=\"jdoe\", password=\"[REDACTED]\", ssn=\"[REDACTED]\">"
91
+
92
+ immutable_struct_ex.to_h
93
+ #=> {:username=>"jdoe", :password=>"[REDACTED]", :ssn=>"[REDACTED]"}
94
+ ```
95
+
53
96
  ## Installation
54
97
 
55
98
  Add this line to your application's Gemfile:
data/bin/console CHANGED
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'bundler/setup'
5
+ require 'pry'
5
6
  require 'immutable_struct_ex'
6
7
 
7
8
  # You can add fixtures and/or initialization code here to make experimenting
@@ -32,16 +32,13 @@ Gem::Specification.new do |spec|
32
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
33
  spec.require_paths = ['lib']
34
34
 
35
+ spec.add_development_dependency 'bundler', '~> 2.2', '>= 2.2.17'
35
36
  spec.add_development_dependency 'pry-byebug', '~> 3.9'
36
- spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.4'
37
- # This verson of rubocop is returning errors.
38
- # spec.add_development_dependency 'rubocop', '~> 1.14'
39
- spec.add_development_dependency 'rubocop', '~> 1.9.1'
40
- spec.add_development_dependency 'rubocop-performance', '~> 1.11', '>= 1.11.3'
41
- spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
37
+ spec.add_development_dependency 'reek', '~> 6.1', '>= 6.1.1'
38
+ spec.add_development_dependency 'rspec', '>= 3.10'
39
+ spec.add_development_dependency 'rubocop', '~> 1.35'
40
+ spec.add_development_dependency 'rubocop-performance', '~> 1.14', '>= 1.14.3'
41
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.12', '>= 2.12.1'
42
42
  spec.add_development_dependency 'simplecov', '~> 0.21.2'
43
-
44
- spec.add_development_dependency 'bundler', '~> 2.3.0'
45
- spec.add_development_dependency 'rake', '~> 10.0'
46
- spec.add_development_dependency 'rspec', '~> 3.0'
43
+ spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
47
44
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ImmutableStructEx
4
+ # Makes a struct comparable with another struct or hash when extended.
5
+ module Comparable
6
+ class << self
7
+ def extended(struct)
8
+ struct.instance_eval do
9
+ def ==(other)
10
+ return false unless other.is_a?(Hash) || other.is_a?(Struct)
11
+
12
+ to_h == other.to_h
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ImmutableStructEx
4
+ # Makes a struct immutable when extended.
5
+ module Immutable
6
+ class << self
7
+ def extended(struct)
8
+ [:[], *struct.members].each do |method|
9
+ struct.instance_eval do
10
+ undef :"#{method}="
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ImmutableStructEx
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.3'
5
5
  end
@@ -1,34 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'immutable_struct_ex/version'
4
+ require 'immutable_struct_ex/comparable'
5
+ require 'immutable_struct_ex/immutable'
4
6
 
5
7
  # Defines the methods used to create/manage the ImmutableStructEx struct.
6
8
  module ImmutableStructEx
7
9
  class << self
8
10
  def new(**hash, &block)
9
- options_struct = Struct.new(*hash.keys, keyword_init: true, &block)
10
- options_struct.new(**hash).tap do |struct|
11
- [:[], *struct.members].each do |method|
12
- evaluate(struct) do
13
- <<~RUBY
14
- undef :"#{method}="
15
- RUBY
16
- end
17
- end
18
- evaluate(struct) do
19
- <<~RUBY
20
- def ==(object)
21
- return false unless object.respond_to? :to_h
22
-
23
- to_h == object.to_h
24
- end
25
- RUBY
11
+ Struct.new(*hash.keys, keyword_init: true, &block).tap do |struct|
12
+ return struct.new(**hash).tap do |struct_object|
13
+ struct_object.extend Comparable
14
+ struct_object.extend Immutable
26
15
  end
27
16
  end
28
17
  end
29
-
30
- def evaluate(struct)
31
- struct.instance_eval yield
32
- end
33
18
  end
34
19
  end
metadata CHANGED
@@ -1,153 +1,171 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: immutable_struct_ex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gene M. Angelo, Jr.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-12 00:00:00.000000000 Z
11
+ date: 2022-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: pry-byebug
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.9'
19
+ version: '2.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.2.17
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: '3.9'
29
+ version: '2.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.2.17
27
33
  - !ruby/object:Gem::Dependency
28
- name: reek
34
+ name: pry-byebug
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '6.0'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 6.0.4
39
+ version: '3.9'
37
40
  type: :development
38
41
  prerelease: false
39
42
  version_requirements: !ruby/object:Gem::Requirement
40
43
  requirements:
41
44
  - - "~>"
42
45
  - !ruby/object:Gem::Version
43
- version: '6.0'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 6.0.4
46
+ version: '3.9'
47
47
  - !ruby/object:Gem::Dependency
48
- name: rubocop
48
+ name: reek
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 1.9.1
53
+ version: '6.1'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 6.1.1
54
57
  type: :development
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - "~>"
59
62
  - !ruby/object:Gem::Version
60
- version: 1.9.1
63
+ version: '6.1'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 6.1.1
61
67
  - !ruby/object:Gem::Dependency
62
- name: rubocop-performance
68
+ name: rspec
63
69
  requirement: !ruby/object:Gem::Requirement
64
70
  requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '1.11'
68
71
  - - ">="
69
72
  - !ruby/object:Gem::Version
70
- version: 1.11.3
73
+ version: '3.10'
71
74
  type: :development
72
75
  prerelease: false
73
76
  version_requirements: !ruby/object:Gem::Requirement
74
77
  requirements:
75
- - - "~>"
76
- - !ruby/object:Gem::Version
77
- version: '1.11'
78
78
  - - ">="
79
79
  - !ruby/object:Gem::Version
80
- version: 1.11.3
80
+ version: '3.10'
81
81
  - !ruby/object:Gem::Dependency
82
- name: rubocop-rspec
82
+ name: rubocop
83
83
  requirement: !ruby/object:Gem::Requirement
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: '2.3'
87
+ version: '1.35'
88
88
  type: :development
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '2.3'
94
+ version: '1.35'
95
95
  - !ruby/object:Gem::Dependency
96
- name: simplecov
96
+ name: rubocop-performance
97
97
  requirement: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - "~>"
100
100
  - !ruby/object:Gem::Version
101
- version: 0.21.2
101
+ version: '1.14'
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 1.14.3
102
105
  type: :development
103
106
  prerelease: false
104
107
  version_requirements: !ruby/object:Gem::Requirement
105
108
  requirements:
106
109
  - - "~>"
107
110
  - !ruby/object:Gem::Version
108
- version: 0.21.2
111
+ version: '1.14'
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: 1.14.3
109
115
  - !ruby/object:Gem::Dependency
110
- name: bundler
116
+ name: rubocop-rspec
111
117
  requirement: !ruby/object:Gem::Requirement
112
118
  requirements:
113
119
  - - "~>"
114
120
  - !ruby/object:Gem::Version
115
- version: 2.3.0
121
+ version: '2.12'
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 2.12.1
116
125
  type: :development
117
126
  prerelease: false
118
127
  version_requirements: !ruby/object:Gem::Requirement
119
128
  requirements:
120
129
  - - "~>"
121
130
  - !ruby/object:Gem::Version
122
- version: 2.3.0
131
+ version: '2.12'
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 2.12.1
123
135
  - !ruby/object:Gem::Dependency
124
- name: rake
136
+ name: simplecov
125
137
  requirement: !ruby/object:Gem::Requirement
126
138
  requirements:
127
139
  - - "~>"
128
140
  - !ruby/object:Gem::Version
129
- version: '10.0'
141
+ version: 0.21.2
130
142
  type: :development
131
143
  prerelease: false
132
144
  version_requirements: !ruby/object:Gem::Requirement
133
145
  requirements:
134
146
  - - "~>"
135
147
  - !ruby/object:Gem::Version
136
- version: '10.0'
148
+ version: 0.21.2
137
149
  - !ruby/object:Gem::Dependency
138
- name: rspec
150
+ name: rake
139
151
  requirement: !ruby/object:Gem::Requirement
140
152
  requirements:
141
153
  - - "~>"
142
154
  - !ruby/object:Gem::Version
143
- version: '3.0'
155
+ version: '13.0'
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 13.0.6
144
159
  type: :development
145
160
  prerelease: false
146
161
  version_requirements: !ruby/object:Gem::Requirement
147
162
  requirements:
148
163
  - - "~>"
149
164
  - !ruby/object:Gem::Version
150
- version: '3.0'
165
+ version: '13.0'
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 13.0.6
151
169
  description: Creates an immutable struct in one step.
152
170
  email:
153
171
  - public.gma@gmail.com
@@ -172,6 +190,8 @@ files:
172
190
  - bin/setup
173
191
  - immutable_struct_ex.gemspec
174
192
  - lib/immutable_struct_ex.rb
193
+ - lib/immutable_struct_ex/comparable.rb
194
+ - lib/immutable_struct_ex/immutable.rb
175
195
  - lib/immutable_struct_ex/version.rb
176
196
  homepage: https://github.com/gangelo/immutable_struct_ex
177
197
  licenses: