pg_tags_on 0.1.1

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.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +9 -0
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +6 -0
  8. data/Gemfile.lock +91 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +195 -0
  11. data/Rakefile +16 -0
  12. data/bin/console +16 -0
  13. data/bin/setup +8 -0
  14. data/lib/pg_tags_on/active_record/arel.rb +66 -0
  15. data/lib/pg_tags_on/active_record/base.rb +41 -0
  16. data/lib/pg_tags_on/benchmark/benchmark.rb +52 -0
  17. data/lib/pg_tags_on/predicate_handler/array_integer_handler.rb +9 -0
  18. data/lib/pg_tags_on/predicate_handler/array_jsonb_handler.rb +31 -0
  19. data/lib/pg_tags_on/predicate_handler/array_jsonb_with_attrs_handler.rb +41 -0
  20. data/lib/pg_tags_on/predicate_handler/array_string_handler.rb +9 -0
  21. data/lib/pg_tags_on/predicate_handler/array_text_handler.rb +9 -0
  22. data/lib/pg_tags_on/predicate_handler/base_handler.rb +89 -0
  23. data/lib/pg_tags_on/predicate_handler.rb +64 -0
  24. data/lib/pg_tags_on/repositories/array_jsonb_repository.rb +88 -0
  25. data/lib/pg_tags_on/repositories/array_repository.rb +103 -0
  26. data/lib/pg_tags_on/repositories/base_repository.rb +44 -0
  27. data/lib/pg_tags_on/repository.rb +59 -0
  28. data/lib/pg_tags_on/tag.rb +31 -0
  29. data/lib/pg_tags_on/tags_query.rb +27 -0
  30. data/lib/pg_tags_on/validations/validator.rb +43 -0
  31. data/lib/pg_tags_on/version.rb +5 -0
  32. data/lib/pg_tags_on.rb +56 -0
  33. data/pg_tags_on.gemspec +38 -0
  34. data/spec/array_integers/records_spec.rb +47 -0
  35. data/spec/array_integers/tag_ops_spec.rb +65 -0
  36. data/spec/array_integers/taggings_spec.rb +27 -0
  37. data/spec/array_integers/tags_spec.rb +53 -0
  38. data/spec/array_jsonb/records_spec.rb +89 -0
  39. data/spec/array_jsonb/tag_ops_spec.rb +115 -0
  40. data/spec/array_jsonb/taggings_spec.rb +27 -0
  41. data/spec/array_jsonb/tags_spec.rb +41 -0
  42. data/spec/array_strings/records_spec.rb +61 -0
  43. data/spec/array_strings/tag_ops_spec.rb +65 -0
  44. data/spec/array_strings/taggings_spec.rb +27 -0
  45. data/spec/array_strings/tags_spec.rb +54 -0
  46. data/spec/config/database.yml +6 -0
  47. data/spec/configuration_spec.rb +48 -0
  48. data/spec/helpers/database_helpers.rb +46 -0
  49. data/spec/spec_helper.rb +39 -0
  50. data/spec/support/factory.rb +47 -0
  51. data/spec/tags_query_spec.rb +31 -0
  52. data/spec/validator_spec.rb +40 -0
  53. data/tasks/benchmark.rake +58 -0
  54. metadata +260 -0
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'ArrayStrings::Tags' do
4
+ before(:all) do
5
+ @column = :tags_str # defined as instance var as it is used in before_all callback
6
+ Entity.pg_tags_on @column
7
+ truncate && Factory.array_strings
8
+ end
9
+
10
+ let(:column) { @column }
11
+ let(:ref) { %("#{Entity.table_name}"."#{column}") }
12
+ let(:relation) { Entity.send(column) }
13
+
14
+ it 'find all tags' do
15
+ tags = relation.all.order('name')
16
+
17
+ expect(tags.size).to be_eql(4)
18
+ expect(tags.map(&:name)).to be_eql(%w[a b c d])
19
+ end
20
+
21
+ it 'find all tags for filtered records' do
22
+ tags = Entity.where(attr: 'test2').send(column).all
23
+
24
+ expect(tags.size).to be_eql(2)
25
+ expect(tags.map(&:name)).to be_eql(%w[b c])
26
+ end
27
+
28
+ it 'find all tags with counts' do
29
+ tag = relation.all_with_counts.first
30
+
31
+ expect(tag.count).to be_eql(1)
32
+ end
33
+
34
+ it 'count tags' do
35
+ expect(relation.count).to be_eql(4)
36
+ end
37
+
38
+ it 'count tags for filtered records' do
39
+ expect(Entity.where(attr: 'test2').send(column).count).to be_eql(2)
40
+ end
41
+
42
+ context 'cast integers to strings' do
43
+ before do
44
+ Entity.create(attr: 'int1', column => [1])
45
+ end
46
+
47
+ it 'find tags in numeric format' do
48
+ tags = relation.all.where(name: 1)
49
+
50
+ expect(tags.size).to be_eql(1)
51
+ expect(tags.map(&:name)).to be_eql(['1'])
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,6 @@
1
+ adapter: postgresql
2
+ host: <%= ENV.fetch("PG_HOST") { "localhost" } %>
3
+ port: <%= ENV.fetch("PG_PORT") { 5432 } %>
4
+ username: <%= ENV.fetch("PG_USER") { raise "PG_USER env. not set" } %>
5
+ password: <%= ENV.fetch("PG_PSWD") { raise "PG_PSWD env. not set" } %>
6
+ database: <%= ENV.fetch("PG_TAGS_ON_DB") { raise "PG_TAGS_ON_DB env. not set" } %>
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'configuration' do
4
+ before do
5
+ Entity.pg_tags_on_reset
6
+ end
7
+
8
+ it 'should set query class' do
9
+ PgTagsOn.configure do |c|
10
+ c.query_class = 'Tagz'
11
+ end
12
+ Entity.pg_tags_on :tags_int
13
+
14
+ expect(Kernel.const_defined?('Tagz')).to be_truthy
15
+ end
16
+
17
+ it 'should set columns for multiple models' do
18
+ class Entity1 < ActiveRecord::Base
19
+ self.table_name = 'entities'
20
+ pg_tags_on :tags_int
21
+ end
22
+
23
+ class Entity2 < ActiveRecord::Base
24
+ self.table_name = 'entities'
25
+ pg_tags_on :tags_str
26
+ end
27
+
28
+ expect(Entity1.pg_tags_on_settings).to be_eql('tags_int' => {})
29
+ expect(Entity2.pg_tags_on_settings).to be_eql('tags_str' => {})
30
+ end
31
+
32
+ it 'should set multiple columns for the same model' do
33
+ Entity.pg_tags_on :tags_int
34
+ Entity.pg_tags_on :tags_str
35
+
36
+ expect(Entity.pg_tags_on_settings).to be_eql('tags_int' => {}, 'tags_str' => {})
37
+ end
38
+
39
+ it 'should raise error if column does not exists' do
40
+ expect { Entity.pg_tags_on(:dummy) }.to raise_error(PgTagsOn::ColumnNotFoundError)
41
+ end
42
+
43
+ it 'should create named scopes' do
44
+ Entity.pg_tags_on :tags_int
45
+
46
+ expect(Entity).to respond_to(:tags_int)
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DatabaseHelpers
4
+ def establish_connection
5
+ ActiveRecord::Base.establish_connection(config)
6
+ end
7
+
8
+ def config
9
+ @config ||= begin
10
+ file = File.expand_path('../config/database.yml', File.dirname(__FILE__))
11
+ YAML.safe_load(ERB.new(File.read(file)).result)
12
+ end
13
+ end
14
+
15
+ def load_schema
16
+ @connection = ActiveRecord::Base.connection
17
+ @connection.drop_table :entities
18
+ @connection.transaction do
19
+ @connection.create_table :entities, force: true do |t|
20
+ t.integer :tags_int, array: true
21
+ t.string :tags_str, array: true
22
+ t.text :tags_text, array: true
23
+ t.jsonb :tags_jsonb, array: true
24
+ t.string :attr
25
+ end
26
+ @connection.add_index :entities, :tags_str, using: 'gin'
27
+ end
28
+ end
29
+
30
+ def truncate
31
+ ActiveRecord::Base.connection.truncate(Entity.table_name)
32
+ end
33
+
34
+ def encode_json(json)
35
+ case json
36
+ when String
37
+ ActiveSupport::JSON.encode(json)
38
+ when Hash
39
+ ActiveSupport::JSON.encode(json.to_json)
40
+ when Array
41
+ "'{" + json.map { |item| encode_json(item) }.join(',') + "}'"
42
+ end
43
+ end
44
+
45
+ module_function :config, :establish_connection, :load_schema, :truncate
46
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ WITH_COVERAGE = ENV['COVERAGE']
4
+
5
+ if WITH_COVERAGE
6
+ require 'simplecov'
7
+ SimpleCov.start do
8
+ add_filter %r{/benchmark/}
9
+ end
10
+ end
11
+
12
+ require 'pg'
13
+ require 'active_record'
14
+ require 'bundler/setup'
15
+ require 'pg_tags_on'
16
+ require 'helpers/database_helpers'
17
+ require 'support/factory'
18
+ require 'pry'
19
+
20
+ RSpec.configure do |config|
21
+ # Enable flags like --only-failures and --next-failure
22
+ config.example_status_persistence_file_path = '.rspec_status'
23
+
24
+ # Disable RSpec exposing methods globally on `Module` and `main`
25
+ config.disable_monkey_patching!
26
+
27
+ config.expect_with :rspec do |c|
28
+ c.syntax = :expect
29
+ end
30
+
31
+ config.include DatabaseHelpers
32
+
33
+ config.before(:all) do
34
+ DatabaseHelpers.establish_connection
35
+ DatabaseHelpers.load_schema
36
+ end
37
+ end
38
+
39
+ Entity = Class.new(::ActiveRecord::Base)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Factory
4
+ def self.array_strings
5
+ Entity.insert_all([
6
+ { tags_str: %w[a b c], attr: 'test1' },
7
+ { tags_str: %w[b c], attr: 'test2' },
8
+ { tags_str: ['d'], attr: 'test3' }
9
+ ])
10
+ end
11
+
12
+ def self.array_integers
13
+ Entity.insert_all([
14
+ { tags_int: [1, 2, 3], attr: 'test1' },
15
+ { tags_int: [2, 3], attr: 'test2' },
16
+ { tags_int: [4], attr: 'test3' }
17
+ ])
18
+ end
19
+
20
+ def self.array_jsonb
21
+ Entity.insert_all([
22
+ { tags_jsonb: [{ name: 'a' },
23
+ { name: 'b' },
24
+ { name: 'c' }],
25
+ attr: 'test1' },
26
+ { tags_jsonb: [{ name: 'b' },
27
+ { name: 'c' }],
28
+ attr: 'test2' },
29
+ { tags_jsonb: [{ name: 'd' }],
30
+ attr: 'test3' }
31
+ ])
32
+ end
33
+
34
+ def self.array_jsonb_with_attrs
35
+ Entity.insert_all([
36
+ { tags_jsonb: [{ name: 'a', meta: 'a' },
37
+ { name: 'b', meta: 'b' },
38
+ { name: 'c', meta: 'c' }],
39
+ attr: 'test1' },
40
+ { tags_jsonb: [{ name: 'b', meta: 'b' },
41
+ { name: 'c', meta: 'c' }],
42
+ attr: 'test2' },
43
+ { tags_jsonb: [{ name: 'd', meta: 'd' }],
44
+ attr: 'test3' }
45
+ ])
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'TagsQuery' do
4
+ it 'accept String arguments' do
5
+ query = PgTagsOn::TagsQuery.all('a')
6
+
7
+ expect(query.value).to be_eql('a')
8
+ expect(query.predicate).to be_eql('all')
9
+ end
10
+
11
+ it 'accept Integer arguments' do
12
+ query = PgTagsOn::TagsQuery.all(1)
13
+
14
+ expect(query.value).to be_eql(1)
15
+ expect(query.predicate).to be_eql('all')
16
+ end
17
+
18
+ it 'accept Array arguments' do
19
+ query = PgTagsOn::TagsQuery.all(%w[a b c])
20
+
21
+ expect(query.value).to be_eql(%w[a b c])
22
+ expect(query.predicate).to be_eql('all')
23
+ end
24
+
25
+ it 'accept arguments list' do
26
+ query = PgTagsOn::TagsQuery.all('a', 'b', 'c')
27
+
28
+ expect(query.value).to be_eql(%w[a b c])
29
+ expect(query.predicate).to be_eql('all')
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe 'Validator' do
4
+ before(:all) do
5
+ Entity.pg_tags_on :tags_str, limit: 2, tag_length: 3
6
+ Entity.pg_tags_on :tags_jsonb, key: :name, limit: 2, tag_length: 3
7
+ end
8
+
9
+ context 'string tags' do
10
+ it 'add errors if number of tags exceeds limit' do
11
+ entity = Entity.new(tags_str: %w[a b c])
12
+ entity.valid?
13
+
14
+ expect(entity.errors.full_messages.first).to include('size exceeded')
15
+ end
16
+
17
+ it 'add errors if tag length exceeds limit' do
18
+ entity = Entity.new(tags_str: %w[a x123])
19
+ entity.valid?
20
+
21
+ expect(entity.errors.full_messages.first).to include('length exceeded')
22
+ end
23
+ end
24
+
25
+ context 'jsonb tags' do
26
+ it 'add errors if number of tags exceeds limit' do
27
+ entity = Entity.new(tags_jsonb: [{ name: 'a' }, { name: 'b' }, { name: 'c' }])
28
+ entity.valid?
29
+
30
+ expect(entity.errors.full_messages.first).to include('size exceeded')
31
+ end
32
+
33
+ it 'add errors if tag length exceeds limit' do
34
+ entity = Entity.new(tags_jsonb: [{ name: 'x123' }])
35
+ entity.valid?
36
+
37
+ expect(entity.errors.full_messages.first).to include('length exceeded')
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'benchmark'
4
+ require './spec/helpers/database_helpers'
5
+ require 'lib/pg_tags_on'
6
+ require 'pry'
7
+
8
+ namespace :pg_tags_on do
9
+ task :benchmark do
10
+ DatabaseHelpers.establish_connection
11
+ DatabaseHelpers.load_schema
12
+
13
+ Entity = Class.new(::ActiveRecord::Base)
14
+ Entity.pg_tags_on :tags_int
15
+ Entity.pg_tags_on :tags_str
16
+ Entity.pg_tags_on :tags_jsonb, key: :name
17
+
18
+ puts 'How many records to generate? (default 10_000)'
19
+ records = STDIN.gets.chomp.to_i
20
+ puts 'Minimum tags per record (default 1):'
21
+ min_tags = STDIN.gets.chomp.to_i
22
+ puts 'Maximum tags per record (default 10):'
23
+ max_tags = STDIN.gets.chomp.to_i
24
+
25
+ records = 10_000 if records.zero?
26
+ min_tags = 1 if min_tags.zero?
27
+ max_tags = 10 if max_tags.zero?
28
+
29
+ data = []
30
+ str_tags = Array.new(100) { Faker::Name.first_name }
31
+
32
+ puts "Generating #{records} records..."
33
+ records.times do
34
+ tags_count = rand(min_tags..max_tags)
35
+
36
+ data << {
37
+ tags_int: Array.new(tags_count) { rand(1..100) },
38
+ tags_str: str_tags.sample(tags_count),
39
+ tags_jsonb: Array.new(tags_count) { { name: str_tags.sample } }
40
+ }
41
+
42
+ if data.size == 5_000
43
+ Entity.insert_all data
44
+ data = []
45
+ end
46
+ end
47
+
48
+ Entity.insert_all(data) if data.present?
49
+ puts 'Done'
50
+
51
+ puts "\n\n* character varying[]\n\n"
52
+ PgTagsOn::Benchmark.new(Entity, :tags_str).call
53
+ puts "\n\n* integer[]\n\n"
54
+ PgTagsOn::Benchmark.new(Entity, :tags_int).call
55
+ puts "\n\n* jsonb[]\n\n"
56
+ PgTagsOn::Benchmark.new(Entity, :tags_jsonb).call
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,260 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pg_tags_on
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Catalin Marinescu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-03-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '6.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faker
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.12'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.12'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '13.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '13.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.9'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.80'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.80'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.18'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.18'
153
+ description: A gem that makes working with tags stored in a Postgresql column easy.Support
154
+ for array of string, integer and jsonb values.
155
+ email:
156
+ - catalin.marinescu@gmail.com
157
+ executables:
158
+ - console
159
+ - setup
160
+ extensions: []
161
+ extra_rdoc_files: []
162
+ files:
163
+ - ".gitignore"
164
+ - ".rspec"
165
+ - ".rubocop.yml"
166
+ - CHANGELOG.md
167
+ - CODE_OF_CONDUCT.md
168
+ - Gemfile
169
+ - Gemfile.lock
170
+ - LICENSE.txt
171
+ - README.md
172
+ - Rakefile
173
+ - bin/console
174
+ - bin/setup
175
+ - lib/pg_tags_on.rb
176
+ - lib/pg_tags_on/active_record/arel.rb
177
+ - lib/pg_tags_on/active_record/base.rb
178
+ - lib/pg_tags_on/benchmark/benchmark.rb
179
+ - lib/pg_tags_on/predicate_handler.rb
180
+ - lib/pg_tags_on/predicate_handler/array_integer_handler.rb
181
+ - lib/pg_tags_on/predicate_handler/array_jsonb_handler.rb
182
+ - lib/pg_tags_on/predicate_handler/array_jsonb_with_attrs_handler.rb
183
+ - lib/pg_tags_on/predicate_handler/array_string_handler.rb
184
+ - lib/pg_tags_on/predicate_handler/array_text_handler.rb
185
+ - lib/pg_tags_on/predicate_handler/base_handler.rb
186
+ - lib/pg_tags_on/repositories/array_jsonb_repository.rb
187
+ - lib/pg_tags_on/repositories/array_repository.rb
188
+ - lib/pg_tags_on/repositories/base_repository.rb
189
+ - lib/pg_tags_on/repository.rb
190
+ - lib/pg_tags_on/tag.rb
191
+ - lib/pg_tags_on/tags_query.rb
192
+ - lib/pg_tags_on/validations/validator.rb
193
+ - lib/pg_tags_on/version.rb
194
+ - pg_tags_on.gemspec
195
+ - spec/array_integers/records_spec.rb
196
+ - spec/array_integers/tag_ops_spec.rb
197
+ - spec/array_integers/taggings_spec.rb
198
+ - spec/array_integers/tags_spec.rb
199
+ - spec/array_jsonb/records_spec.rb
200
+ - spec/array_jsonb/tag_ops_spec.rb
201
+ - spec/array_jsonb/taggings_spec.rb
202
+ - spec/array_jsonb/tags_spec.rb
203
+ - spec/array_strings/records_spec.rb
204
+ - spec/array_strings/tag_ops_spec.rb
205
+ - spec/array_strings/taggings_spec.rb
206
+ - spec/array_strings/tags_spec.rb
207
+ - spec/config/database.yml
208
+ - spec/configuration_spec.rb
209
+ - spec/helpers/database_helpers.rb
210
+ - spec/spec_helper.rb
211
+ - spec/support/factory.rb
212
+ - spec/tags_query_spec.rb
213
+ - spec/validator_spec.rb
214
+ - tasks/benchmark.rake
215
+ homepage: http://github.com/cata-m/pg_tags_on
216
+ licenses:
217
+ - MIT
218
+ metadata:
219
+ homepage_uri: http://github.com/cata-m/pg_tags_on
220
+ source_code_uri: http://github.com/cata-m/pg_tags_on
221
+ changelog_uri: http://github.com/cata-m/pg_tags_on/blob/master/CHANGELOG.md
222
+ post_install_message:
223
+ rdoc_options: []
224
+ require_paths:
225
+ - lib
226
+ required_ruby_version: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ required_rubygems_version: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ requirements: []
237
+ rubygems_version: 3.0.6
238
+ signing_key:
239
+ specification_version: 4
240
+ summary: Manage tags stored in Postgresql column.
241
+ test_files:
242
+ - spec/array_integers/records_spec.rb
243
+ - spec/array_integers/tag_ops_spec.rb
244
+ - spec/array_integers/taggings_spec.rb
245
+ - spec/array_integers/tags_spec.rb
246
+ - spec/array_jsonb/records_spec.rb
247
+ - spec/array_jsonb/tag_ops_spec.rb
248
+ - spec/array_jsonb/taggings_spec.rb
249
+ - spec/array_jsonb/tags_spec.rb
250
+ - spec/array_strings/records_spec.rb
251
+ - spec/array_strings/tag_ops_spec.rb
252
+ - spec/array_strings/taggings_spec.rb
253
+ - spec/array_strings/tags_spec.rb
254
+ - spec/config/database.yml
255
+ - spec/configuration_spec.rb
256
+ - spec/helpers/database_helpers.rb
257
+ - spec/spec_helper.rb
258
+ - spec/support/factory.rb
259
+ - spec/tags_query_spec.rb
260
+ - spec/validator_spec.rb