sequel-enum_values 1.0.0 → 2.0.0

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
- SHA1:
3
- metadata.gz: 4a1f6aacf198c448d5797a908220a143ebc2acc8
4
- data.tar.gz: 55d772bbd6eb243acd8fcbbf55a3234da9f94790
2
+ SHA256:
3
+ metadata.gz: bb81e73a484928b6b12a9bacbc996154c58b6328b2fb965d50a0ba3529e0551d
4
+ data.tar.gz: f8e2106e499b1c69db923b26f8fd40cc9f21a4867c22a0c0ec0bb080cc2fc686
5
5
  SHA512:
6
- metadata.gz: 525df5c0eee7c4d26653b81053bc29185d190ad32dbd0b04410c7b9e7a929d56383de5a8c56551f486f198f0e585acf23d9b6f51f4140be2942d5e4bb8b67120
7
- data.tar.gz: 9aabee1793a9f8927e2d53008864ee55a897e4e3b8b0e586ca4533457529ffb97473a1c1281b40001b917da3fa67d5baf386b38c688fb16d047987a598f752e0
6
+ metadata.gz: 35c09c8ac60056e69ae601a9386ea33ab55d125157700a4883fe812dd4a664b9d26261a025bf89557cea4d8004846946c902b3d04d1b659e4b5755aaf330afb4
7
+ data.tar.gz: ca4c3bc2addf1bc1f1c660bfb2957c18cad062f9863133cca83965365f4f75c27069f3efdaa9ba8b18a4ceeaac25da2234d31888012139dec97cfe880768bec2
data/CHANGELOG.md ADDED
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 2.0.0 (2026-02-19)
6
+
7
+ * Rename internal instance variables.
8
+ Avoid the conflict with [`static_cache` Sequel's plugin](http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/StaticCache.html)
9
+ * Drop Ruby 2.3, 2.4, 2.5, 2.6, 2.7, 3.0 and 3.1 support.
10
+ * Add Ruby 3.2, 3.3, 3.4 and 4.0 support.
11
+ * Update `sequel` runtime dependency.
12
+ * Make tests coverage 100%.
13
+ * Improve version locks of dependencies.
14
+ * Update development dependencies.
15
+ * Resolve new RuboCop offenses.
16
+ * Improve CI config.
17
+
18
+ ## 1.2.0 (2018-02-01)
19
+
20
+ * Add `caching` option for plugin.
21
+ Cache enum values in plugin by default.
22
+ * Add `predicate_methods` option.
23
+ Supports `true`, `false`, `%i[]` or `Symbol`. Default is `false`.
24
+ * Switch from Minitest (-Bacon) to RSpec.
25
+ * Add documentation for public methods.
26
+
27
+ ## 1.0.0 (2017-10-16)
28
+
29
+ * Initial release.
data/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2017 Alexander Popov (AlexWayfer)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"),
5
+ to deal in the Software without restriction, including without limitation
6
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
+ and/or sell copies of the Software, and to permit persons to whom
8
+ the Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included
11
+ in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
15
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
16
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
17
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
18
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19
+ DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # Sequel enum_values plugin
2
+
3
+ [![Cirrus CI - Base Branch Build Status](https://img.shields.io/cirrus/github/AlexWayfer/sequel-enum_values?style=flat-square)](https://cirrus-ci.com/github/AlexWayfer/sequel-enum_values)
4
+ [![Codecov branch](https://img.shields.io/codecov/c/github/AlexWayfer/sequel-enum_values/main.svg?style=flat-square)](https://codecov.io/gh/AlexWayfer/sequel-enum_values)
5
+ [![Depfu](https://img.shields.io/depfu/AlexWayfer/sequel-enum_values?style=flat-square)](https://depfu.com/repos/github/AlexWayfer/sequel-enum_values)
6
+ [![Inline docs](https://inch-ci.org/github/AlexWayfer/sequel-enum_values.svg?branch=main)](https://inch-ci.org/github/AlexWayfer/sequel-enum_values)
7
+ [![Gem](https://img.shields.io/gem/v/sequel-enum_values.svg?style=flat-square)](https://rubygems.org/gems/sequel-enum_values)
8
+ [![License](https://img.shields.io/github/license/AlexWayfer/sequel-enum_values.svg?style=flat-square)](LICENSE.txt)
9
+
10
+ A Sequel plugin that provides `enum_values(field)` method to your models.
11
+
12
+ ## Installation
13
+
14
+ ### Bundler
15
+
16
+ Add this line to your project's Gemfile:
17
+
18
+ ```ruby
19
+ gem 'sequel-enum_values', require: 'sequel/plugins/enum_values'
20
+ ```
21
+
22
+ And then execute:
23
+
24
+ ```
25
+ $ bundle
26
+ ```
27
+
28
+ ### Manually
29
+
30
+ Install this gem as:
31
+
32
+ ```
33
+ $ gem install sequel-enum_values
34
+ ```
35
+
36
+ And then require it in your project:
37
+
38
+ ```ruby
39
+ require 'sequel/plugins/enum_values'
40
+ ```
41
+
42
+ ## Usage
43
+
44
+ If you have database schema like this:
45
+
46
+ ```ruby
47
+ create_enum :item_type, %w[first second third]
48
+ create_enum :item_status, %w[created selected canceled]
49
+
50
+ create_table :items do
51
+ primary_key :id
52
+ column :type, :item_type
53
+ column :status, :item_status
54
+ end
55
+ ```
56
+
57
+ Then you can use it like this:
58
+
59
+ ```ruby
60
+ class Item < Sequel::Model
61
+ plugin :enum_values
62
+ end
63
+
64
+ Item.enum_values(:type) # => ["first", "second", "third"]
65
+ Item.enum_values(:status) # => ["created", "selected", "canceled"]
66
+ ```
67
+
68
+ ### Caching
69
+
70
+ Plugin caches enum values for each field by default.
71
+
72
+ But you can disable it:
73
+
74
+ ```ruby
75
+ Item.plugin :enum_values, caching: false
76
+ ```
77
+
78
+ ### Predicate methods
79
+
80
+ Plugin can define instance methods for all enum values:
81
+
82
+ ```ruby
83
+ Item.plugin :enum_values, predicate_methods: true # default is `false`
84
+
85
+ item = Item.new(type: 'first', status: 'created')
86
+
87
+ item.first? # => true
88
+ item.second? # => false
89
+
90
+ item.created? # => true
91
+ item.selected? # => false
92
+ ```
93
+
94
+ Or just for specific fields:
95
+
96
+ ```ruby
97
+ Item.plugin :enum_values, predicate_methods: %i[status]
98
+ # or just `:status` for single value
99
+
100
+ item = Item.new(type: 'first', status: 'created')
101
+
102
+ item.first? # => NoMethodError
103
+
104
+ item.created? # => true
105
+ item.selected? # => false
106
+ ```
107
+
108
+ ## Development
109
+
110
+ After checking out the repo, run `bundle install` to install dependencies.
111
+
112
+ Then, run `toys rspec` to run the tests.
113
+
114
+ To install this gem onto your local machine, run `toys gem install`.
115
+
116
+ To release a new version, run `toys gem release %version%`.
117
+ See how it works [here](https://github.com/AlexWayfer/gem_toys#release).
118
+
119
+ ## Contributing
120
+
121
+ Bug reports and pull requests are welcome on [GitHub](https://github.com/AlexWayfer/sequel-enum_values).
122
+
123
+ ## License
124
+
125
+ The gem is available as open source under the terms of the
126
+ [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sequel
4
+ module Plugins
5
+ module EnumValues
6
+ VERSION = '2.0.0'
7
+ end
8
+ end
9
+ end
@@ -1,21 +1,103 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'enum_values/version'
4
+
3
5
  module Sequel
4
6
  module Plugins
7
+ ## Plugin for getting enum values from PostgreSQL by field name
5
8
  module EnumValues
6
- VERSION = '1.0.0'
9
+ ## Initialize model state for this plugin
10
+ ## @param model [Sequel::Model] model for which plugin applying
11
+ ## @param _options [Hash] options (don't affect anything in this moment)
12
+ def self.apply(model, _options = {})
13
+ model.instance_exec do
14
+ @enum_values_cache = {}
15
+ @enum_values_caching = true
16
+ end
17
+ end
18
+
19
+ ## Configure model for this plugin
20
+ ## @param model [Sequel::Model] model in which plugin enabled
21
+ ## @param options [Hash] options for plugin
22
+ ## @option options [Boolean] caching (true) cache enum values
23
+ ## @option options [Boolean, Symbol, Array<Symbol>]
24
+ ## predicate_methods (false)
25
+ ## enum fields for which predicate methods will be defined
26
+ ## @example Disable caching
27
+ ## Item.plugin :enum_values, caching: false
28
+ ## @example Define predicate methods for all enum fields
29
+ ## Item.plugin :enum_values, predicate_methods: true
30
+ ## @example Define predicate methods for specific enum fields
31
+ ## Item.plugin :enum_values, predicate_methods: %[status type]
32
+ ## @example Define predicate methods for specific enum field
33
+ ## Item.plugin :enum_values, predicate_methods: :status
34
+ def self.configure(model, options = {})
35
+ model.instance_exec do
36
+ @enum_values_caching = options.fetch(:caching, @enum_values_caching)
37
+
38
+ predicate_methods = options.fetch(:predicate_methods, false)
39
+
40
+ transform_predicate_methods_to_enum_fields(predicate_methods)
41
+ .each do |field|
42
+ all_enum_fields[field][:enum_values].each do |enum_value|
43
+ define_predicate_method field, enum_value
44
+ end
45
+ end
46
+ end
47
+ end
7
48
 
8
49
  ## Module for class methods
9
50
  module ClassMethods
51
+ ## Get enum values for specific field
52
+ ## @param field [Symbol] name of enum field
53
+ ## @return [Array<String>] values of enum
54
+ ## @example Get enum values for `status` field of `Item` model
55
+ ## Item.enum_values(:status)
10
56
  def enum_values(field)
11
- field_schema = db.schema(table_name).to_h[field]
12
- unless field_schema
13
- raise(
14
- ArgumentError,
15
- "'#{table_name}' table does not have '#{field}' column"
16
- )
57
+ if @enum_values_caching && (cached_values = @enum_values_cache[field])
58
+ return cached_values
59
+ end
60
+
61
+ field_schema = all_enum_fields[field]
62
+ raise_field_nonexistent(field) if field_schema.nil?
63
+
64
+ enum_values = field_schema[:enum_values]
65
+ @enum_values_cache[field] = enum_values if @enum_values_caching
66
+ enum_values
67
+ end
68
+
69
+ private
70
+
71
+ def transform_predicate_methods_to_enum_fields(predicate_methods)
72
+ case predicate_methods
73
+ when TrueClass
74
+ all_enum_fields.keys
75
+ when FalseClass
76
+ []
77
+ else
78
+ Array(predicate_methods)
79
+ end
80
+ end
81
+
82
+ def define_predicate_method(field, enum_value)
83
+ define_method :"#{enum_value}?" do
84
+ public_send(field) == enum_value
17
85
  end
18
- field_schema[:enum_values]
86
+ end
87
+
88
+ def all_enum_fields
89
+ return @all_enum_fields if @enum_values_caching && defined?(@all_enum_fields)
90
+
91
+ @all_enum_fields =
92
+ db.schema(table_name).to_h
93
+ .select { |_field, schema| schema.key?(:enum_values) }
94
+ end
95
+
96
+ def raise_field_nonexistent(field)
97
+ raise(
98
+ ArgumentError,
99
+ "'#{table_name}' table does not have '#{field}' column"
100
+ )
19
101
  end
20
102
  end
21
103
  end
metadata CHANGED
@@ -1,175 +1,54 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-enum_values
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Popov
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2017-10-16 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: sequel
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 4.1.0
20
- - - "<="
21
- - !ruby/object:Gem::Version
22
- version: '6'
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 4.1.0
30
- - - "<="
31
- - !ruby/object:Gem::Version
32
- version: '6'
33
- - !ruby/object:Gem::Dependency
34
- name: rubocop
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '0.50'
40
- type: :development
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '0.50'
47
- - !ruby/object:Gem::Dependency
48
- name: rake
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '12'
54
- type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '12'
61
- - !ruby/object:Gem::Dependency
62
- name: minitest-bacon
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '1'
68
- type: :development
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '1'
75
- - !ruby/object:Gem::Dependency
76
- name: minitest-reporters
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '1'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '1'
89
- - !ruby/object:Gem::Dependency
90
- name: rack-test
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '0'
96
- type: :development
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '0'
103
- - !ruby/object:Gem::Dependency
104
- name: simplecov
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
- - !ruby/object:Gem::Dependency
118
- name: codecov
119
14
  requirement: !ruby/object:Gem::Requirement
120
15
  requirements:
121
16
  - - "~>"
122
17
  - !ruby/object:Gem::Version
123
- version: '0'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '0'
131
- - !ruby/object:Gem::Dependency
132
- name: pry
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '0'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - "~>"
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- - !ruby/object:Gem::Dependency
146
- name: pry-byebug
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '3.5'
152
- type: :development
18
+ version: '5.0'
19
+ type: :runtime
153
20
  prerelease: false
154
21
  version_requirements: !ruby/object:Gem::Requirement
155
22
  requirements:
156
23
  - - "~>"
157
24
  - !ruby/object:Gem::Version
158
- version: '3.5'
159
- description: Now your `Sequel::Model` classes has method for getting `pg_enum` values
25
+ version: '5.0'
26
+ description: 'Now your `Sequel::Model` classes has method for getting `pg_enum` values
160
27
  from DataBase by field name.
28
+
29
+ '
161
30
  email:
162
31
  - alex.wayfer@gmail.com
163
32
  executables: []
164
33
  extensions: []
165
34
  extra_rdoc_files: []
166
35
  files:
36
+ - CHANGELOG.md
37
+ - LICENSE.txt
38
+ - README.md
167
39
  - lib/sequel/plugins/enum_values.rb
40
+ - lib/sequel/plugins/enum_values/version.rb
168
41
  homepage: https://github.com/AlexWayfer/sequel-enum_values
169
42
  licenses:
170
43
  - MIT
171
- metadata: {}
172
- post_install_message:
44
+ metadata:
45
+ bug_tracker_uri: https://github.com/AlexWayfer/sequel-enum_values/issues
46
+ changelog_uri: https://github.com/AlexWayfer/sequel-enum_values/blob/v2.0.0/CHANGELOG.md
47
+ documentation_uri: http://www.rubydoc.info/gems/sequel-enum_values/2.0.0
48
+ homepage_uri: https://github.com/AlexWayfer/sequel-enum_values
49
+ rubygems_mfa_required: 'true'
50
+ source_code_uri: https://github.com/AlexWayfer/sequel-enum_values
51
+ wiki_uri: https://github.com/AlexWayfer/sequel-enum_values/wiki
173
52
  rdoc_options: []
174
53
  require_paths:
175
54
  - lib
@@ -177,16 +56,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
56
  requirements:
178
57
  - - ">="
179
58
  - !ruby/object:Gem::Version
180
- version: '0'
59
+ version: '3.2'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '5'
181
63
  required_rubygems_version: !ruby/object:Gem::Requirement
182
64
  requirements:
183
65
  - - ">="
184
66
  - !ruby/object:Gem::Version
185
67
  version: '0'
186
68
  requirements: []
187
- rubyforge_project:
188
- rubygems_version: 2.6.13
189
- signing_key:
69
+ rubygems_version: 4.0.3
190
70
  specification_version: 4
191
71
  summary: Sequel plugin that provides method for getting `pg_enum` values
192
72
  test_files: []