immutable_struct_ex 0.1.1 → 0.2.3

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