array_enum 0.1.0 → 1.3.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
2
  SHA256:
3
- metadata.gz: 7bf65753b1960e7d732e9dbef138a7adb0f2873ea8ecd02a48623e837ce95fc2
4
- data.tar.gz: 2adaa2064958a2d39933c1803070493db15e55602b8311b80255cea1d1cf5604
3
+ metadata.gz: decd290271c41c2193a1e63f98a0df618c9a95813570aa01a32f27bd68d25865
4
+ data.tar.gz: da107aae087d6592ce0b33d8186170f41438b7be199737103a0b3bea4c13e53e
5
5
  SHA512:
6
- metadata.gz: e2a40dff60e27e34b11226ba300def97adcf6859ad6b6dfdb46539de8e7433b0b47db8a4a61cc727ff30bc091800d0e09c577d29065219c9e4a0f4298f4f7668
7
- data.tar.gz: 9efc6ad57fd3faa33f80dfb087246e894cec0d54bf83cc87a39b6cc680a52df32e82e581454e33feb1dd68b8d0e65fe4f3b8b5ad65a31bd82244d1de29a4e967
6
+ metadata.gz: 8a4e5a2c6cf33ec8fa943d13d0b1b852f20671598556abd638c7fb72d9175e83b355cc122b615c3aa1e109511313b4e163f30808ec0a9d4cdb9f422571cdac49
7
+ data.tar.gz: d984bfdf1addd82a03fc1098453c9141f6ca3fb3b13ba8f9b2e4cde5d9d7244379d1677a248dbae93c3f272fee6e679c15ada79136ca6c9ea71da9e55d1ef56f
@@ -0,0 +1,38 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ services:
9
+ postgres:
10
+ image: postgres:11
11
+ ports:
12
+ - 5432:5432
13
+ env:
14
+ POSTGRES_PASSWORD: ""
15
+
16
+ steps:
17
+ - name: Install libraries
18
+ run: |
19
+ sudo apt-get update
20
+ sudo apt-get install -y libpq-dev postgresql-client
21
+
22
+ - name: Configure database
23
+ run: |
24
+ echo "PostgreSQL"
25
+ psql -h localhost -c 'create database "array_enum_test";' -U postgres
26
+
27
+ - uses: actions/checkout@v1
28
+
29
+ - name: Set up Ruby
30
+ uses: actions/setup-ruby@v1
31
+ with:
32
+ ruby-version: 2.6.x
33
+
34
+ - name: Build and test
35
+ run: |
36
+ gem install bundler
37
+ bundle install --jobs 4 --retry 3
38
+ bundle exec rake test
data/Gemfile.lock CHANGED
@@ -1,32 +1,32 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- array_enum (0.1.0)
4
+ array_enum (1.3.0)
5
+ activemodel
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
9
- activemodel (5.2.2)
10
- activesupport (= 5.2.2)
11
- activerecord (5.2.2)
12
- activemodel (= 5.2.2)
13
- activesupport (= 5.2.2)
14
- arel (>= 9.0)
15
- activesupport (5.2.2)
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)
16
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
- i18n (>= 0.7, < 2)
18
- minitest (~> 5.1)
19
- tzinfo (~> 1.1)
20
- arel (9.0.0)
21
- concurrent-ruby (1.1.4)
22
- i18n (1.4.0)
17
+ i18n (>= 1.6, < 2)
18
+ minitest (>= 5.1)
19
+ tzinfo (~> 2.0)
20
+ zeitwerk (~> 2.3)
21
+ concurrent-ruby (1.1.8)
22
+ i18n (1.8.9)
23
23
  concurrent-ruby (~> 1.0)
24
24
  minitest (5.11.3)
25
- pg (1.1.3)
26
- rake (12.3.2)
27
- thread_safe (0.3.6)
28
- tzinfo (1.2.5)
29
- thread_safe (~> 0.1)
25
+ pg (1.1.4)
26
+ rake (12.3.3)
27
+ tzinfo (2.0.4)
28
+ concurrent-ruby (~> 1.0)
29
+ zeitwerk (2.4.2)
30
30
 
