array_enum 1.3.0 → 1.5.0

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: decd290271c41c2193a1e63f98a0df618c9a95813570aa01a32f27bd68d25865
4
- data.tar.gz: da107aae087d6592ce0b33d8186170f41438b7be199737103a0b3bea4c13e53e
3
+ metadata.gz: 532d9c63da0d5670890af1f3236821651e5df2939a360086138af660363f7917
4
+ data.tar.gz: 296725907a06887551117c12a554bc1b3b1c0d6852bd7ab714be2cbcda6cbbae
5
5
  SHA512:
6
- metadata.gz: 8a4e5a2c6cf33ec8fa943d13d0b1b852f20671598556abd638c7fb72d9175e83b355cc122b615c3aa1e109511313b4e163f30808ec0a9d4cdb9f422571cdac49
7
- data.tar.gz: d984bfdf1addd82a03fc1098453c9141f6ca3fb3b13ba8f9b2e4cde5d9d7244379d1677a248dbae93c3f272fee6e679c15ada79136ca6c9ea71da9e55d1ef56f
6
+ metadata.gz: adb8025e3538639f748d2752d5cf05facb3494ced82c550a40d6a400f5569fffe3e977a7159d0e3a0c685b76c887c7b14158d854863761ec3f444310552aa45b
7
+ data.tar.gz: d9d7f665c33d61254bdbc758f0b4ccd998f9b81cd974e1d17b4345184ce41f1a29d137a070c2f9bdc5bf9ea118222d68cd0c4e7006ef3d3d55820326592b5a1f
@@ -0,0 +1,59 @@
1
+ name: BUILD
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ ruby-version: [3.0, 3.1, 3.3]
14
+
15
+ services:
16
+ postgres:
17
+ image: postgres
18
+ ports:
19
+ - 5432:5432
20
+ env:
21
+ POSTGRES_PASSWORD: postgres
22
+ options: >-
23
+ --health-cmd pg_isready
24
+ --health-interval 10s
25
+ --health-timeout 5s
26
+ --health-retries 5
27
+
28
+ steps:
29
+ - name: Install libraries
30
+ run: |
31
+ sudo apt-get install -y libpq-dev postgresql-client
32
+
33
+ - name: Configure database
34
+ env:
35
+ PGPASSWORD: postgres
36
+ PGUSER: postgres
37
+ PGHOST: localhost
38
+ run: |
39
+ echo "Configuring PostgresSQL"
40
+ psql -c 'create database "array_enum_test";'
41
+
42
+ - name: Checkout code
43
+ uses: actions/checkout@v4.1.1
44
+
45
+ - name : Ruby Setup
46
+ uses: ruby/setup-ruby@v1.173.0
47
+ with:
48
+ ruby-version: ${{ matrix.ruby-version }}
49
+ bundler-cache: true
50
+
51
+ - name: Install dependencies
52
+ run: bundle install
53
+
54
+ - name: Run test
55
+ env:
56
+ PGPASSWORD: postgres
57
+ PGUSER: postgres
58
+ PGHOST: localhost
59
+ run: bundle exec rake -s test
@@ -1,38 +1,58 @@
1
1
  name: CI
2
2
 
3
- on: [push, pull_request]
3
+ on:
4
+ - pull_request
5
+ - push
4
6
 
5
7
  jobs:
6
- build:
8
+ test:
7
9
  runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ ruby-version: [3.0, 3.1, 3.3]
13
+
8
14
  services:
9
15
  postgres:
10
- image: postgres:11
16
+ image: postgres
11
17
  ports:
12
- - 5432:5432
18
+ - 5432:5432
13
19
  env:
14
- POSTGRES_PASSWORD: ""
20
+ POSTGRES_PASSWORD: postgres
21
+ options: >-
22
+ --health-cmd pg_isready
23
+ --health-interval 10s
24
+ --health-timeout 5s
25
+ --health-retries 5
15
26
 
16
27
  steps:
17
28
  - name: Install libraries
18
29
  run: |
19
- sudo apt-get update
20
30
  sudo apt-get install -y libpq-dev postgresql-client
21
31
 
22
32
  - name: Configure database
33
+ env:
34
+ PGPASSWORD: postgres
35
+ PGUSER: postgres
36
+ PGHOST: localhost
23
37
  run: |
24
- echo "PostgreSQL"
25
- psql -h localhost -c 'create database "array_enum_test";' -U postgres
38
+ echo "Configuring PostgresSQL"
39
+ psql -c 'create database "array_enum_test";'
26
40
 
27
- - uses: actions/checkout@v1
41
+ - name: Checkout code
42
+ uses: actions/checkout@v4.1.1
28
43
 
