acts-as-taggable-array-on 0.6.0 → 0.7.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: ad1ac43607f0f09763e87b8f283f01652a6176d74d7bb5d2c8685453a10501fc
4
- data.tar.gz: 31dadff61892909368696d09fb5248ec08786ac41333e315581325cf17b707a1
3
+ metadata.gz: 02127b9b3ed01db1bf067d182c677ec562e8c8030670019897f34af8ba44d231
4
+ data.tar.gz: 52feb971a781b61175d31b68b181fac94d2b60e8ad092cfcef0b2195ed6c6ce7
5
5
  SHA512:
6
- metadata.gz: ae034e443e607c4de43fe8df98fdccd89f15eb9cba552fd98c6fd8d97f238207271fbf2861adb5aef45c1ad9c3c534ad100a45eaad252baf62bf8c232037f44a
7
- data.tar.gz: e4b432be275ff891566b7f336c794980a74e6943cd7152610190c386e54c11c3a1c12b79466678a4e27d72cf945dd247960a917de8504733c6f3fa51a3b28754
6
+ metadata.gz: 54ed464914256f747d5bc784a237da30629ae5c5f57bc7dea2c40c48c19f427541cbc264a2b41da17dc49f394a3e7f0362b7ab7f00806f0a856ab32c1e22d900
7
+ data.tar.gz: dd87d5d2ff3272b4613a48fa79de16e70d8c7535b980cc6ddd2be7967725a761451273abb4dbc04c915481c2dba386ee6d1271f5054975c2a1f133d9cbebdbe8
@@ -0,0 +1,48 @@
1
+ name: "Running Tests"
2
+
3
+ on:
4
+ - pull_request
5
+
6
+ env:
7
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8
+
9
+ jobs:
10
+ test:
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ # Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
15
+ ruby: ['2.7', '3.0', '3.1', 'head']
16
+ runs-on: ubuntu-latest
17
+
18
+ services:
19
+ postgres:
20
+ image: postgres:11.6
21
+ env:
22
+ POSTGRES_USER: postgres
23
+ POSTGRES_PASSWORD: ""
24
+ POSTGRES_DB: postgres
25
+ ports: ["5432:5432"]
26
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
27
+ env:
28
+ RAILS_ENV: test
29
+ PGHOST: localhost
30
+ PGUSER: postgres
31
+
32
+ steps:
33
+ - uses: actions/checkout@v2
34
+ - uses: ruby/setup-ruby@v1
35
+ with:
36
+ ruby-version: ${{ matrix.ruby }}
37
+ # runs 'bundle install' and caches installed gems automatically
38
+ bundler-cache: true
39
+
40
+ - name: Create a database
41
+ run: rake db:create
42
+
43
+ - name: Install citext extension
44
+ run: |
45
+ psql -U postgres -d "acts-as-taggable-array-on_test" -c "CREATE EXTENSION IF NOT EXISTS citext;"
46
+
47
+ - name: Running a test
48
+ run: bundle exec rspec
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ spec/reports
16
16
  test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
+ .idea
data/.travis.yml CHANGED
@@ -1,13 +1,15 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.4.8
4
3
  - 2.5.7
5
4
  - 2.6.5
5
+ - 2.7.0
6
+ - 3.0.0
6
7
  services:
7
8
  - postgresql
8
9
  gemfile:
9
10
  - gemfiles/rails_5_2.gemfile
10
11
  - gemfiles/rails_6_0.gemfile
12
+ - gemfiles/rails_6_1.gemfile
11
13
  before_script:
12
14
  - cp config/database.yml.travis config/database.yml
13
15
  - bundle exec rake db:create
@@ -16,5 +18,5 @@ script:
16
18
  - bundle exec rspec
17
19
  matrix:
18
20
  exclude:
19
- - rvm: 2.4.8
20
- gemfile: gemfiles/rails_6_0.gemfile
21
+ - rvm: 3.0.0
22
+ gemfile: gemfiles/rails_5_2.gemfile
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.7.0
2
+ - Standard linter used as a style guide
3
+ - Ruby 2.4 support dropped
4
+ - Support for Ruby 3.0 added
5
+ - Support for Rails 6.1 added
6
+ - Support for citext arrays added
7
+
1
8
  ## 0.6
