rich_enums 0.1.0 → 0.1.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 +4 -4
- data/.gitignore +4 -0
- data/Gemfile.lock +34 -0
- data/README.md +54 -6
- data/lib/rich_enums/version.rb +1 -1
- data/lib/rich_enums.rb +9 -6
- data/rich_enums.gemspec +7 -3
- metadata +13 -10
- data/.idea/workspace.xml +0 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f6b109c5069cabe1da55839403d6f9efee399e46b5939be951a9604156911d2
|
4
|
+
data.tar.gz: 97582e336b09b8d5d2376bf73bc1b65522b9cd93f60daf17642bba5d9f02196a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1d592ab62bf202968448bcc4833a5b4abddd1b42a919834fcc730216a130fac8294bf997fe772422b1e36e0d9730c95abec7d008fd30f3a763c66356f7e3978
|
7
|
+
data.tar.gz: '049113830f6ab99a5870e7f41125f8544bdcca86cbf6947643059d1e265b957aa27de48d46bd49a8db9cee91d0040cd3777fb71e837dc082cca2ac199481e911'
|
data/.gitignore
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
rich_enums (0.1.3)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.5.0)
|
10
|
+
rake (12.3.3)
|
11
|
+
rspec (3.11.0)
|
12
|
+
rspec-core (~> 3.11.0)
|
13
|
+
rspec-expectations (~> 3.11.0)
|
14
|
+
rspec-mocks (~> 3.11.0)
|
15
|
+
rspec-core (3.11.0)
|
16
|
+
rspec-support (~> 3.11.0)
|
17
|
+
rspec-expectations (3.11.0)
|
18
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
19
|
+
rspec-support (~> 3.11.0)
|
20
|
+
rspec-mocks (3.11.0)
|
21
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
22
|
+
rspec-support (~> 3.11.0)
|
23
|
+
rspec-support (3.11.0)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
rake (~> 12.0)
|
30
|
+
rich_enums!
|
31
|
+
rspec (~> 3.0)
|
32
|
+
|
33
|
+
BUNDLED WITH
|
34
|
+
2.4.15
|
data/README.md
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
# RichEnums
|
2
2
|
|
3
|
-
|
3
|
+
With Enums we are able to map a label to a value on the database.
|
4
|
+
Use Rich Enum if you need to maintain an additional mapping at the point of enum definition,
|
5
|
+
for e.g. for presentation purposes or for mapping to a different value on a different system.
|
4
6
|
|
5
|
-
|
7
|
+
e.g. rich enum definition
|
8
|
+
```ruby
|
9
|
+
class User < ApplicationRecord
|
10
|
+
# enum role: { admin: 1, user: 2 } # default enum definition
|
11
|
+
rich_enum role: { admin: [1, 'ROLE001'], user: [2, 'ROLE101'] }, alt: 'code'
|
12
|
+
end
|
13
|
+
|
14
|
+
user = User.new(role: :admin)
|
15
|
+
user.role # => 'admin'
|
16
|
+
user.role_code # => 'ROLE001'
|
17
|
+
user.role_for_database # => 1
|
18
|
+
User.roles # => {"admin"=>1, "user"=>2}
|
19
|
+
User.role_codes # => {"admin"=>"ROLE001", "user"=>"ROLE101"}
|
20
|
+
|
21
|
+
```
|
6
22
|
|
7
23
|
## Installation
|
8
24
|
|
@@ -16,13 +32,45 @@ And then execute:
|
|
16
32
|
|
17
33
|
$ bundle install
|
18
34
|
|
19
|
-
Or
|
35
|
+
Or simply run
|
36
|
+
|
37
|
+
$ bundle add rich_enums
|
38
|
+
to add to Gemfile and run bundle install in one go.
|
20
39
|
|
21
|
-
$ gem install rich_enums
|
22
40
|
|
23
41
|
## Usage
|
42
|
+
As shown in the example above, the rich_enum definition is similar to the default enum definition.
|
43
|
+
It simply augments the enum definition with an additional mapping.
|
44
|
+
|
45
|
+
The additional mapping can be named with the `alt` option. It defaults to 'alt_name' if unspecificed.
|
46
|
+
This comes in handy when you need to map to a different value on a different system.
|
47
|
+
|
48
|
+
1. Using rich_enum to define your enums provides you with an instance method (attribute name with a suffix specified with the alt property - defaults to _alt_name) to access the alternate value from the additional mapping.
|
49
|
+
2. It also provides you with a class method(attribute name with a plural suffix derived from the alt option - defaults to _alt_names) to access the additional mapping.
|
24
50
|
|
25
|
-
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
class User < ApplicationRecord
|
54
|
+
# enum role: { admin: 1, user: 2 } # default enum definition
|
55
|
+
rich_enum role: { admin: [1, 'ROLE001'], user: [2, 'ROLE101'] } # if alt is not specified, it defaults to 'alt_name'
|
56
|
+
end
|
57
|
+
|
58
|
+
user = User.new(role: :admin)
|
59
|
+
user.role # => 'admin'
|
60
|
+
user.role_alt_name # => 'ROLE001'
|
61
|
+
user.role_for_database # => 1
|
62
|
+
User.roles # => {"admin"=>1, "user"=>2}
|
63
|
+
User.role_alt_names # => {"admin"=>"ROLE001", "user"=>"ROLE101"}
|
64
|
+
ExternalSystem.sync(user.external_id, role_code: user.role_alt_name)
|
65
|
+
```
|
66
|
+
Any arguments other than 'alt' are forwarded to the default enum definition.
|
67
|
+
For e.g. in this case _prefix: true is forwarded to the default enum definition.
|
68
|
+
```ruby
|
69
|
+
rich_enum payment_type: {
|
70
|
+
upfront: [10, 'Full payment'],
|
71
|
+
installment: [20, 'Pay in parts'],
|
72
|
+
}, _prefix: true
|
73
|
+
```
|
26
74
|
|
27
75
|
## Development
|
28
76
|
|
@@ -32,7 +80,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
80
|
|
33
81
|
## Contributing
|
34
82
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
83
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/betacraft/rich_enums. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/betacraft/rich_enums/blob/master/CODE_OF_CONDUCT.md).
|
36
84
|
|
37
85
|
|
38
86
|
## License
|
data/lib/rich_enums/version.rb
CHANGED
data/lib/rich_enums.rb
CHANGED
@@ -9,7 +9,7 @@ module RichEnums
|
|
9
9
|
|
10
10
|
module ClassMethods
|
11
11
|
def rich_enum(column_symbol_value_string_options)
|
12
|
-
# rich_enum column1: { symbol1: [value1, string1], ... }, **options
|
12
|
+
# rich_enum column1: { symbol1: [value1, string1], ... }, alt: 'name', **options
|
13
13
|
# will transform to
|
14
14
|
# 1. enum column1: { symbol1: value1, ...}, to define the enums along with any options provided
|
15
15
|
# and
|
@@ -17,7 +17,7 @@ module RichEnums
|
|
17
17
|
# and can be accessed by ClassName.<column>_names which will return a hash like { symbol1: string1, symbol2: string2 ...}
|
18
18
|
# e.g.
|
19
19
|
# class Enrollment
|
20
|
-
# include
|
20
|
+
# include RichEnums
|
21
21
|
# rich_enum learner_payment_path: {
|
22
22
|
# greenfig_online: [10, 'GreenFig Online'],
|
23
23
|
# partner: [20, 'Partner'],
|
@@ -46,6 +46,9 @@ module RichEnums
|
|
46
46
|
# extract the Enum options for the column which may be in standard enum hash format or our custom format
|
47
47
|
symbol_value_string = column_symbol_value_string_options.delete(column)
|
48
48
|
# at this point, only the enum options like _prefix etc. are present in the original argument
|
49
|
+
options = column_symbol_value_string_options
|
50
|
+
# we allow for an option called alt: to allow the users to tag the alternate mapping. Defaults to 'alt_name'
|
51
|
+
alt = options.delete(:alt) || 'alt_name'
|
49
52
|
|
50
53
|
# create two hashes from the provided input - 1 to be used to define the enum and the other for the name map
|
51
54
|
split_hash = symbol_value_string.each_with_object({ for_enum: {}, for_display: {} }) do |(symbol, value_string), obj|
|
@@ -54,16 +57,16 @@ module RichEnums
|
|
54
57
|
end
|
55
58
|
|
56
59
|
# 1. Define the Enum
|
57
|
-
enum "#{column}": split_hash[:for_enum], **
|
60
|
+
enum "#{column}": split_hash[:for_enum], **options
|
58
61
|
|
59
62
|
# 2. Define our custom class method
|
60
63
|
# - the data to be returned by our custom method is available os a class instance variable
|
61
|
-
instance_variable_set("@#{column}
|
64
|
+
instance_variable_set("@#{column}_#{alt.pluralize}", split_hash[:for_display])
|
62
65
|
# - the custom method is just a getter for the class instance variable
|
63
|
-
define_singleton_method("#{column}
|
66
|
+
define_singleton_method("#{column}_#{alt.pluralize}") { instance_variable_get("@#{column}_#{alt.pluralize}") }
|
64
67
|
|
65
68
|
# 3. Define our custom instance method to show the String associated with the enum value
|
66
|
-
define_method("#{column}
|
69
|
+
define_method("#{column}_#{alt}") { self.class.send("#{column}_#{alt.pluralize}")[send(column.to_s)] }
|
67
70
|
end
|
68
71
|
end
|
69
72
|
end
|
data/rich_enums.gemspec
CHANGED
@@ -6,13 +6,17 @@ Gem::Specification.new do |spec|
|
|
6
6
|
spec.authors = %w[harunkumars rtdp]
|
7
7
|
spec.email = %w[harun@betacraft.io rtdp@betacraft.io]
|
8
8
|
|
9
|
-
spec.summary = '
|
10
|
-
|
9
|
+
spec.summary = 'When a simple name to value mapping is not enough'
|
10
|
+
spec.description = <<-DESC
|
11
|
+
With Enums we are able to map a label to a value on the database.
|
12
|
+
Use Rich Enum if you need to maintain an additional mapping at the point of enum definition,
|
13
|
+
for e.g. for presentation purposes or for mapping to a different value on a different system.
|
14
|
+
DESC
|
11
15
|
spec.homepage = 'https://github.com/betacraft/rich_enums'
|
12
16
|
spec.license = 'MIT'
|
13
17
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
14
18
|
|
15
|
-
|
19
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
16
20
|
|
17
21
|
spec.metadata['homepage_uri'] = spec.homepage
|
18
22
|
spec.metadata['source_code_uri'] = 'https://github.com/betacraft/rich_enums'
|
metadata
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rich_enums
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- harunkumars
|
8
8
|
- rtdp
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-07-10 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description:
|
14
|
+
description: "With Enums we are able to map a label to a value on the database. \nUse
|
15
|
+
Rich Enum if you need to maintain an additional mapping at the point of enum definition,
|
16
|
+
\nfor e.g. for presentation purposes or for mapping to a different value on a different
|
17
|
+
system.\n"
|
15
18
|
email:
|
16
19
|
- harun@betacraft.io
|
17
20
|
- rtdp@betacraft.io
|
@@ -20,11 +23,11 @@ extensions: []
|
|
20
23
|
extra_rdoc_files: []
|
21
24
|
files:
|
22
25
|
- ".gitignore"
|
23
|
-
- ".idea/workspace.xml"
|
24
26
|
- ".rspec"
|
25
27
|
- ".travis.yml"
|
26
28
|
- CODE_OF_CONDUCT.md
|
27
29
|
- Gemfile
|
30
|
+
- Gemfile.lock
|
28
31
|
- LICENSE.txt
|
29
32
|
- README.md
|
30
33
|
- Rakefile
|
@@ -37,10 +40,11 @@ homepage: https://github.com/betacraft/rich_enums
|
|
37
40
|
licenses:
|
38
41
|
- MIT
|
39
42
|
metadata:
|
43
|
+
allowed_push_host: https://rubygems.org
|
40
44
|
homepage_uri: https://github.com/betacraft/rich_enums
|
41
45
|
source_code_uri: https://github.com/betacraft/rich_enums
|
42
46
|
changelog_uri: https://github.com/betacraft/rich_enums/README.md
|
43
|
-
post_install_message:
|
47
|
+
post_install_message:
|
44
48
|
rdoc_options: []
|
45
49
|
require_paths:
|
46
50
|
- lib
|
@@ -55,9 +59,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
59
|
- !ruby/object:Gem::Version
|
56
60
|
version: '0'
|
57
61
|
requirements: []
|
58
|
-
rubygems_version: 3.
|
59
|
-
signing_key:
|
62
|
+
rubygems_version: 3.5.0.dev
|
63
|
+
signing_key:
|
60
64
|
specification_version: 4
|
61
|
-
summary:
|
62
|
-
definitions
|
65
|
+
summary: When a simple name to value mapping is not enough
|
63
66
|
test_files: []
|
data/.idea/workspace.xml
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project version="4">
|
3
|
-
<component name="ChangeListManager">
|
4
|
-
<list default="true" id="0dad223b-0d0c-4b56-bf84-a35f47fa0bd2" name="Changes" comment="">
|
5
|
-
<change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
|
6
|
-
<change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
7
|
-
<change afterPath="$PROJECT_DIR$/.rspec" afterDir="false" />
|
8
|
-
<change afterPath="$PROJECT_DIR$/.travis.yml" afterDir="false" />
|
9
|
-
<change afterPath="$PROJECT_DIR$/CODE_OF_CONDUCT.md" afterDir="false" />
|
10
|
-
<change afterPath="$PROJECT_DIR$/Gemfile" afterDir="false" />
|
11
|
-
<change afterPath="$PROJECT_DIR$/LICENSE.txt" afterDir="false" />
|
12
|
-
<change afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
|
13
|
-
<change afterPath="$PROJECT_DIR$/Rakefile" afterDir="false" />
|
14
|
-
<change afterPath="$PROJECT_DIR$/bin/console" afterDir="false" />
|
15
|
-
<change afterPath="$PROJECT_DIR$/bin/setup" afterDir="false" />
|
16
|
-
<change afterPath="$PROJECT_DIR$/lib/rich_enums.rb" afterDir="false" />
|
17
|
-
<change afterPath="$PROJECT_DIR$/lib/rich_enums/version.rb" afterDir="false" />
|
18
|
-
<change afterPath="$PROJECT_DIR$/rich_enums.gemspec" afterDir="false" />
|
19
|
-
<change afterPath="$PROJECT_DIR$/spec/rich_enums_spec.rb" afterDir="false" />
|
20
|
-
<change afterPath="$PROJECT_DIR$/spec/spec_helper.rb" afterDir="false" />
|
21
|
-
</list>
|
22
|
-
<option name="SHOW_DIALOG" value="false" />
|
23
|
-
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
24
|
-
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
25
|
-
<option name="LAST_RESOLUTION" value="IGNORE" />
|
26
|
-
</component>
|
27
|
-
<component name="Git.Settings">
|
28
|
-
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
29
|
-
</component>
|
30
|
-
<component name="MarkdownSettingsMigration">
|
31
|
-
<option name="stateVersion" value="1" />
|
32
|
-
</component>
|
33
|
-
<component name="ProjectId" id="25AxdAyVOo0qOEcwr5Ba2ImunPf" />
|
34
|
-
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
|
35
|
-
<component name="ProjectViewState">
|
36
|
-
<option name="hideEmptyMiddlePackages" value="true" />
|
37
|
-
<option name="showLibraryContents" value="true" />
|
38
|
-
</component>
|
39
|
-
<component name="PropertiesComponent">
|
40
|
-
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
|
41
|
-
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
|
42
|
-
<property name="nodejs_package_manager_path" value="npm" />
|
43
|
-
<property name="settings.editor.selected.configurable" value="configurable.group.tools" />
|
44
|
-
</component>
|
45
|
-
<component name="RunAnythingCache">
|
46
|
-
<option name="myCommands">
|
47
|
-
<command value="gem install rich_enums" />
|
48
|
-
</option>
|
49
|
-
</component>
|
50
|
-
<component name="RunManager">
|
51
|
-
<configuration name="IRB: rich_enums" type="IrbRunConfigurationType" factoryName="IRB console" temporary="true">
|
52
|
-
<module name="rich_enums" />
|
53
|
-
<IRB_RUN_CONFIG NAME="RUBY_ARGS" VALUE="" />
|
54
|
-
<IRB_RUN_CONFIG NAME="WORK DIR" VALUE="$MODULE_DIR$" />
|
55
|
-
<IRB_RUN_CONFIG NAME="SHOULD_USE_SDK" VALUE="false" />
|
56
|
-
<IRB_RUN_CONFIG NAME="ALTERN_SDK_NAME" VALUE="" />
|
57
|
-
<IRB_RUN_CONFIG NAME="myPassParentEnvs" VALUE="true" />
|
58
|
-
<EXTENSION ID="BundlerRunConfigurationExtension" BUNDLE_MODE="AUTO" bundleExecEnabled="true" />
|
59
|
-
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
60
|
-
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov" ENABLE_BRANCH_COVERAGE="true" ENABLE_FORKED_COVERAGE="true">
|
61
|
-
<COVERAGE_PATTERN ENABLED="true">
|
62
|
-
<PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
|
63
|
-
</COVERAGE_PATTERN>
|
64
|
-
</EXTENSION>
|
65
|
-
<EXTENSION ID="org.jetbrains.plugins.ruby.rails.run.RailsRunConfigurationExtension" SCRATCH_USE_RAILS_RUNNER="false" />
|
66
|
-
<IRB_RUN_CONFIG NAME="SCRIPT_PATH" VALUE="$USER_HOME$/.rbenv/versions/2.7.4/bin/irb" />
|
67
|
-
<IRB_RUN_CONFIG NAME="SCRIPT_ARGS" VALUE="" />
|
68
|
-
<IRB_RUN_CONFIG NAME="CONSOLE_TYPE" VALUE="IRB" />
|
69
|
-
<method v="2" />
|
70
|
-
</configuration>
|
71
|
-
<recent_temporary>
|
72
|
-
<list>
|
73
|
-
<item itemvalue="Ruby Console.IRB: rich_enums" />
|
74
|
-
</list>
|
75
|
-
</recent_temporary>
|
76
|
-
</component>
|
77
|
-
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
78
|
-
<component name="SpringUtil" SPRING_PRE_LOADER_OPTION="true" RAKE_SPRING_PRE_LOADER_OPTION="true" RAILS_SPRING_PRE_LOADER_OPTION="true" />
|
79
|
-
<component name="TaskManager">
|
80
|
-
<task active="true" id="Default" summary="Default task">
|
81
|
-
<changelist id="0dad223b-0d0c-4b56-bf84-a35f47fa0bd2" name="Changes" comment="" />
|
82
|
-
<created>1644983778288</created>
|
83
|
-
<option name="number" value="Default" />
|
84
|
-
<option name="presentableId" value="Default" />
|
85
|
-
<updated>1644983778288</updated>
|
86
|
-
<workItem from="1644983779909" duration="2058000" />
|
87
|
-
</task>
|
88
|
-
<servers />
|
89
|
-
</component>
|
90
|
-
<component name="TypeScriptGeneratedFilesManager">
|
91
|
-
<option name="version" value="3" />
|
92
|
-
</component>
|
93
|
-
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
94
|
-
<SUITE FILE_PATH="coverage/rich_enums@IRB__rich_enums.rcov" NAME="IRB: rich_enums Coverage Results" MODIFIED="1644985416414" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="rich_enums" />
|
95
|
-
</component>
|
96
|
-
</project>
|