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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eab0bd822f4eb8fa1effa5e5f176b9ac6e415144d88bdc226911f00e856bcc72
4
- data.tar.gz: aa627494d9273b5425070ecb25b3bcb13cfa08ead40d777f4f3219b55c09b846
3
+ metadata.gz: 1f6b109c5069cabe1da55839403d6f9efee399e46b5939be951a9604156911d2
4
+ data.tar.gz: 97582e336b09b8d5d2376bf73bc1b65522b9cd93f60daf17642bba5d9f02196a
5
5
  SHA512:
6
- metadata.gz: 7142c1bcd655de15d9fc33dcc6f798ef75416f07735f6d1e841fe29b9955408ef2a1120dff4b4c7ecc33e5e5988246e125c318b879053240ca6f738b15d88448
7
- data.tar.gz: aebc09dea6f653dacc1906c1cbe0fc2740a77acff280ebde356cba4d6c6fe3566cf08a98be801e31ffe46d1d8e8cf85a4bddfa47eefc4c0651865b894024fd88
6
+ metadata.gz: a1d592ab62bf202968448bcc4833a5b4abddd1b42a919834fcc730216a130fac8294bf997fe772422b1e36e0d9730c95abec7d008fd30f3a763c66356f7e3978
7
+ data.tar.gz: '049113830f6ab99a5870e7f41125f8544bdcca86cbf6947643059d1e265b957aa27de48d46bd49a8db9cee91d0040cd3777fb71e837dc082cca2ac199481e911'
data/.gitignore CHANGED
@@ -9,3 +9,7 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ .idea
13
+ /*.gem
14
+ .byebug_history
15
+ /*.db
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
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/rich_enums`. To experiment with that code, run `bin/console` for an interactive prompt.
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
- TODO: Delete this and the text above, and describe your gem
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 install it yourself as:
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
- TODO: Write usage instructions here
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/[USERNAME]/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/[USERNAME]/rich_enums/blob/master/CODE_OF_CONDUCT.md).
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
@@ -1,3 +1,3 @@
1
1
  module RichEnums
2
- VERSION = "0.1.0"
2
+ VERSION = '0.1.3'
3
3
  end
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 EnumMappable
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], **column_symbol_value_string_options
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}_names", split_hash[:for_display])
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}_names") { instance_variable_get("@#{column}_names") }
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}_name") { self.class.send("#{column}_names")[send(column.to_s)] }
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 = 'Provides a rich_enum class method to include String descriptions during Enum definitions'
10
- # spec.description = 'TODO: Write a longer description or delete this line.'
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
- # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
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.0
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: 2022-02-16 00:00:00.000000000 Z
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.1.6
59
- signing_key:
62
+ rubygems_version: 3.5.0.dev
63
+ signing_key:
60
64
  specification_version: 4
61
- summary: Provides a rich_enum class method to include String descriptions during Enum
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>