2
9
  - Drop support for `EOL` versions of Ruby (below `2.4)`, and Rails (below `5.2`)
3
10
  - Alias `acts_as_taggable_on` to `taggable_array`
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 acts-as-pgarray-taggable-on.gemspec
4
4
  gemspec
data/Guardfile CHANGED
@@ -1,5 +1,5 @@
1
- guard 'rspec', cmd: 'rspec --drb --color' do
1
+ guard "rspec", cmd: "rspec --drb --color" do
2
2
  watch(%r{^spec/.+_spec\.rb})
3
- watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
- watch('spec/spec_helper.rb') { "spec" }
3
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch("spec/spec_helper.rb") { "spec" }
5
5
  end
data/README.md CHANGED
@@ -1,15 +1,14 @@
1
1
  # ActsAsTaggableArrayOn
2
2
  [![Build Status](https://travis-ci.org/tmiyamon/acts-as-taggable-array-on.svg?branch=master)](https://travis-ci.org/tmiyamon/acts-as-taggable-array-on)
3
3
 
4
- A simple implementation for tagging system with postgres array. Please note, only PostgreSql database is supported.
5
-
4
+ A simple implementation for tagging system based on a database array type. Only PostgreSQL Arrays are currently supported.
6
5
 
7
6
  ## Installation
8
7
 
9
8
  Add this line to your application's Gemfile:
10
9
 
11
10
  ```ruby
12
- gem 'acts-as-taggable-array-on'
11
+ gem "acts-as-taggable-array-on"
13
12
  ```
14
13
 
15
14
  And then execute:
@@ -20,152 +19,157 @@ bundle
20
19
 
21
20
 
22
21
  ## Setup
23
-
24
- To use it, you need to have an array column to act as taggable.
22
+ To use it, you need to have an array column to act as taggable - `tags`.
25
23
 
26
24
  ```ruby
27
25
  class CreateUser < ActiveRecord::Migration
28
26
  def change
29
27
  create_table :users do |t|
30
- t.string :tags, array: true, default: '{}'
28
+ t.string :tags, array: true, default: []
31
29
  t.timestamps
32
30
  end
33
- add_index :users, :tags, using: 'gin'
31
+ add_index :users, :tags, using: "gin"
34
32
  end
35
33
  end
36
34
  ```
37
35
 
38
- and bundle:
36
+ - You can change from `string` to any other type here. But in case of any doubt, `string` is a great default.
37
+ - Make sure not to lose `default: []`, it's important to always have empty array as default.
38
+
39
+ Run a migration:
39
40
 
40
41
  ```shell
41
42
  rake db:migrate
42
43
  ```
43
44
 
44
- then
45
+ Indicate that attribute is "taggable" in a Rails model, like this:
45
46
 
46
47
  ```ruby
47
48
  class User < ActiveRecord::Base
48
49
  taggable_array :tags
49
50
  end
50
- @user = User.new(:name => "Bobby")
51
51
  ```
52
52
 
53
- acts_as_taggable_array_on defines 4 scope and 2 class methods as below.
54
-
55
- ### types
56
-
57
- currently, these types supported
58
-
59
- - varchar[]
60
- - text[]
61
- - integer[]
53
+ ### Types
54
+ We currently tested only following types for underlying arrays:
62
55
 
63
- ### scopes
64
-
65
- - with_any_#{tag_name}
66
- - with_all_#{tag_name}
67
- - without_any_#{tag_name}
68
- - without_all_#{tag_name}
69
-
70
- ### class methods
71
-
72
- - all_#{tag_name}
73
- - #{tag_name}_cloud
56
+ - `varchar[]`
57
+ - `t.string :tags, array: true, default: []`
58
+ - `add_column :users, :tags, :string, array: true, default: []`
59
+ - `text[]`
60
+ - `t.text :tags, array: true, default: []`
61
+ - `add_column :users, :tags, :text, array: true, default: []`
62
+ - `integer[]`
63
+ - `t.integer :tags, array: true, default: []`
64
+ - `add_column :users, :tags, :integer, array: true, default: []`
74
65
 
75
66
 
76
67
  ## Usage
77
68
 
78
- Set, add and remove
79
-
80
69
  ```ruby
81
70
  #set
82
- @user.tags = ["awesome", "slick"]
83
- @user.tags = '{awesome,slick}'
71
+ user.tags = ["awesome", "slick"]
72
+ user.tags = "{awesome,slick}"
84
73
 
85
74
  #add
86
- @user.tags += ["awesome"]
87
- @user.tags += ["awesome", "slick"]
75
+ user.tags += ["awesome"]
76
+ user.tags += ["awesome", "slick"]
77
+ user.tags << "awesome"
88
78
 
89
79
  #remove
90
- @user.tags -= ["awesome"]
91
- @user.tags -= ["awesome", "slick"]
80
+ user.tags -= ["awesome"]
81
+ user.tags -= ["awesome", "slick"]
92
82
  ```
93
83
 
94
- ### Finding Tagged Objects
84
+ ### Scopes
85
+
86
+ #### `with_any_#{tag_name}`
95
87
 
96
88
  ```ruby
97
- class User < ActiveRecord::Base
98
- taggable_array :tags
99
- scope :by_join_date, ->{order("created_at DESC")}
100
- end
89
+ # Find a user with any of the tags
90
+ User.with_any_tags("awesome, slick")
91
+ User.with_any_tags(["awesome", "slick"])
92
+ ```
101
93
 
94
+ #### `with_all_#{tag_name}`
95
+
96
+ ```ruby
102
97
  # Find a user with all of the tags
103
98
  User.with_all_tags("awesome, slick")
104
99
  User.with_all_tags(["awesome", "slick"])
100
+ ```
105
101
 
106
- # Find a user with any of the tags
107
- User.with_any_tags("awesome, slick")
108
- User.with_any_tags(["awesome", "slick"])
109
-
110
- # Find a user without all of the tags
111
- User.without_all_tags("awesome, slick")
112
- User.without_all_tags(["awesome", "slick"])
102
+ #### `without_any_#{tag_name}`
113
103
 
104
+ ```ruby
114
105
  # Find a user without any of the tags
115
106
  User.without_any_tags("awesome, slick")
116
107
  User.without_any_tags(["awesome", "slick"])
108
+ ```
117
109
 
118
- # Chain with the other scopes
119
- User.with_any_tags("awesome").without_any_tags("slick").by_join_date.paginate(:page => params[:page], :per_page => 20)
110
+ #### `without_all_#{tag_name}`
111
+
112
+ ```ruby
113
+ # Find a user without all of the tags
114
+ User.without_all_tags("awesome, slick")
115
+ User.without_all_tags(["awesome", "slick"])
120
116
  ```
121
117
 
122
- ### Tag cloud calculations
123
118
 
124
- Calculation to count for each tags is supported. Currently, it does not care its order.
119
+ ### Class methods
120
+
121
+ #### `all_#{tag_name}`
125
122
 
126
123
  ```ruby
127
- User.tags_cloud
128
- # [['awesome' => 1], ['slick' => 2]]
124
+ User.all_tags
125
+ # ["awesome", "slick"]
129
126
  ```
130
127
 
131
- Tag cloud calculation uses subquery internally. To add scopes to the query, use block.
128
+ You can use block to add scopes to the query.
132
129
 
133
130
  ```ruby
134
- User.tags_cloud { where name: ['ken', 'tom'] }
131
+ User.all_tags { where(name: ["ken", "tom"]) }
135
132
  ```
136
133
 
137
- To handle the result tags named 'tag' and 'count', prepend scopes.
134
+ Or simply use your existing scopes:
138
135
 
139
136
  ```ruby
140
- User.where('tag like ?', 'aws%').limit(10).order('count desc').tags_cloud { where name: ['ken', 'tom'] }
137
+ # scope :by_join_date, ->{order("created_at DESC")}
138
+ User.all_tags.by_join_date
141
139
  ```
142
140
 
143
- ### All Tags
144
-
145
- Can get all tags easily.
141
+ SQL field is named "tag" and you can use it to modify the query.
146
142
 
147
143
  ```ruby
148
- User.all_tags
149
- # ['awesome', 'slick']
144
+ User.where("tag like ?", "aws%").all_tags { where(name: ["ken", "tom"]) }
150
145
  ```
151
146
 
152
- As the same to tag cloud calculation, you can use block to add scopes to the query.
147
+ #### `#{tag_name}_cloud`
153
148
 
149
+ Calculates the number of occurrences of each tag.
154
150
 
155
151
  ```ruby
156
- User.all_tags { where name: ['ken', 'tom'] }
152
+ User.tags_cloud
153
+ # [["slick" => 2], ["awesome" => 1]]
157
154
  ```
158
155
 
159
- To handle the result tags named 'tag', prepend scopes.
156
+ You can use block to add scopes to the query.
160
157
 
161
158
  ```ruby
162
- User.where('tag like ?', 'aws%').all_tags { where name: ['ken', 'tom'] }
159
+ User.tags_cloud { where(name: ["ken", "tom"]) }
163
160
  ```
164
161
 
162
+ SQL fields are named "tag" and "count" and you can use them to modify the query.
163
+
164
+ ```ruby
165
+ User.where("tag like ?", "aws%").limit(10).order("count desc").tags_cloud { where(name: ["ken", "tom"]) }
166
+ ```
167
+
168
+
165
169
  ## Benchmark
166
- Based on the [article](https://adamnengland.wordpress.com/2014/02/19/benchmarks-acts-as-taggable-on-vs-postgresql-arrays/), I built [simple benchmark app](https://github.com/tmiyamon/acts-as-taggable-benchmark/) to compare only the main features acts-as-taggable-array-on has.
170
+ Based on the [article](https://adamnengland.wordpress.com/2014/02/19/benchmarks-acts-as-taggable-on-vs-postgresql-arrays/), I built [simple benchmark app](https://github.com/tmiyamon/acts-as-taggable-benchmark/) to compare only the main features ActsAsTaggableArrayOn has.
167
171
 
168
- This result does NOT insist acts-as-taggable-array-on is better than acts-as-taggable-on since it provides much more features than this gem.
172
+ This result does NOT insist ActsAsTaggableArrayOn is better than acts-as-taggable-on since it provides much more features than this gem.
169
173
  In the case you need simple tag functionality, acts-as-taggable-array-on may be helpful to improve its performance.
170
174
 
171
175
  ```bash
@@ -216,8 +220,10 @@ rake bench:write bench:find_by_id bench:find_by_tag 20.29s user 1.52s system 77
216
220
  ```
217
221
 
218
222
  ## Development
219
- To run testsuite you'll need to setup local PG database/user with `rake db:create`
223
+
224
+ - To run testsuite you'll need to setup local PG database/user with `rake db:create`
220
225
  After that just running `rspec` should work.
226
+ - Before submitting code for a review, please be sure to run `bundle exec standardrb --fix`
221
227
 
222
228
  ## Contributing
223
229
 
data/Rakefile CHANGED
@@ -1,9 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
3
  namespace :db do
4
- desc "Create database for tests"
4
+ desc "Create database for tests"
5
5
  task :create do
6
- puts %x( createuser -d acts-as-taggable-array-on -U postgres )
7
- puts %x( createdb --username=acts-as-taggable-array-on acts-as-taggable-array-on_test )
6
+ puts `createuser -d acts-as-taggable-array-on -U postgres`
7
+ puts `createdb --username=acts-as-taggable-array-on acts-as-taggable-array-on_test`
8
8
  end
9
9
  end
@@ -1,31 +1,31 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'acts-as-taggable-array-on/version'
3
+ require "acts-as-taggable-array-on/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "acts-as-taggable-array-on"
8
- spec.version = ActsAsTagPgarray::VERSION
9
- spec.authors = ["Takuya Miyamoto"]
10
- spec.email = ["miyamototakuya@gmail.com"]
11
- spec.summary = %q{Simple tagging gem for Rails using postgres array.}
12
- spec.description = %q{Simple tagging gem for Rails using postgres array.}
13
- spec.homepage = "https://github.com/tmiyamon/acts-as-taggable-array-on"
14
- spec.license = "MIT"
6
+ spec.name = "acts-as-taggable-array-on"
7
+ spec.version = ActsAsTagPgarray::VERSION
8
+ spec.authors = ["Takuya Miyamoto"]
9
+ spec.email = ["miyamototakuya@gmail.com"]
10
+ spec.summary = "Simple tagging gem for Rails using postgres array."
11
+ spec.description = "Simple tagging gem for Rails using postgres array."
12
+ spec.homepage = "https://github.com/tmiyamon/acts-as-taggable-array-on"
13
+ spec.license = "MIT"
15
14
 
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
18
  spec.require_paths = ["lib"]
20
19
 
21
- spec.add_runtime_dependency 'activerecord', ['>= 5.2']
22
- spec.add_runtime_dependency 'activesupport', ['>= 5.2']
20
+ spec.add_runtime_dependency "activerecord", [">= 5.2"]
21
+ spec.add_runtime_dependency "activesupport", [">= 5.2"]
23
22
 
24
- spec.add_development_dependency 'pg', '~> 1.1'
23
+ spec.add_development_dependency "pg", "~> 1.1"
25
24
 
26
25
  spec.add_development_dependency "bundler"
27
- spec.add_development_dependency "rake"
28
- spec.add_development_dependency "rspec-rails"
29
26
  spec.add_development_dependency "guard-rspec"
30
27
  spec.add_development_dependency "listen", "> 3.0"
28
+ spec.add_development_dependency "rake"
29
+ spec.add_development_dependency "rspec-rails"
30
+ spec.add_development_dependency "standard"
31
31
  end
@@ -1,7 +1,7 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in acts-as-pgarray-taggable-on.gemspec
4
- gemspec path: '../'
4
+ gemspec path: "../"
5
5
 
6
- gem 'activerecord', '~> 5.2.0'
7
- gem 'activesupport', '~> 5.2.0'
6
+ gem "activerecord", "~> 5.2.0"
7
+ gem "activesupport", "~> 5.2.0"
@@ -1,7 +1,7 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- # Specify your gem's dependencies in acts-as-pgarray-taggable-on.gemspec
4
- gemspec path: '../'
3
+ # Specify your gem's dependencies in acts-as-taggable-array-on.gemspec
4
+ gemspec path: "../"
5
5
 
6
- gem 'activerecord', '~> 6.0.0'
7
- gem 'activesupport', '~> 6.0.0'
6
+ gem "activerecord", "~> 6.0.3.4"
7
+ gem "activesupport", "~> 6.0.3.4"
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in acts-as-taggable-array-on.gemspec
4
+ gemspec path: "../"
5
+
6
+ gem "activerecord", "~> 6.1.0"
7
+ gem "activesupport", "~> 6.1.0"
@@ -5,7 +5,7 @@ module ActsAsTaggableArrayOn
5
5
  def parse tags
6
6
  case tags
7
7
  when String
8
- tags.split(/[ ]*,[ ]*/)
8
+ tags.split(/ *, */)
9
9
  else
10
10
  tags
11
11
  end
@@ -6,7 +6,7 @@ module ActsAsTaggableArrayOn
6
6
  base.extend(ClassMethod)
7
7
  end
8
8
 
9
- TYPE_MATCHER = { string: 'varchar', text: 'text', integer: 'integer' }
9
+ TYPE_MATCHER = {string: "varchar", text: "text", integer: "integer", citext: "citext"}
10
10
 
11
11
  module ClassMethod
12
12
  def acts_as_taggable_array_on(tag_name, *)
@@ -22,19 +22,19 @@ module ActsAsTaggableArrayOn
22
22
  define_method :"all_#{tag_name}" do |options = {}, &block|
23
23
  subquery_scope = unscoped.select("unnest(#{table_name}.#{tag_name}) as tag").distinct
24
24
  subquery_scope = subquery_scope.instance_eval(&block) if block
25
-
26
- from(subquery_scope).pluck('tag')
25
+ # Remove the STI inheritance type from the outer query since it is in the subquery
26
+ unscope(where: :type).from(subquery_scope).pluck(:tag)
27
27
  end
28
28
 
29
29
  define_method :"#{tag_name}_cloud" do |options = {}, &block|
30
30
  subquery_scope = unscoped.select("unnest(#{table_name}.#{tag_name}) as tag")
31
31
  subquery_scope = subquery_scope.instance_eval(&block) if block
32
-
33
- from(subquery_scope).group('tag').order('tag').pluck(Arel.sql('tag, count(*) as count'))
32
+ # Remove the STI inheritance type from the outer query since it is in the subquery
33
+ unscope(where: :type).from(subquery_scope).group(:tag).order(:tag).count(:tag)
34
34
  end
35
35
  end
36
36
  end
37
- alias taggable_array acts_as_taggable_array_on
37
+ alias_method :taggable_array, :acts_as_taggable_array_on
38
38
  end
39
39
  end
40
40
  end
@@ -1,3 +1,3 @@
1
1
  module ActsAsTagPgarray
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'active_record'
1
+ require "active_record"
2
2
 
3
3
  require "acts-as-taggable-array-on/version"
4
4
  require "acts-as-taggable-array-on/taggable"
@@ -1,22 +1,22 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe ActsAsTaggableArrayOn::Parser do
4
4
  let(:parser) { ActsAsTaggableArrayOn.parser }
5
5
 
6
- describe '#parse' do
6
+ describe "#parse" do
7
7
  it "return unprocessed tags if array" do
8
- tags = %w(red green)
8
+ tags = %w[red green]
9
9
  expect(parser.parse(tags)).to eq tags
10
10
  end
11
11
 
12
12
  it "return parsed tags if comma separated string" do
13
- tags = 'red,green'
14
- expect(parser.parse(tags)).to eq %w(red green)
13
+ tags = "red,green"
14
+ expect(parser.parse(tags)).to eq %w[red green]
15
15
  end
16
16
 
17
17
  it "return parsed tags if comma separated string including white spaces" do
18
- tags = 'red , gre en'
19
- expect(parser.parse(tags)).to eq ['red', 'gre en']
18
+ tags = "red , gre en"
19
+ expect(parser.parse(tags)).to eq ["red", "gre en"]
20
20
  end
21
21
  end
22
22
  end
@@ -1,16 +1,19 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe ActsAsTaggableArrayOn::Taggable do
4
4
  before do
5
- @user1 = User.create name: 'Tom', colors: ['red', 'blue'], sizes: ['medium', 'large'], codes: [456, 789]
6
- @user2 = User.create name: 'Ken', colors: ['black', 'white', 'red'], sizes: ['small', 'large'], codes: [123, 789]
7
- @user3 = User.create name: 'Joe', colors: ['black', 'blue'], sizes: ['small', 'medium', 'large'], codes: [123, 456, 789]
5
+ @user1 = User.create name: "Tom", colors: ["red", "blue"], sizes: ["medium", "large"], codes: [456, 789], roles: ["user"]
6
+ @user2 = User.create name: "Ken", colors: ["black", "white", "red"], sizes: ["small", "large"], codes: [123, 789], roles: ["User"]
7
+ @user3 = User.create name: "Joe", colors: ["black", "blue"], sizes: ["small", "medium", "large"], codes: [123, 456, 789], roles: ["login"]
8
+ @admin1 = Admin.create name: "Dick", colors: ["purple", "orange"], sizes: ["medium", "large"], codes: [123, 456, 789], roles: ["USER", "Admin"]
9
+ @admin2 = Admin.create name: "Harry", colors: ["white", "blue"], sizes: ["small", "large"], codes: [456, 123], roles: ["Admin"]
8
10
 
9
11
  User.acts_as_taggable_array_on :colors
10
12
  User.acts_as_taggable_array_on :sizes
13
+ User.acts_as_taggable_array_on :roles
11
14
  User.taggable_array :codes
12
- end
13
15
 
16
+ end
14
17
 
15
18
  context "without database table" do
16
19
  it "doesn't fail on class method call" do
@@ -49,109 +52,119 @@ describe ActsAsTaggableArrayOn::Taggable do
49
52
  end
50
53
  end
51
54
 
52
- it 'should define table name un-ambiguously' do
53
- sql = User.with_any_sizes(['small']).to_sql
55
+ it "should define table name un-ambiguously" do
56
+ sql = User.with_any_sizes(["small"]).to_sql
54
57
  expect(sql).to eql("SELECT \"users\".* FROM \"users\" WHERE (users.sizes && ARRAY['small']::text[])")
55
58
 
56
- sql = User.with_all_sizes(['small']).to_sql
59
+ sql = User.with_all_sizes(["small"]).to_sql
57
60
  expect(sql).to eql("SELECT \"users\".* FROM \"users\" WHERE (users.sizes @> ARRAY['small']::text[])")
58
61
 
59
- sql = User.without_any_sizes(['small']).to_sql
62
+ sql = User.without_any_sizes(["small"]).to_sql
60
63
  expect(sql).to eql("SELECT \"users\".* FROM \"users\" WHERE NOT (users.sizes && ARRAY['small']::text[])")
61
64
 
62
- sql = User.without_all_sizes(['small']).to_sql
65
+ sql = User.without_all_sizes(["small"]).to_sql
63
66
  expect(sql).to eql("SELECT \"users\".* FROM \"users\" WHERE NOT (users.sizes @> ARRAY['small']::text[])")
64
67
  end
65
68
 
66
69
  it "should work with ::text typed array" do
67
- expect(User.with_any_sizes(['small'])).to match_array([@user2,@user3])
68
- expect(User.with_all_sizes(['small', 'large'])).to match_array([@user2,@user3])
69
- expect(User.without_any_sizes('medium')).to match_array([@user2])
70
- expect(User.without_all_sizes('medium')).to match_array([@user2])
70
+ expect(User.with_any_sizes(["small"])).to match_array([@user2, @user3, @admin2])
71
+ expect(User.with_all_sizes(["small", "large"])).to match_array([@user2, @user3, @admin2])
72
+ expect(User.without_any_sizes("medium")).to match_array([@user2, @admin2])
73
+ expect(User.without_all_sizes("medium")).to match_array([@user2, @admin2])
74
+ end
75
+
76
+ it "should work with ::citext typed array" do
77
+ expect(User.with_any_roles(["admin"])).to match_array([@admin1, @admin2])
78
+ expect(User.with_all_roles(["User", "Admin"])).to match_array([@admin1])
79
+ expect(User.without_any_roles("USER")).to match_array([@user3, @admin2])
80
+ expect(User.without_all_roles("UseR")).to match_array([@user3, @admin2])
71
81
  end
72
82
 
73
83
  it "should work with ::integer typed array" do
74
- expect(User.with_any_codes([123])).to match_array([@user2,@user3])
75
- expect(User.with_all_codes([123, 789])).to match_array([@user2,@user3])
84
+ expect(User.with_any_codes([123])).to match_array([@user2, @user3, @admin1, @admin2])
85
+ expect(User.with_all_codes([123, 789])).to match_array([@user2, @user3, @admin1])
76
86
  expect(User.without_any_codes(456)).to match_array([@user2])
77
87
  expect(User.without_all_codes(456)).to match_array([@user2])
78
88
  end
79
89
 
80
90
  describe "#with_any_tags" do
81
91
  it "returns users having any tags of args" do
82
- expect(User.with_any_colors(['red', 'blue'])).to match_array([@user1,@user2,@user3])
83
- expect(User.with_any_colors('red, blue')).to match_array([@user1,@user2,@user3])
92
+ expect(User.with_any_colors(["red", "blue"])).to match_array([@user1, @user2, @user3, @admin2])
93
+ expect(User.with_any_colors("red, blue")).to match_array([@user1, @user2, @user3, @admin2])
84
94
  end
85
95
  end
86
96
 
87
97
  describe "#with_all_tags" do
88
98
  it "returns users having all tags of args" do
89
- expect(User.with_all_colors(['red', 'blue'])).to match_array([@user1])
90
- expect(User.with_all_colors('red, blue')).to match_array([@user1])
99
+ expect(User.with_all_colors(["red", "blue"])).to match_array([@user1])
100
+ expect(User.with_all_colors("red, blue")).to match_array([@user1])
91
101
  end
92
102
  end
93
103
 
94
104
  describe "#without_any_tags" do
95
105
  it "returns users not having any tags of args" do
96
- expect(User.without_any_colors(['red', 'blue'])).to match_array([])
97
- expect(User.without_any_colors('red, blue')).to match_array([])
106
+ expect(User.without_any_colors(["red", "blue"])).to match_array([@admin1])
107
+ expect(User.without_any_colors("red, blue")).to match_array([@admin1])
98
108
  end
99
109
  end
100
110
 
101
111
  describe "#without_all_tags" do
102
112
  it "returns users not having all tags of args" do
103
- expect(User.without_all_colors(['red', 'blue'])).to match_array([@user2,@user3])
104
- expect(User.without_all_colors('red, blue')).to match_array([@user2,@user3])
113
+ expect(User.without_all_colors(["red", "blue"])).to match_array([@user2, @user3, @admin1, @admin2])
114
+ expect(User.without_all_colors("red, blue")).to match_array([@user2, @user3, @admin1, @admin2])
105
115
  end
106
116
  end
107
117
 
108
118
  describe "#all_colors" do
109
119
  it "returns all of tag_name" do
110
- expect(User.all_colors).to match_array([@user1,@user2,@user3].map(&:colors).flatten.uniq)
120
+ expect(User.all_colors).to match_array([@user1, @user2, @user3, @admin1, @admin2].map(&:colors).flatten.uniq)
121
+ expect(Admin.all_colors).to match_array([@admin1, @admin2].map(&:colors).flatten.uniq)
111
122
  end
112
123
 
113
124
  it "returns filtered tags for tag_name with block" do
114
- expect(User.all_colors{where(name: ["Ken", "Joe"])}).to match_array([@user2,@user3].map(&:colors).flatten.uniq)
125
+ expect(User.all_colors { where(name: ["Ken", "Joe"]) }).to match_array([@user2, @user3].map(&:colors).flatten.uniq)
126
+ expect(Admin.all_colors { where(name: ["Dick", "Harry"]) }).to match_array([@admin1, @admin2].map(&:colors).flatten.uniq)
115
127
  end
116
128
 
117
129
  it "returns filtered tags for tag_name with prepended scope" do
118
- expect(User.where('tag like ?', 'bl%').all_colors).to match_array([@user1,@user2,@user3].map(&:colors).flatten.uniq.select{|name| name.start_with? 'bl'})
130
+ expect(User.where("tag like ?", "bl%").all_colors).to match_array([@user1, @user2, @user3].map(&:colors).flatten.uniq.select { |name| name.start_with? "bl" })
131
+ expect(Admin.where("tag like ?", "bl%").all_colors).to match_array([@admin2].map(&:colors).flatten.uniq.select { |name| name.start_with? "bl" })
119
132
  end
120
133
 
121
134
  it "returns filtered tags for tag_name with prepended scope and bock" do
122
- expect(User.where('tag like ?', 'bl%').all_colors{where(name: ["Ken", "Joe"])}).to match_array([@user2,@user3].map(&:colors).flatten.uniq.select{|name| name.start_with? 'bl'})
135
+ expect(User.where("tag like ?", "bl%").all_colors { where(name: ["Ken", "Joe"]) }).to match_array([@user2, @user3].map(&:colors).flatten.uniq.select { |name| name.start_with? "bl" })
123
136
  end
124
137
  end
125
138
 
126
139
  describe "#colors_cloud" do
127
140
  it "returns tag cloud for tag_name" do
128
141
  expect(User.colors_cloud).to match_array(
129
- [@user1,@user2,@user3].map(&:colors).flatten.group_by(&:to_s).map{|k,v| [k,v.count]}
142
+ [@user1, @user2, @user3, @admin1, @admin2].map(&:colors).flatten.group_by(&:to_s).map { |k, v| [k, v.count] }
130
143
  )
131
144
  end
132
145
 
133
146
  it "returns filtered tag cloud for tag_name with block" do
134
- expect(User.colors_cloud{where(name: ["Ken", "Joe"])}).to match_array(
135
- [@user2,@user3].map(&:colors).flatten.group_by(&:to_s).map{|k,v| [k,v.count]}
147
+ expect(User.colors_cloud { where(name: ["Ken", "Joe"]) }).to match_array(
148
+ [@user2, @user3].map(&:colors).flatten.group_by(&:to_s).map { |k, v| [k, v.count] }
136
149
  )
137
150
  end
138
151
 
139
152
  it "returns filtered tag cloud for tag_name with prepended scope" do
140
- expect(User.where('tag like ?', 'bl%').colors_cloud).to match_array(
141
- [@user1,@user2,@user3].map(&:colors).flatten.group_by(&:to_s).map{|k,v| [k,v.count]}.select{|name,count| name.start_with? 'bl'}
153
+ expect(User.where("tag like ?", "bl%").colors_cloud).to match_array(
154
+ [@user1, @user2, @user3, @admin2].map(&:colors).flatten.group_by(&:to_s).map { |k, v| [k, v.count] }.select { |name, count| name.start_with? "bl" }
142
155
  )
143
156
  end
144
157
 
145
158
  it "returns filtered tag cloud for tag_name with prepended scope and block" do
146
- expect(User.where('tag like ?', 'bl%').colors_cloud{where(name: ["Ken", "Joe"])}).to match_array(
147
- [@user2,@user3].map(&:colors).flatten.group_by(&:to_s).map{|k,v| [k,v.count]}.select{|name,count| name.start_with? 'bl'}
159
+ expect(User.where("tag like ?", "bl%").colors_cloud { where(name: ["Ken", "Joe"]) }).to match_array(
160
+ [@user2, @user3].map(&:colors).flatten.group_by(&:to_s).map { |k, v| [k, v.count] }.select { |name, count| name.start_with? "bl" }
148
161
  )
149
162
  end
150
163
  end
151
164
 
152
165
  describe "with complex scope" do
153
166
  it "works properly" do
154
- expect(User.without_any_colors('white').with_any_colors('blue').order(:created_at).limit(10)).to eq [@user1, @user3]
167
+ expect(User.without_any_colors("white").with_any_colors("blue").order(:created_at).limit(10)).to eq [@user1, @user3]
155
168
  end
156
169
  end
157
170
  end
data/spec/spec_helper.rb CHANGED
@@ -1,23 +1,24 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
- require 'rspec'
4
- require 'active_record/railtie'
3
+ require "rspec"
4
+ require "active_record/railtie"
5
5
  ActiveRecord::Base.logger = Logger.new(STDERR)
6
6
  ActiveRecord::Base.logger.level = 3
7
7
 
8
- require 'acts-as-taggable-array-on'
8
+ require "acts-as-taggable-array-on"
9
9
 
10
- #Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
10
+ # Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
11
 
12
12
  ActiveRecord::Migration.verbose = false
13
13
 
14
14
  class User < ActiveRecord::Base; end
15
+ class Admin < User; end
15
16
 
16
17
  RSpec.configure do |config|
17
18
  config.before(:all) do
18
19
  ActiveRecord::Base.establish_connection(
19
20
  adapter: "postgresql",
20
- encoding: 'unicode',
21
+ encoding: "unicode",
21
22
  database: "acts-as-taggable-array-on_test",
22
23
  username: "acts-as-taggable-array-on"
23
24
  )
@@ -34,12 +35,16 @@ RSpec.configure do |config|
34
35
  end
35
36
 
36
37
  def create_database
37
- ActiveRecord::Schema.define(:version => 1) do
38
+ ActiveRecord::Schema.define(version: 1) do
39
+ enable_extension("citext") unless extensions.include?("citext")
40
+
38
41
  create_table :users do |t|
39
42
  t.string :name
43
+ t.string :type
40
44
  t.string :colors, array: true, default: []
41
- t.text :sizes, array:true, default: []
45
+ t.text :sizes, array: true, default: []
42
46
  t.integer :codes, array: true, default: []
47
+ t.citext :roles, array: true, default: []
43
48
  t.timestamps null: true
44
49
  end
45
50
  end
data/spec_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'rubygems'
1
+ require "rubygems"
2
2
 
3
3
  RSpec::Matchers.define :my_matcher do |expected|
4
4
  match do |actual|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts-as-taggable-array-on
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takuya Miyamoto
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-02 00:00:00.000000000 Z
11
+ date: 2023-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: guard-rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,21 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rspec-rails
84
+ name: listen
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -95,7 +109,7 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: guard-rspec
112
+ name: rspec-rails
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ">="
@@ -109,19 +123,19 @@ dependencies:
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: listen
126
+ name: standard
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ">"
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
- version: '3.0'
131
+ version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ">"
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
- version: '3.0'
138
+ version: '0'
125
139
  description: Simple tagging gem for Rails using postgres array.
126
140
  email:
127
141
  - miyamototakuya@gmail.com
@@ -130,6 +144,7 @@ extensions: []
130
144
  extra_rdoc_files: []
131
145
  files:
132
146
  - ".editorconfig"
147
+ - ".github/workflows/tests.yml"
133
148
  - ".gitignore"
134
149
  - ".travis.yml"
135
150
  - CHANGELOG.md
@@ -142,6 +157,7 @@ files:
142
157
  - config/database.yml.travis
143
158
  - gemfiles/rails_5_2.gemfile
144
159
  - gemfiles/rails_6_0.gemfile
160
+ - gemfiles/rails_6_1.gemfile
145
161
  - lib/acts-as-taggable-array-on.rb
146
162
  - lib/acts-as-taggable-array-on/parser.rb
147
163
  - lib/acts-as-taggable-array-on/taggable.rb
@@ -154,7 +170,7 @@ homepage: https://github.com/tmiyamon/acts-as-taggable-array-on
154
170
  licenses:
155
171
  - MIT
156
172
  metadata: {}
157
- post_install_message:
173
+ post_install_message:
158
174
  rdoc_options: []
159
175
  require_paths:
160
176
  - lib
@@ -169,8 +185,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
185
  - !ruby/object:Gem::Version
170
186
  version: '0'
171
187
  requirements: []
172
- rubygems_version: 3.0.3
173
- signing_key:
188
+ rubygems_version: 3.3.7
189
+ signing_key:
174
190
  specification_version: 4
175
191
  summary: Simple tagging gem for Rails using postgres array.
176
192
  test_files: