minimal_tags 0.2.5 → 0.2.6

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
  SHA1:
3
- metadata.gz: e2b4c5c52cdbf5bea63ece71f5b175352e483f3b
4
- data.tar.gz: 41fad32774779ac38368d2afbbd1db8e9bde5237
3
+ metadata.gz: eeffa05e90f3cba0710036ad177d58cb8e512c57
4
+ data.tar.gz: 4a4fc394035d3c25dac9281b9cabb7d6df01366b
5
5
  SHA512:
6
- metadata.gz: dfefab0bb1683ed4fd3ef688a32994bec272caf17df0184b0521bfdbe770d6457cd68f3bd300b8e4676749ebee31a22781906ac2df0de5f7b92700862d4b42e1
7
- data.tar.gz: f035b615d24082b5d76ef8b5e3df7a545d94b8b5f5875cec52bb97ad48b215ae3ee4b1c5a844c07a4ab9808889529145fe18a1831008ce2590f671ded795961f
6
+ metadata.gz: 61300358c14afa8950b008f5199aa8263c75e0d11a970efa5da4e1a8c60e8e2d0d97a3bca0ba77dcefea5137b401bfd0e4bd3afe349bb9ef09aa015382a1f7d4
7
+ data.tar.gz: e16c5cf443078a005cfec088695e2d99784a871a24640f8eedc2a25bbbd2e5713d411445f8d1f7a9d3edc20dab9370e52e9bf130e02b98b9be01b52a0db52685
data/.gitignore CHANGED
@@ -1,6 +1,6 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
3
+ **/Gemfile.lock
4
4
  /_yardoc/
5
5
  /coverage/
6
6
  /doc/
data/.travis.yml CHANGED
@@ -1,12 +1,14 @@
1
1
  language: ruby
2
+ cache: bundler
2
3
  rvm:
3
- - 2.1.0
4
4
  - 2.2.3
5
5
  - 2.3.0
6
6
  gemfile:
7
7
  - gemfiles/activerecord_41.gemfile
8
8
  - gemfiles/activerecord_42.gemfile
9
9
  - gemfiles/activerecord_50.gemfile
10
+ - gemfiles/mongoid_5.gemfile
11
+ - gemfiles/sequel_4.gemfile
10
12
  services:
11
13
  - mongodb
12
14
  - postgresql
@@ -17,6 +19,3 @@ before_script:
17
19
  addons:
18
20
  code_climate:
19
21
  repo_token: 3c954617ba40beceb056cc73b82e00a6dc1fa2193cda386dc6c2128bdd61a804
20
- matrix:
21
- allow_failures:
22
- - gemfile: gemfiles/activerecord_50.gemfile
data/README.md CHANGED
@@ -36,6 +36,28 @@ end
36
36
 