31
31
  PLATFORMS
32
32
  ruby
@@ -40,4 +40,4 @@ DEPENDENCIES
40
40
  rake (>= 10.0)
41
41
 
42
42
  BUNDLED WITH
43
- 1.17.3
43
+ 2.0.2
data/README.md CHANGED
@@ -8,6 +8,8 @@ Extension for `ActiveRecord` that adds support for `PostgreSQL` array columns, m
8
8
 
9
9
  ## Usage
10
10
 
11
+ ### ActiveRecord extension
12
+
11
13
  Database will store integers that after reading will map to string values.
12
14
  Additionally scope is generated with `with_` prefix that will query database for any matching passed value.
13
15
 
@@ -26,12 +28,29 @@ end
26
28
 
27
29
  user = User.create!(favourite_colors: ["red", "green"])
28
30
  user.favourite_colors # => ["red", "green"]
31
+ User.favourite_colors # => {"red" => 1, "blue" => 2}
29
32
  User.with_favourite_colors("red") # => [user]
30
33
  ```
31
34
 
32
- ## Development
35
+ ### Subset Validator
36
+
37
+ Additionally `subset` validator is provided that can help to ensure correct values are passed during validation.
38
+
39
+ ```ruby
40
+ class CreateUser
41
+ include ActiveModel::Model
42
+
43
+ attr_accessor :favourite_colors
33
44
 