29
- - name: Set up Ruby
30
- uses: actions/setup-ruby@v1
44
+ - name : Ruby Setup
45
+ uses: ruby/setup-ruby@v1.173.0
31
46
  with:
32
- ruby-version: 2.6.x
47
+ ruby-version: ${{ matrix.ruby-version }}
48
+ bundler-cache: true
33
49
 
34
- - name: Build and test
35
- run: |
36
- gem install bundler
37
- bundle install --jobs 4 --retry 3
38
- bundle exec rake test
50
+ - name: Install dependencies
51
+ run: bundle install
52
+
53
+ - name: Run test
54
+ env:
55
+ PGPASSWORD: postgres
56
+ PGUSER: postgres
57
+ PGHOST: localhost
58
+ run: bundle exec rake -s test
data/.gitignore CHANGED
@@ -6,3 +6,5 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ .tool-versions
10
+ .byebug_history
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in array_enum.gemspec
4
4
  gemspec
data/Gemfile.lock CHANGED
@@ -1,32 +1,42 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- array_enum (1.3.0)
4
+ array_enum (1.5.0)
5
5
  activemodel
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (6.1.3)
11
- activesupport (= 6.1.3)
12
- activerecord (6.1.3)
13
- activemodel (= 6.1.3)
14
- activesupport (= 6.1.3)
15
- activesupport (6.1.3)
10
+ activemodel (7.1.3.2)
11
+ activesupport (= 7.1.3.2)
12
+ activerecord (7.1.3.2)
13
+ activemodel (= 7.1.3.2)
14
+ activesupport (= 7.1.3.2)
15
+ timeout (>= 0.4.0)
16
+ activesupport (7.1.3.2)
17
+ base64
18
+ bigdecimal
16
19
  concurrent-ruby (~> 1.0, >= 1.0.2)
20
+ connection_pool (>= 2.2.5)
21
+ drb
17
22
  i18n (>= 1.6, < 2)
18
23
  minitest (>= 5.1)
24
+ mutex_m
19
25
  tzinfo (~> 2.0)
20
- zeitwerk (~> 2.3)
21
- concurrent-ruby (1.1.8)
22
- i18n (1.8.9)
26
+ base64 (0.2.0)
27
+ bigdecimal (3.1.7)
28
+ concurrent-ruby (1.2.3)
29
+ connection_pool (2.4.1)
30
+ drb (2.2.1)
31
+ i18n (1.14.4)
23
32
  concurrent-ruby (~> 1.0)
24
- minitest (5.11.3)
25
- pg (1.1.4)
26
- rake (12.3.3)
27
- tzinfo (2.0.4)
33
+ minitest (5.22.3)
34
+ mutex_m (0.2.0)
35
+ pg (1.5.6)
36
+ rake (13.2.0)
37
+ timeout (0.4.1)
38
+ tzinfo (2.0.6)
28
39
  concurrent-ruby (~> 1.0)
29
- zeitwerk (2.4.2)
30
40
 
31
41
  PLATFORMS
32
42
  ruby
@@ -40,4 +50,4 @@ DEPENDENCIES
40
50
  rake (>= 10.0)
41
51
 
42
52
  BUNDLED WITH
