everywhere 0.1.0 → 1.0.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.
data/README.rdoc CHANGED
@@ -19,10 +19,17 @@ Same for where + like.
19
19
 
20
20
  SELECT "users".* FROM "users" WHERE ("users"."name" LIKE 'Akira%')
21
21
 
22
+ === where + not like
23
+
24
+ And where + "not like" as well.
25
+
26
+ SELECT "users".* FROM "users" WHERE ("users"."name" NOT LIKE 'Matz%')
27
+
22
28
 
23
29
  == Syntaxes
24
30
 
25
- "+Everywhere+" supports 4 syntaxes.
31
+ "+Everywhere+" supports 4 syntaxes. Note that you can use only one syntax at a time, and others will be disabled.
32
+ The +hash_value+ syntax will be enabled by default.
26
33
 
27
34
  * hash_value
28
35
  Push the value into a Hash indexed by +:not+.
@@ -72,11 +79,6 @@ For example, if you prefer the symbol syntax, put the following line in your con
72
79
  The default value is +:hash_value+.
73
80
 
74
81
 
75
- == Todo
76
-
77
- +not like+ (if needed)
78
-
79
-
80
82
  == Contributing to Everywhere
81
83
 
82
84
  * Fork, fix, then send me a pull request.
data/everywhere.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.version = Everywhere::VERSION
8
8
  s.authors = ["Akira Matsuda"]
9
9
  s.email = ["ronnie@dio.jp"]
10
- s.homepage = ""
10
+ s.homepage = 'https://github.com/amatsuda/everywhere'
11
11
  s.summary = %q{Hash condition syntax for AR query everywhere!}
12
12
  s.description = %q{Hash condition syntax for AR query everywhere!}
13
13
 
@@ -6,60 +6,66 @@ module ActiveRecord
6
6
  class << self
7
7
  include Everywhere::Util
8
8
 
9
- def build_from_hash_with_not(engine, attributes, default_table)
10
- attributes_with_not = {}
9
+ def build_from_hash_with_not_and_like_and_not_like(engine, attributes, default_table)
10
+ attributes_with_not_and_like_and_not_like = {}
11
11
  attributes.each do |column, value|
12
12
  # {not: {key: value}}
13
- if column.in?([:not, :like])
13
+ if column.in?([:not, :like, :not_like])
14
14
  value.each do |k, v|
15
- attributes_with_not["#{k}__#{column}__"] = v
15
+ attributes_with_not_and_like_and_not_like["#{k}__#{column}__"] = v
16
16
  end
17
17
  else
18
- attributes_with_not[column] = value
18
+ attributes_with_not_and_like_and_not_like[column] = value
19
19
  end
20
20
  end
21
- build_from_hash_without_not(engine, attributes_with_not, default_table).map do |rel|
21
+ build_from_hash_without_not_and_like_and_not_like(engine, attributes_with_not_and_like_and_not_like, default_table).map do |rel|
22
22
  if rel.left.name.to_s.ends_with? '__not__'
23
23
  rel.left.name = rel.left.name.to_s.sub(/__not__$/, '').to_sym
24
24
  negate rel
25
25
  elsif rel.left.name.to_s.ends_with? '__like__'
26
26
  rel.left.name = rel.left.name.to_s.sub(/__like__$/, '').to_sym
27
27
  Arel::Nodes::Matches.new rel.left, rel.right
28
+ elsif rel.left.name.to_s.ends_with? '__not_like__'
29
+ rel.left.name = rel.left.name.to_s.sub(/__not_like__$/, '').to_sym
30
+ Arel::Nodes::DoesNotMatch.new rel.left, rel.right
28
31
  else
29
32
  rel
30
33
  end
31
34
  end
32
35
  end
33
- alias_method_chain :build_from_hash, :not
36
+ alias_method_chain :build_from_hash, :not_and_like_and_not_like
34
37
  end
35
38
  else
36
39
  include Everywhere::Util
37
40
 