37
37
  ```
38
38
 
39
+ ### Sequel
40
+
41
+ Add the following migration for each tag field you want.
42
+
43
+ ```ruby
44
+ Sequel.migration do
45
+ change do
46
+ add_column :posts, :tags, 'text[]', default: [], null: false
47
+ add_index :posts, :tags, type: :gin
48
+ end
49
+ end
50
+
51
+ ```
52
+
53
+ Also enable the `pg_array` and `pg_array_ops` extensions:
54
+
55
+ ```ruby
56
+ DB = Sequel.connect('postgres://...')
57
+ DB.extension :pg_array
58
+ Sequel.extension :pg_array_ops
59
+ ```
60
+
39
61
  ## Usage
40
62
 
41
63
  Start by including the `MinimalTags` module and define your tag fields
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'mongoid', '>= 5.0.0', '<= 6.0.0'
4
+
5
+ gemspec path: '../'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'sequel', '>= 4.0.0', '<= 6.0.0'
4
+
5
+ gemspec path: '../'
@@ -0,0 +1,38 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ minimal_tags (0.2.5)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ codeclimate-test-reporter (0.6.0)
10
+ simplecov (>= 0.7.1, < 1.0.0)
11
+ docile (1.1.5)
12
+ json (1.8.3)
13
+ minitest (5.9.0)
14
+ pg (0.18.4)
15
+ rake (10.5.0)
16
+ sequel (4.36.0)
17
+ simplecov (0.12.0)
18
+ docile (~> 1.1.0)
19
+ json (>= 1.8, < 3)
20
+ simplecov-html (~> 0.10.0)
21
+ simplecov-html (0.10.0)
22
+ yard (0.9.0)
23
+
24
+ PLATFORMS
25
+ ruby
26
+
27
+ DEPENDENCIES
28
+ bundler (~> 1.10)
29
+ codeclimate-test-reporter
30
+ minimal_tags!
31
+ minitest
32
+ pg
33
+ rake (~> 10.0)
34
+ sequel (>= 4.0.0, <= 6.0.0)
35
+ yard
36
+
37
+ BUNDLED WITH
38
+ 1.12.5
@@ -11,16 +11,16 @@ module MinimalTags
11
11
  # normalization on save.
12
12
  #
13
13
  # @example
14
- # class Posts < ActiveRecord::Base
14
+ # class Post < ActiveRecord::Base
15
15
  # include MinimalTags
16
16
  #
17
17
  # tag_field :tags
18
18
  # end
19
19
  #
20
- # doc = Posts.create(tags: ['hello world', 'this is a test']).tags
20
+ # doc = Post.create(tags: ['hello world', 'this is a test']).tags
21
21
  # # => ['hello-world', 'this-is-a-test']
22
22
  #
23
- # doc == Posts.any_tags(['HELLO WORLD']).first
23
+ # doc == Post.any_tags(['HELLO WORLD']).first
24
24
  # # => true
25
25
  #
26
26
  # @param [String] field_name The field name to use in mongo and searching methods
@@ -13,17 +13,17 @@ module MinimalTags
13
13
  # normalization on save.
14
14
  #
15
15
  # @example
16
- # class Posts
16
+ # class Post
17
17
  # include Mongoid::Document
18
18
  # include MinimalTags
19
19
  #
20
20
  # tag_field :tags
21
21
  # end
22
22
  #
23
- # doc = Posts.create(tags: ['hello world', 'this is a test']).tags
23
+ # doc = Post.create(tags: ['hello world', 'this is a test']).tags
24
24
  # # => ['hello-world', 'this-is-a-test']
25
25
  #
26
- # doc == Posts.any_tags(['HELLO WORLD']).first
26
+ # doc == Post.any_tags(['HELLO WORLD']).first
27
27
  # # => true
28
28
  #
29
29
  # @param [String] field_name The field name to use in mongo and searching methods
@@ -0,0 +1,55 @@
1
+ module MinimalTags
2
+ module Persistence
3
+ module Sequel
4
+ TAG_SEARCH_TYPES = {
5
+ all: :contains,
6
+ any: :overlaps
7
+ }
8
+
9
+ TAG_PREFIX_TYPES = {
10
+ where: '',
11
+ exclude: 'without_'
12
+ }
13
+
14
+ ##
15
+ # Creates a tag field, index, search methods and a callback for tag
16
+ # normalization on save.
17
+ #
18
+ # @example
19
+ # class Post < Sequel::Model
20
+ # include MinimalTags
21
+ #
22
+ # tag_field :tags
23
+ # end
24
+ #
25
+ # doc = Post.create(tags: ['hello world', 'this is a test']).tags
26
+ # # => ['hello-world', 'this-is-a-test']
27
+ #
28
+ # doc == Post.any_tags(['HELLO WORLD']).first
29
+ # # => true
30
+ #
31
+ # @param [String] field_name The field name to use in mongo and searching methods
32
+ # @param [Object] formatter The formatter to use, overriding the default
33
+ def tag_field(field_name, formatter: MinimalTags.default_formatter)
34
+ # Create the scopes for searching tags
35
+ TAG_SEARCH_TYPES.each do |prefix, operator|
36
+ TAG_PREFIX_TYPES.each do |method, without_prefix|
37
+ define_singleton_method "#{without_prefix}#{prefix}_#{field_name}" do |tags|
38
+ formatted_tags = formatter.normalize(tags)
39
+ query = ::Sequel.pg_array_op(field_name).send(operator, formatted_tags)
40
+ send(method, query)
41
+ end
42
+ end
43
+ end
44
+
45
+ tag_fields << field_name
46
+
47
+ # # Normalize tags on save
48
+ before_save do |*args|
49
+ tags = send(field_name) || []
50
+ send("#{field_name}=", formatter.normalize(tags))
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,6 +1,7 @@
1
1
  module MinimalTags
2
- # A very simple tag formatter using ActiveSupport's parameterize.
2
+ # A very simple tag formatter.
3
3
  # You should create your own rather than using this.
4
+ # The Stringex gem works well - https://github.com/rsl/stringex
4
5
  class SimpleFormatter
5
6
  ##
6
7
  # Returns an array of normalized tags
@@ -9,7 +10,7 @@ module MinimalTags
9
10
  #
10
11
  # @return [Array] Unique, parameterized tags
11
12
  def normalize(tags)
12
- tags.map(&:parameterize).uniq
13
+ tags.map { |tag| tag.downcase.gsub(/\s/, '-') }.uniq
13
14
  end
14
15
  end
15
16
  end
@@ -1,3 +1,3 @@
1
1
  module MinimalTags
2
- VERSION = '0.2.5'
2
+ VERSION = '0.2.6'
3
3
  end
data/lib/minimal_tags.rb CHANGED
@@ -15,6 +15,10 @@ module MinimalTags
15
15
  elsif ancestors.include?('ActiveRecord::Base')
16
16
  require 'minimal_tags/persistence/activerecord'
17
17
  base.send :extend, Persistence::Activerecord
18
+ elsif ancestors.include?('Sequel::Model')
19
+ require 'minimal_tags/persistence/sequel'
20
+ base.plugin :hook_class_methods
21
+ base.send :extend, Persistence::Sequel
18
22
  end
19
23
  end
20
24
 
data/minimal_tags.gemspec CHANGED
@@ -18,8 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'mongoid', '>= 5.0.0', '<= 6.0.0'
22
- spec.add_development_dependency 'activerecord', '>= 4.0.0', '<= 6.0.0'
23
21
  spec.add_development_dependency 'pg'
24
22
 
25
23
  spec.add_development_dependency 'bundler', '~> 1.10'
metadata CHANGED
@@ -1,55 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimal_tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - harrisbaird
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-10 00:00:00.000000000 Z
11
+ date: 2016-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: mongoid
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 5.0.0
20
- - - "<="
21
- - !ruby/object:Gem::Version
22
- version: 6.0.0
23
- type: :development
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 5.0.0
30
- - - "<="
31
- - !ruby/object:Gem::Version
32
- version: 6.0.0
33
- - !ruby/object:Gem::Dependency
34
- name: activerecord
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: 4.0.0
40
- - - "<="
41
- - !ruby/object:Gem::Version
42
- version: 6.0.0
43
- type: :development
44
- prerelease: false
45
- version_requirements: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 4.0.0
50
- - - "<="
51
- - !ruby/object:Gem::Version
52
- version: 6.0.0
53
13
  - !ruby/object:Gem::Dependency
54
14
  name: pg
55
15
  requirement: !ruby/object:Gem::Requirement
@@ -149,9 +109,13 @@ files:
149
109
  - gemfiles/activerecord_41.gemfile
150
110
  - gemfiles/activerecord_42.gemfile
151
111
  - gemfiles/activerecord_50.gemfile
112
+ - gemfiles/mongoid_5.gemfile
113
+ - gemfiles/sequel_4.gemfile
114
+ - gemfiles/sequel_4.gemfile.lock
152
115
  - lib/minimal_tags.rb
153
116
  - lib/minimal_tags/persistence/activerecord.rb
154
117
  - lib/minimal_tags/persistence/mongoid.rb
118
+ - lib/minimal_tags/persistence/sequel.rb
155
119
  - lib/minimal_tags/simple_formatter.rb
156
120
  - lib/minimal_tags/version.rb
157
121
  - minimal_tags.gemspec