array_enum 0.1.0 → 1.3.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: 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