38
- def build_from_hash_with_not(attributes, default_table)
39
- attributes_with_not = {}
41
+ def build_from_hash_with_not_and_like_and_not_like(attributes, default_table)
42
+ attributes_with_not_and_like_and_not_like = {}
40
43
  attributes.each do |column, value|
41
44
  # {not: {key: value}}
42
- if (column == :not) || (column == :like)
45
+ if (column == :not) || (column == :like) || (column == :not_like)
43
46
  value.each do |k, v|
44
- attributes_with_not["#{k}__#{column}__"] = v
47
+ attributes_with_not_and_like_and_not_like["#{k}__#{column}__"] = v
45
48
  end
46
49
  else
47
- attributes_with_not[column] = value
50
+ attributes_with_not_and_like_and_not_like[column] = value
48
51
  end
49
52
  end
50
- build_from_hash_without_not(attributes_with_not, default_table).map do |rel|
53
+ build_from_hash_without_not_and_like_and_not_like(attributes_with_not_and_like_and_not_like, default_table).map do |rel|
51
54
  if rel.left.name.to_s.ends_with? '__not__'
52
55
  rel.left.name = rel.left.name.to_s.sub(/__not__$/, '').to_sym
53
56
  negate rel
54
57
  elsif rel.left.name.to_s.ends_with? '__like__'
55
58
  rel.left.name = rel.left.name.to_s.sub(/__like__$/, '').to_sym
56
59
  Arel::Nodes::Matches.new rel.left, rel.right
60
+ elsif rel.left.name.to_s.ends_with? '__not_like__'
61
+ rel.left.name = rel.left.name.to_s.sub(/__not_like__$/, '').to_sym
62
+ Arel::Nodes::DoesNotMatch.new rel.left, rel.right
57
63
  else
58
64
  rel
59
65
  end
60
66
  end
61
67
  end
62
- alias_method_chain :build_from_hash, :not
68
+ alias_method_chain :build_from_hash, :not_and_like_and_not_like
63
69
  end
64
70
  end
65
71
  end
@@ -6,54 +6,60 @@ module ActiveRecord
6
6
  class << self
7
7
  include Everywhere::Util
8
8
 
9
- def build_from_hash_with_not(engine, attributes, default_table)
10
- attributes_with_not = attributes.map do |column, value|
9
+ def build_from_hash_with_not_and_like_and_not_like(engine, attributes, default_table)
10
+ attributes_with_not_and_like_and_not_like = attributes.map do |column, value|
11
11
  # {key: {not: value}}
12
- if value.is_a?(Hash) && (value.keys.size == 1) && value.keys.first.in?([:not, :like])
12
+ if value.is_a?(Hash) && (value.keys.size == 1) && value.keys.first.in?([:not, :like, :not_like])
13
13
  ["#{column}__#{value.keys.first}__", value.values.first]
14
14
  else
15
15
  [column, value]
16
16
  end
17
17
  end
18
- build_from_hash_without_not(engine, attributes_with_not, default_table).map do |rel|
18
+ build_from_hash_without_not_and_like_and_not_like(engine, attributes_with_not_and_like_and_not_like, default_table).map do |rel|
19
19
  if rel.left.name.to_s.ends_with?('__not__')
20
20
  rel.left.name = rel.left.name.to_s.sub(/__not__$/, '').to_sym
21
21
  negate rel
22
22
  elsif rel.left.name.to_s.ends_with?('__like__')
23
23
  rel.left.name = rel.left.name.to_s.sub(/__like__$/, '').to_sym
24
24
  Arel::Nodes::Matches.new rel.left, rel.right
25
+ elsif rel.left.name.to_s.ends_with?('__not_like__')
26
+ rel.left.name = rel.left.name.to_s.sub(/__not_like__$/, '').to_sym
27
+ Arel::Nodes::DoesNotMatch.new rel.left, rel.right
25
28
  else
26
29
  rel
27
30
  end
28
31
  end
29
32
  end
