array_enum 1.3.0 → 1.4.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 +4 -4
- data/.github/workflows/ci-on-merge.yml +59 -0
- data/.github/workflows/ci.yml +35 -17
- data/Gemfile.lock +2 -2
- data/README.md +37 -4
- data/lib/array_enum/version.rb +1 -1
- data/lib/array_enum.rb +10 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d2df08c37b57f1ab526c97e96687aaa26d6f4cdbbd7cf189a1671b4fc2ad309
|
4
|
+
data.tar.gz: a4a87c06b773f5b8210d67e869372e99e838853962789a5d030bd8ec2fbc9a9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 153d73f33212247cba61d862b31948bd66c50c352f2984fbfbe00c71ce77a8086a8925e3256bfa03013a32050442a6be7014da888493a3c422256ac85d24108a
|
7
|
+
data.tar.gz: 273ababe94efae433b8577e872cc44f0a69e85b482b9deda86dc83b39f0440d973e2755ca2bc85b7e36ab90d2313b77e0ed0dc94e932a4b681a26eeaf592a908
|
@@ -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: [2.7, '3.0', 3.1]
|
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@v2
|
44
|
+
|
45
|
+
- name : Ruby Setup
|
46
|
+
uses: ruby/setup-ruby@v1
|
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
|
data/.github/workflows/ci.yml
CHANGED
@@ -1,38 +1,56 @@
|
|
1
1
|
name: CI
|
2
2
|
|
3
|
-
on: [
|
3
|
+
on: [pull_request]
|
4
4
|
|
5
5
|
jobs:
|
6
|
-
|
6
|
+
test:
|
7
7
|
runs-on: ubuntu-latest
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby-version: [2.7, '3.0', 3.1]
|
11
|
+
|
8
12
|
services:
|
9
13
|
postgres:
|
10
|
-
image: postgres
|
14
|
+
image: postgres
|
11
15
|
ports:
|
12
|
-
|
16
|
+
- 5432:5432
|
13
17
|
env:
|
14
|
-
POSTGRES_PASSWORD:
|
18
|
+
POSTGRES_PASSWORD: postgres
|
19
|
+
options: >-
|
20
|
+
--health-cmd pg_isready
|
21
|
+
--health-interval 10s
|
22
|
+
--health-timeout 5s
|
23
|
+
--health-retries 5
|
15
24
|
|
16
25
|
steps:
|
17
26
|
- name: Install libraries
|
18
27
|
run: |
|
19
|
-
sudo apt-get update
|
20
28
|
sudo apt-get install -y libpq-dev postgresql-client
|
21
29
|
|
22
30
|
- name: Configure database
|
31
|
+
env:
|
32
|
+
PGPASSWORD: postgres
|
33
|
+
PGUSER: postgres
|
34
|
+
PGHOST: localhost
|
23
35
|
run: |
|
24
|
-
echo "
|
25
|
-
psql -
|
36
|
+
echo "Configuring PostgresSQL"
|
37
|
+
psql -c 'create database "array_enum_test";'
|
26
38
|
|
27
|
-
-
|
39
|
+
- name: Checkout code
|
40
|
+
uses: actions/checkout@v2
|
28
41
|
|
29
|
-
- name:
|
30
|
-
uses:
|
42
|
+
- name : Ruby Setup
|
43
|
+
uses: ruby/setup-ruby@v1
|
31
44
|
with:
|
32
|
-
ruby-version:
|
45
|
+
ruby-version: ${{ matrix.ruby-version }}
|
46
|
+
bundler-cache: true
|
33
47
|
|
34
|
-
- name:
|
35
|
-
run:
|
36
|
-
|
37
|
-
|
38
|
-
|
48
|
+
- name: Install dependencies
|
49
|
+
run: bundle install
|
50
|
+
|
51
|
+
- name: Run test
|
52
|
+
env:
|
53
|
+
PGPASSWORD: postgres
|
54
|
+
PGUSER: postgres
|
55
|
+
PGHOST: localhost
|
56
|
+
run: bundle exec rake -s test
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
[](https://badge.fury.io/rb/array_enum)
|
2
|
+
[](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
|
-
|
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/lib/array_enum/version.rb
CHANGED
data/lib/array_enum.rb
CHANGED
@@ -17,11 +17,17 @@ module ArrayEnum
|
|
17
17
|
mapping_hash
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
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, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
|
28
|
+
end
|
29
|
+
where("#{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
|
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.
|
4
|
+
version: 1.4.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:
|
11
|
+
date: 2022-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -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
|