rich_enums 0.1.0 → 0.1.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: 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>