30
- alias_method_chain :build_from_hash, :not
33
+ alias_method_chain :build_from_hash, :not_and_like_and_not_like
31
34
  end
32
35
  else
33
36
  include Everywhere::Util
34
37
 
35
- def build_from_hash_with_not(attributes, default_table)
36
- attributes_with_not = attributes.map do |column, value|
38
+ def build_from_hash_with_not_and_like_and_not_like(attributes, default_table)
39
+ attributes_with_not_and_like_and_not_like = attributes.map do |column, value|
37
40
  # {key: {not: value}}
38
- if value.is_a?(Hash) && (value.keys.size == 1) && ((value.keys.first == :not) || (value.keys.first == :like))
41
+ if value.is_a?(Hash) && (value.keys.size == 1) && ((value.keys.first == :not) || (value.keys.first == :like) || (value.keys.first == :not_like))
39
42
  ["#{column}__#{value.keys.first}__", value.values.first]
40
43
  else
41
44
  [column, value]
42
45
  end
43
46
  end
44
- build_from_hash_without_not(attributes_with_not, default_table).map do |rel|
47
+ build_from_hash_without_not_and_like_and_not_like(attributes_with_not_and_like_and_not_like, default_table).map do |rel|
45
48
  if rel.left.name.to_s.ends_with?('__not__')
46
49
  rel.left.name = rel.left.name.to_s.sub(/__not__$/, '').to_sym
47
50
  negate rel
48
51
  elsif rel.left.name.to_s.ends_with?('__like__')
49
52
  rel.left.name = rel.left.name.to_s.sub(/__like__$/, '').to_sym
50
53
  Arel::Nodes::Matches.new rel.left, rel.right
54
+ elsif rel.left.name.to_s.ends_with?('__not_like__')
55
+ rel.left.name = rel.left.name.to_s.sub(/__not_like__$/, '').to_sym
56
+ Arel::Nodes::DoesNotMatch.new rel.left, rel.right
51
57
  else
52
58
  rel
53
59
  end
54
60
  end
55
61
  end
56
- alias_method_chain :build_from_hash, :not
62
+ alias_method_chain :build_from_hash, :not_and_like_and_not_like
57
63
  end
58
64
  end
59
65
  end
@@ -3,7 +3,7 @@ require 'everywhere/util'
3
3
  module ActiveRecord
4
4
  class Base
5
5
  class << self
6
- delegate :where_not, :where_like, :to => :scoped
6
+ delegate :where_not, :where_like, :where_not_like, :to => :scoped
7
7
  end
8
8
  end
9
9
 
@@ -25,5 +25,13 @@ module ActiveRecord
25
25
  relation.where_values += build_where(opts, rest).map {|r| Arel::Nodes::Matches.new r.left, r.right}
26
26
  relation
27
27
  end
28
+
29
+ def where_not_like(opts, *rest)
30
+ return self if opts.blank?
31
+
32
+ relation = clone
33
+ relation.where_values += build_where(opts, rest).map {|r| Arel::Nodes::DoesNotMatch.new r.left, r.right}
34
+ relation
35
+ end
28
36
  end
29
37
  end
@@ -4,16 +4,18 @@ module ActiveRecord
4
4
  module QueryMethods
5
5
  include Everywhere::Util
6
6
 
7
- def build_where_with_not(opts, other = [])
7
+ def build_where_with_not_and_like_and_not_like(opts, other = [])
8
8
  case opts
9
9
  when :not
10
- build_where_without_not(*other).map {|r| negate r}
10
+ build_where_without_not_and_like_and_not_like(*other).map {|r| negate r}
11
11
  when :like
12
- build_where_without_not(*other).map {|r| Arel::Nodes::Matches.new r.left, r.right}
12
+ build_where_without_not_and_like_and_not_like(*other).map {|r| Arel::Nodes::Matches.new r.left, r.right}
13
+ when :not_like
14
+ build_where_without_not_and_like_and_not_like(*other).map {|r| Arel::Nodes::DoesNotMatch.new r.left, r.right}
13
15
  else