34
- [![Build Status](https://travis-ci.com/freeletics/array_enum.svg?branch=master)](https://travis-ci.com/freeletics/array_enum)
45
+ validates :favourite_colors, subset: ["green", "blue"]
46
+ # or:
47
+ # validates :favourite_colors, subset: { in: ->(record) { Color.pluck(:name) } }
48
+ end
49
+
50
+ CreateUser.new(favourite_colors: ["black"]).valid? # => false
51
+ ```
52
+
53
+ ## Development
35
54
 
36
55
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
37
56
 
data/array_enum.gemspec CHANGED
@@ -33,6 +33,10 @@ Gem::Specification.new do |spec|
33
33
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
34
34
  spec.require_paths = ["lib"]
35
35
 
36
+ spec.required_ruby_version = ">= 2.3"
37
+
38
+ spec.add_dependency "activemodel"
39
+
36
40
  spec.add_development_dependency "activerecord"
37
41
  spec.add_development_dependency "pg"
38
42
  spec.add_development_dependency "bundler", ">= 1.17"
data/lib/array_enum.rb CHANGED
@@ -1,21 +1,37 @@
1
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"
2
6
 
3
7
  module ArrayEnum
8
+ MISSING_VALUE_MESSAGE = "%{value} is not a valid value for %{attr}".freeze
9
+ private_constant :MISSING_VALUE_MESSAGE
10
+
4
11
  def array_enum(definitions)
5
12
  definitions.each do |attr_name, mapping|
6
13
  attr_symbol = attr_name.to_sym
14
+ mapping_hash = ActiveSupport::HashWithIndifferentAccess.new(mapping)
15
+
16
+ define_singleton_method(attr_name.to_s.pluralize) do
17
+ mapping_hash
18
+ end
7
19
 
8
20
  define_singleton_method("with_#{attr_name}".to_sym) do |values|
9
- db_values = Array(values).map { |value| mapping.fetch(value.to_s) }
21
+ db_values = Array(values).map do |value|
22
+ mapping_hash[value] || raise(ArgumentError, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
23
+ end
10
24
  where("#{attr_name} @> ARRAY[:db_values]", db_values: db_values)
11
25
  end
12
26
 
13
27
  define_method(attr_symbol) do
14
- Array(self[attr_symbol]).map { |value| mapping.key(value) }
28
+ Array(self[attr_symbol]).map { |value| mapping_hash.key(value) }
15
29
  end
16
30
 
17
31
  define_method("#{attr_name}=".to_sym) do |values|
18
- self[attr_symbol] = Array(values).map { |value| mapping.fetch(value.to_s) }.uniq
32
+ self[attr_symbol] = Array(values).map do |value|
33
+ mapping_hash[value] || raise(ArgumentError, MISSING_VALUE_MESSAGE % {value: value, attr: attr_name})
34
+ end.uniq
19
35
  end
20
36
  end
21
37
  end
@@ -0,0 +1,8 @@
1
+ require "rails/railtie"
2
+
3
+ class ArrayEnum::Railtie < Rails::Railtie
4
+ initializer "array_enum.subset_validator" do
5
+ # ActiveModel expects top level class name for validator to have syntax "validates subset: []"
6
+ ::SubsetValidator = ArrayEnum::SubsetValidator unless defined?(::SubsetValidator)
7
+ end
8
+ end
@@ -0,0 +1,20 @@
1
+ require "active_model/validator"
2
+
3
+ class ArrayEnum::SubsetValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ wrapped_value = [value].flatten # Handles nil value
6
+ subset = delimiter.respond_to?(:call) ? delimiter.call(record) : delimiter
7
+
8
+ diff = wrapped_value.reject { |element| subset.include?(element) }
9
+
10
+ unless diff.empty?
11
+ record.errors.add(attribute, :inclusion, **options.except(:in, :within).merge!(value: diff))
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def delimiter
18
+ @delimiter ||= options[:in] || options[:within]
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module ArrayEnum
2
- VERSION = "0.1.0"
2
+ VERSION = "1.3.0"
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: array_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wojciech Wnętrzak
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-02 00:00:00.000000000 Z
11
+ date: 2021-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: activerecord
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -89,8 +103,8 @@ executables: []
89
103
  extensions: []
90
104
  extra_rdoc_files: []
91
105
  files:
106
+ - ".github/workflows/ci.yml"
92
107
  - ".gitignore"
93
- - ".travis.yml"
94
108
  - Gemfile
95
109
  - Gemfile.lock
96
110
  - LICENSE.txt
@@ -100,6 +114,8 @@ files:
100
114
  - bin/console
101
115
  - bin/setup
102
116
  - lib/array_enum.rb
117
+ - lib/array_enum/railtie.rb
118
+ - lib/array_enum/subset_validator.rb
103
119
  - lib/array_enum/version.rb
104
120
  homepage: https://github.com/freeletics/array_enum
105
121
  licenses:
@@ -107,7 +123,7 @@ licenses:
107
123
  metadata:
108
124
  homepage_uri: https://github.com/freeletics/array_enum
109
125
  source_code_uri: https://github.com/freeletics/array_enum
110
- post_install_message:
126
+ post_install_message:
111
127
  rdoc_options: []
112
128
  require_paths:
113
129
  - lib
@@ -115,15 +131,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
131
  requirements:
116
132
  - - ">="
117
133
  - !ruby/object:Gem::Version
118
- version: '0'
134
+ version: '2.3'
119
135
  required_rubygems_version: !ruby/object:Gem::Requirement
120
136
  requirements:
121
137
  - - ">="
122
138
  - !ruby/object:Gem::Version
123
139
  version: '0'
124
140
  requirements: []
125
- rubygems_version: 3.0.2
126
- signing_key:
141
+ rubygems_version: 3.2.3
142
+ signing_key:
127
143
  specification_version: 4
128
144
  summary: String to integer mapping for PostgreSQL array columns.
129
145
  test_files: []
data/.travis.yml DELETED
@@ -1,16 +0,0 @@
1
- dist: xenial
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6.0
6
-
7
- addons:
8
- postgresql: "10"
9
-
10
- before_script:
11
- - psql -c 'create database "array_enum_test";' -U postgres
12
-
13
- script: "bundle exec rake"
14
-
15
- notifications:
16
- disabled: true