immutable_struct_ex 0.1.1 → 0.2.1

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: 0ffcdbe2613240712bb17679f5399a1caa3253c264cf0c9c10a678a4caa4a3f7
4
+ data.tar.gz: 29ff8adba1c95169aa7552fb0f4eff84345c5f602ef2f9f1f79d1e2323bc2e37
5
5
  SHA512:
6
- metadata.gz: 51ad57864c9b892f7c5327bfba585f5e511b5eeb7dd1b707b5a284fa31b3f3b06c5ef14f808adb7e6d1df0ab372e1ca117843eefc9ec6dcd02265e34c7b08574
7
- data.tar.gz: caa878e4c999c39efd6f55e605518c92e330aa9f9a407cfaea4c9f33196feb4df29224784433623a70c701280409491ce8182cb2cb97a135a2c6117f94886650
6
+ metadata.gz: be076b0ffa994a1ad8a5b351017cf4e7b1f82d2b67dc1b582d80cc96e2c2465ae1c381a957b8868751de2699ba5f9eec60336dc9b9d5f679061d7189ef2335fd
7
+ data.tar.gz: 19bbbbd8d226a8808546e89897060166bd7c74a8fa10a40ce1e1f0289a08e9b0b72fa99830f473d918ccb872446f782a014f86124cb9fc8f32487f13a56e87e3
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 0.2.1
2
+ * Enhancements
3
+ * General refactors/cleanup
4
+ * Added Immutable module; when extended on a struct, makes it immutable.
5
+ * Added Comparable module; when extended on a struct, makes it comparable to other structs and hashes.
6
+
1
7
  ### 0.1.1
2
8
  * Enhancements
3
9
  * Added this CHANGELOG.md
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.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
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
data/lib/comparable.rb ADDED
@@ -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
data/lib/immutable.rb ADDED
@@ -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.1'
5
5
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'immutable_struct_ex/version'
4
+ require 'comparable'
5
+ require 'immutable'
4
6
 
5
7
  # Defines the methods used to create/manage the ImmutableStructEx struct.
6
8
  module ImmutableStructEx
@@ -8,27 +10,9 @@ module ImmutableStructEx
8
10
  def new(**hash, &block)
9
11
  options_struct = Struct.new(*hash.keys, keyword_init: true, &block)
10
12
  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
26
- end
13
+ struct.extend Comparable
14
+ struct.extend Immutable
27
15
  end
28
16
  end
29
-
30
- def evaluate(struct)
31
- struct.instance_eval yield
32
- end
33
17
  end
34
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
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.1
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-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry-byebug
@@ -171,6 +171,8 @@ files:
171
171
  - bin/console
172
172
  - bin/setup
173
173
  - immutable_struct_ex.gemspec
174
+ - lib/comparable.rb
175
+ - lib/immutable.rb
174
176
  - lib/immutable_struct_ex.rb
175
177
  - lib/immutable_struct_ex/version.rb
176
178
  homepage: https://github.com/gangelo/immutable_struct_ex