43
- 2.0.2
53
+ 2.5.6
data/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ [![Gem Version](https://badge.fury.io/rb/array_enum.svg)](https://badge.fury.io/rb/array_enum)
2
+ [![BUILD](https://github.com/freeletics/array_enum/actions/workflows/ci-on-merge.yml/badge.svg)](https://github.com/freeletics/array_enum/actions/workflows/ci-on-merge.yml)
3
+
4
+
1
5
  # ArrayEnum
2
6
 
3
7
  Extension for `ActiveRecord` that adds support for `PostgreSQL` array columns, mapping string values to integers.
@@ -11,7 +15,6 @@ Extension for `ActiveRecord` that adds support for `PostgreSQL` array columns, m
11
15
  ### ActiveRecord extension
12
16
 
13
17
  Database will store integers that after reading will map to string values.
14
- Additionally scope is generated with `with_` prefix that will query database for any matching passed value.
15
18
 
16
19
  ```ruby
17
20
  ActiveRecord::Schema.define do
@@ -23,13 +26,43 @@ end
23
26
  class User < ActiveRecord::Base
24
27
  extend ArrayEnum
25
28
 
26
- array_enum favourite_colors: {"red" => 1, "blue" => 2}
29
+ array_enum favourite_colors: {"red" => 1, "blue" => 2, "green" => 3}
27
30
  end
28
31
 
29
32
  user = User.create!(favourite_colors: ["red", "green"])
30
33
  user.favourite_colors # => ["red", "green"]
31
- User.favourite_colors # => {"red" => 1, "blue" => 2}
32
- User.with_favourite_colors("red") # => [user]
34
+ User.favourite_colors # => {"red" => 1, "blue" => 2, "green" => 3}
35
+ ```
36
+
37
+ Several scopes are made available on your model to find records based on a value or an array of values:
38
+
39
+ ```ruby
40
+ user1 = User.create!(favourite_colors: ["red", "green"])
41
+ user2 = User.create!(favourite_colors: ["red"])
42
+
43
+ # Find a record that has _all_ the provided values in the array enum attribute
44
+ User.with_favourite_colors("red") # => [user1, user2]
45
+ User.with_favourite_colors(%w[red green]) # => [user1]
46
+ User.with_favourite_colors(%w[red blue]) # => []
47
+ User.with_favourite_colors(%w[green blue]) # => []
48
+
49
+ # Find a record that has the provided values, and _only those values_, in the array enum attribute
50
+ User.only_with_favourite_colors("red") # => [user2]
51
+ User.only_with_favourite_colors(%w[red green]) # => [user1]
52
+ User.only_with_favourite_colors(%w[red blue]) # => []
53
+ User.only_with_favourite_colors(%w[green blue]) # => []
54
+
55
+ # Find a record that has _at least one_ of the provided values in the array enum attribute
56
+ User.with_any_of_favourite_colors("red") # => [user1, user2]
57
+ User.with_any_of_favourite_colors(%w[red green]) # => [user1, user2]
58
+ User.with_any_of_favourite_colors(%w[red blue]) # => [user1, user2]
59
+ User.with_any_of_favourite_colors(%w[green blue]) # => [user1]
60
+ ```
61
+
62
+ Attempting to find a record with a value that is not in the enum will fail:
63
+
64
+ ```ruby
65
+ User.with_favourite_colors("yellow") # => ArgumentError["yellow is not a valid value for favourite_colors"]
33
66
  ```
34
67
 
35
68
  ### Subset Validator
data/array_enum.gemspec CHANGED
@@ -1,45 +1,44 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "array_enum/version"
3
+ require 'array_enum/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "array_enum"
6
+ spec.name = 'array_enum'
8
7
  spec.version = ArrayEnum::VERSION
9
- spec.authors = ["Wojciech Wnętrzak"]
10
- spec.email = ["w.wnetrzak@gmail.com", "eng@freeletics.com"]
8
+ spec.authors = ['Wojciech Wnętrzak']
9
+ spec.email = ['w.wnetrzak@gmail.com', 'eng@freeletics.com']
11
10
 
12
- spec.summary = %q{String to integer mapping for PostgreSQL array columns.}
13
- spec.description = %q{Extension for ActiveRecord that adds support for PostgreSQL array columns, mapping string values to integers.}
14
- spec.homepage = "https://github.com/freeletics/array_enum"
15
- spec.license = "MIT"
11
+ spec.summary = 'String to integer mapping for PostgreSQL array columns.'
12
+ spec.description = 'Extension for ActiveRecord that adds support for PostgreSQL array columns, mapping string values to integers.'
13
+ spec.homepage = 'https://github.com/freeletics/array_enum'
14
+ spec.license = 'MIT'
16
15
 
17
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
17
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
18
  if spec.respond_to?(:metadata)
20
- spec.metadata["homepage_uri"] = spec.homepage
21
- spec.metadata["source_code_uri"] = "https://github.com/freeletics/array_enum"
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = 'https://github.com/freeletics/array_enum'
22
21
  else
23
- raise "RubyGems 2.0 or newer is required to protect against " \
24
- "public gem pushes."
22
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
23
+ 'public gem pushes.'
25
24
  end
26
25
 
27
26
  # Specify which files should be added to the gem when it is released.
28
27
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
29
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
28
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
30
29
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
31
30
  end
32
- spec.bindir = "exe"
31
+ spec.bindir = 'exe'
33
32
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
34
- spec.require_paths = ["lib"]
33
+ spec.require_paths = ['lib']
35
34
 
36
- spec.required_ruby_version = ">= 2.3"
35
+ spec.required_ruby_version = '>= 3.0'
37
36
 
38
- spec.add_dependency "activemodel"
37
+ spec.add_dependency 'activemodel'
39
38
 
40
- spec.add_development_dependency "activerecord"
41
- spec.add_development_dependency "pg"
42
- spec.add_development_dependency "bundler", ">= 1.17"
43
- spec.add_development_dependency "rake", ">= 10.0"
44
- spec.add_development_dependency "minitest", ">= 5.0"
39
+ spec.add_development_dependency 'activerecord'
40
+ spec.add_development_dependency 'bundler', '>= 1.17'
41
+ spec.add_development_dependency 'minitest', '>= 5.0'
42
+ spec.add_development_dependency 'pg'
43
+ spec.add_development_dependency 'rake', '>= 10.0'
45
44
  end
@@ -1,3 +1,3 @@
1
1
  module ArrayEnum
2
- VERSION = "1.3.0"
2
+ VERSION = '1.5.0'
3
3
  end
data/lib/array_enum.rb CHANGED
@@ -1,11 +1,11 @@
1
- require "array_enum/version"
2
- require "array_enum/subset_validator"
3
- require "array_enum/railtie" if defined?(Rails::Railtie)
4
- require "active_support/hash_with_indifferent_access"
5
- require "active_support/core_ext/string/inflections"
1
+ require 'array_enum/version'
2
+ require 'array_enum/subset_validator'
3
+ require 'array_enum/railtie' if defined?(Rails::Railtie)
4
+ require 'active_support/hash_with_indifferent_access'
5
+ require 'active_support/core_ext/string/inflections'
6
6
 
7
7
  module ArrayEnum
8
- MISSING_VALUE_MESSAGE = "%{value} is not a valid value for %{attr}".freeze
8
+ MISSING_VALUE_MESSAGE = '%<value>s is not a valid value for %<attr>s'.freeze
9
9
  private_constant :MISSING_VALUE_MESSAGE
10
10
 
11
11
  def array_enum(definitions)
@@ -17,11 +17,17 @@ module ArrayEnum
17
17
  mapping_hash
18
18
  end
19
19
 
20
- define_singleton_method("with_#{attr_name}".to_sym) do |values|
21
- db_values = Array(values).map do |value|
22
- mapping_hash[value] || raise(ArgumentError, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
20
+ {
21
+ "with_#{attr_name}" => '@>',
22
+ "only_with_#{attr_name}" => '=',
23
+ "with_any_of_#{attr_name}" => '&&'
24
+ }.each do |method_name, comparison_operator|
25
+ define_singleton_method(method_name.to_sym) do |values|
26
+ db_values = Array(values).map do |value|
27
+ mapping_hash[value] || raise(ArgumentError, format(MISSING_VALUE_MESSAGE, value: value, attr: attr_name))
28
+ end
29
+ where("#{table_name}.#{attr_name} #{comparison_operator} ARRAY[:db_values]", db_values: db_values)
23
30
  end
24
- where("#{attr_name} @> ARRAY[:db_values]", db_values: db_values)
25
31
  end
26
32
 
27
33
  define_method(attr_symbol) do
@@ -30,7 +36,7 @@ module ArrayEnum
30
36
 
31
37
  define_method("#{attr_name}=".to_sym) do |values|
32
38
  self[attr_symbol] = Array(values).map do |value|
33
- mapping_hash[value] || raise(ArgumentError, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
39
+ mapping_hash[value] || raise(ArgumentError, format(MISSING_VALUE_MESSAGE, value: value, attr: attr_name))
34
40
  end.uniq
35
41
  end
36
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: array_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wojciech Wnętrzak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-07 00:00:00.000000000 Z
11
+ date: 2024-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -39,61 +39,61 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pg
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '1.17'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '1.17'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.17'
61
+ version: '5.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.17'
68
+ version: '5.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: pg
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '10.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '10.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: minitest
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '5.0'
89
+ version: '10.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '5.0'
96
+ version: '10.0'
97
97
  description: Extension for ActiveRecord that adds support for PostgreSQL array columns,
98
98
  mapping string values to integers.
99
99
  email:
@@ -103,6 +103,7 @@ executables: []
103
103
  extensions: []
104
104
  extra_rdoc_files: []
105
105
  files:
106
+ - ".github/workflows/ci-on-merge.yml"
106
107
  - ".github/workflows/ci.yml"
107
108
  - ".gitignore"
108
109
  - Gemfile
@@ -131,14 +132,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
132
  requirements:
132
133
  - - ">="
133
134
  - !ruby/object:Gem::Version
134
- version: '2.3'
135
+ version: '3.0'
135
136
  required_rubygems_version: !ruby/object:Gem::Requirement
136
137
  requirements:
137
138
  - - ">="
138
139
  - !ruby/object:Gem::Version
139
140
  version: '0'
140
141
  requirements: []
141
- rubygems_version: 3.2.3
142
+ rubygems_version: 3.5.3
142
143
  signing_key:
143
144
  specification_version: 4
144
145
  summary: String to integer mapping for PostgreSQL array columns.