14
- build_where_without_not(opts, other)
16
+ build_where_without_not_and_like_and_not_like(opts, other)
15
17
  end
16
18
  end
17
- alias_method_chain :build_where, :not
19
+ alias_method_chain :build_where, :not_and_like_and_not_like
18
20
  end
19
21
  end
@@ -1,3 +1,3 @@
1
1
  module Everywhere
2
- VERSION = '0.1.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -64,3 +64,15 @@ describe 'like' do
64
64
  its(:to_sql) { should == %q["posts"."title" LIKE 'he%'] }
65
65
  end
66
66
  end
67
+
68
+ describe 'not like' do
69
+ describe 'not like match' do
70
+ before do
71
+ @where = Post.where(:not_like => {:title => 'he%'}).where_values
72
+ end
73
+ subject { @where }
74
+ it { @where.should have(1).item }
75
+ subject { @where.first }
76
+ its(:to_sql) { should == %q["posts"."title" NOT LIKE 'he%'] }
77
+ end
78
+ end
@@ -64,3 +64,15 @@ describe 'like' do
64
64
  its(:to_sql) { should == %q["posts"."title" LIKE 'he%'] }
65
65
  end
66
66
  end
67
+
68
+ describe 'not like' do
69
+ describe 'not like match' do
70
+ before do
71
+ @where = Post.where(:title => {:not_like => 'he%'}).where_values
72
+ end
73
+ subject { @where }
74
+ it { @where.should have(1).item }
75
+ subject { @where.first }
76
+ its(:to_sql) { should == %q["posts"."title" NOT LIKE 'he%'] }
77
+ end
78
+ end
data/spec/method_spec.rb CHANGED
@@ -64,3 +64,15 @@ describe 'like' do
64
64
  its(:to_sql) { should == %q["posts"."title" LIKE 'he%'] }
65
65
  end
66
66
  end
67
+
68
+ describe 'not like' do
69
+ describe 'not like match' do
70
+ before do
71
+ @where = Post.where_not_like(:title => 'he%').where_values
72
+ end
73
+ subject { @where }
74
+ it { @where.should have(1).item }
75
+ subject { @where.first }
76
+ its(:to_sql) { should == %q["posts"."title" NOT LIKE 'he%'] }
77
+ end
78
+ end
data/spec/symbol_spec.rb CHANGED
@@ -64,3 +64,15 @@ describe 'like' do
64
64
  its(:to_sql) { should == %q["posts"."title" LIKE 'he%'] }
65
65
  end
66
66
  end
67
+
68
+ describe 'not like' do
69
+ describe 'not like match' do
70
+ before do
71
+ @where = Post.where(:not_like, :title => 'he%').where_values
72
+ end
73
+ subject { @where }
74
+ it { @where.should have(1).item }
75
+ subject { @where.first }
76
+ its(:to_sql) { should == %q["posts"."title" NOT LIKE 'he%'] }
77
+ end
78
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: everywhere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-11-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70251485850240 !ruby/object:Gem::Requirement
16
+ requirement: &70208330286520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70251485850240
24
+ version_requirements: *70208330286520
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sqlite3
27
- requirement: &70251485849520 !ruby/object:Gem::Requirement
27
+ requirement: &70208330286100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70251485849520
35
+ version_requirements: *70208330286100
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activerecord
38
- requirement: &70251485868380 !ruby/object:Gem::Requirement
38
+ requirement: &70208330285680 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70251485868380
46
+ version_requirements: *70208330285680
47
47
  description: Hash condition syntax for AR query everywhere!
48
48
  email:
49
49
  - ronnie@dio.jp
@@ -71,7 +71,7 @@ files:
71
71
  - spec/method_spec.rb
72
72
  - spec/spec_helper.rb
73
73
  - spec/symbol_spec.rb
74
- homepage: ''
74
+ homepage: https://github.com/amatsuda/everywhere
75
75
  licenses: []
76
76
  post_install_message:
77
77
  rdoc_options: []