filterism 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,51 @@
1
+ module Filterism
2
+ class ConditionParser
3
+ attr_accessor :comparators
4
+ def initialize
5
+ @comparators = {
6
+ 'equal_to' => '=',
7
+ 'not_equal_to' => '!=',
8
+
9
+ 'greater_than' => '>',
10
+ 'gt' => '>',
11
+ 'after' => '>',
12
+ 'greater_than_or_equal_to' => '>=',
13
+ 'gtet' => '>=',
14
+
15
+ 'less_than' => '<',
16
+ 'lt' => '<',
17
+ 'before' => '<',
18
+ 'less_than_or_equal_to' => '<=',
19
+ 'ltet' => '<=',
20
+
21
+ 'like' => 'LIKE',
22
+
23
+ 'in' => 'IN'
24
+ }
25
+ end
26
+
27
+ def parse(params)
28
+ conditions = []
29
+ params.each do |key, value|
30
+ keysplit = key.to_s.split('_is_')
31
+ if @comparators.keys.include?(keysplit[1])
32
+ conditions <<
33
+ {
34
+ key: keysplit[0],
35
+ comparator: @comparators[keysplit[1]],
36
+ value: value
37
+ }
38
+ end
39
+ end
40
+ return conditions
41
+ end
42
+
43
+ def add_comparator(comparator)
44
+ @comparators = @comparators.merge(comparator)
45
+ end
46
+
47
+ def delete_comparator(comparator_key)
48
+ @comparators.delete(comparator_key)
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module Filterism
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ require 'support/active_record'
3
+
4
+ describe Filterism do
5
+ describe "#filter" do
6
+ ActiveRecord::Base.include(Filterism)
7
+
8
+ class User < ActiveRecord::Base
9
+ end
10
+
11
+ it "filters for equals" do
12
+ user = User.where("name = 'Phil Spitler'").first
13
+ expect(User.filter([
14
+ {key: 'name', comparator: '=', value: 'Phil Spitler'},
15
+ ]).first).
16
+ to eq(user)
17
+ end
18
+
19
+ it "filters for LIKE" do
20
+ user = User.where("name LIKE '%Billy%'").first
21
+ expect(User.filter([
22
+ {key: 'name', comparator: 'LIKE', value: 'Billy'},
23
+ ]).first).
24
+ to eq(user)
25
+ end
26
+
27
+ it "filters for IN" do
28
+ user = User.where("name IN ('Phil Spitler','Joe Stuffypants')")
29
+ expect(User.filter([
30
+ {key: 'name', comparator: 'IN', value: 'Phil Spitler,Joe Stuffypants'},
31
+ ]).to_a).
32
+ to eq(user.to_a)
33
+ end
34
+
35
+ it "filters for booleans" do
36
+ user = User.where(is_young_at_heart: true)
37
+ expect(User.filter([
38
+ {key: 'is_young_at_heart', comparator: '=', value: 'true'},
39
+ ]).to_a).
40
+ to eq(user.to_a)
41
+ end
42
+
43
+ context "with filterable fields" do
44
+ it "filters only on filterable fields" do
45
+ class User < ActiveRecord::Base
46
+ filterable_fields :age, :is_young_at_heart
47
+ end
48
+
49
+ user = User.all.to_a
50
+ expect(User.filter([
51
+ {key: 'name', comparator: '=', value: 'Phil Spitler'},
52
+ ]).to_a).
53
+ to eq(user)
54
+
55
+ user = User.where(is_young_at_heart: true)
56
+ expect(User.filter([
57
+ {key: 'is_young_at_heart', comparator: '=', value: "true"}
58
+ ]).to_a).
59
+ to eq(user)
60
+ end
61
+ end
62
+
63
+ context "with unfilterable fields" do
64
+ it "filters only on unfilterable fields" do
65
+ class User < ActiveRecord::Base
66
+ unfilterable_fields :name
67
+ end
68
+
69
+ user = User.all.to_a
70
+ expect(User.filter([
71
+ {key: 'name', comparator: '=', value: 'Phil Spitler'},
72
+ ]).to_a).
73
+ to eq(user)
74
+
75
+ user = User.where(is_young_at_heart: true)
76
+ expect(User.filter([
77
+ {key: 'is_young_at_heart', comparator: '=', value: "true"}
78
+ ]).to_a).
79
+ to eq(user)
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,7 @@
1
+ ActiveRecord::Schema.define do
2
+ create_table :users do |t|
3
+ t.string :name
4
+ t.string :age
5
+ t.string :is_young_at_heart
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ name "Phil Spitler"
4
+ age 37
5
+ is_young_at_heart true
6
+ end
7
+ end
8
+
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Filterism::ConditionParser do
4
+ before(:all) do
5
+ @condition_parser = Filterism::ConditionParser.new
6
+ end
7
+
8
+ describe "#parse" do
9
+ it "has the parse method" do
10
+ expect(@condition_parser).to respond_to(:parse)
11
+ end
12
+ subject { -> (params) { return @condition_parser.parse(params) }}
13
+
14
+ it "returns a hash" do
15
+ expect(subject.call({ name_is_equal_to: 'David' })).to be_an(Array)
16
+ end
17
+
18
+ it "has the keys 'key, comparator, value'" do
19
+ expect(subject.call({ name_is_equal_to: 'David' })[0].keys.sort).
20
+ to eq([:comparator, :key, :value])
21
+ end
22
+
23
+ specify "the returned hashes are derived from the hash which was passed in" do
24
+ conditions = subject.call({ name_is_equal_to: 'John' }).first
25
+ expect(conditions[:key]).to eq "name"
26
+ expect(conditions[:comparator]).to eq "="
27
+ expect(conditions[:value]).to eq "John"
28
+ end
29
+ end
30
+
31
+ describe "#add_comparator" do
32
+ it "has the add_comparator method" do
33
+ expect(@condition_parser).to respond_to(:add_comparator).with(1).argument
34
+ end
35
+
36
+ it "adds the new comparator to the comparators Hash" do
37
+ expect(@condition_parser.add_comparator({"equals_to" => "="})).to include("equals_to" => "=")
38
+ end
39
+ end
40
+
41
+ describe "#delete_comparator" do
42
+ it "has the delete_comparator method" do
43
+ expect(@condition_parser).to respond_to(:delete_comparator).with(1).argument
44
+ end
45
+
46
+ it "deletes the comparator from the comparators Hash" do
47
+ @condition_parser.add_comparator({"equals_to" => "="})
48
+ expect(@condition_parser.delete_comparator("equals_to")).not_to include("equals_to")
49
+ end
50
+ end
51
+ end
52
+
@@ -0,0 +1,24 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ require 'simplecov'
8
+ SimpleCov.add_filter '.bundle'
9
+ SimpleCov.start
10
+ require 'filterism'
11
+ require 'factory_girl'
12
+
13
+ RSpec.configure do |config|
14
+ config.treat_symbols_as_metadata_keys_with_true_values = true
15
+ config.run_all_when_everything_filtered = true
16
+ config.include FactoryGirl::Syntax::Methods
17
+ #config.filter_run :focus
18
+
19
+ # Run specs in random order to surface order dependencies. If you find an
20
+ # order dependency and want to debug it, you can fix the order by providing
21
+ # the seed, which is printed after each run.
22
+ # --seed 1234
23
+ config.order = 'random'
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'active_record'
2
+
3
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
4
+
5
+ load "spec/db/schema.rb"
6
+
7
+ FactoryGirl.find_definitions
8
+
9
+ class User < ActiveRecord::Base
10
+ end
11
+
12
+ FactoryGirl.create(:user)
13
+
14
+ FactoryGirl.create(:user, {
15
+ name: 'Billy Bob',
16
+ age: 18,
17
+ is_young_at_heart: true
18
+ })
19
+
20
+ FactoryGirl.create(:user, {
21
+ name: 'Joe Stuffypants',
22
+ age: 27,
23
+ is_young_at_heart: false
24
+ })
metadata CHANGED
@@ -1,187 +1,189 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: filterism
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 0
9
- version: 1.0.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Phil Spitler
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2011-06-09 00:00:00 -04:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: maruku
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 6
31
- version: "0.6"
11
+ date: 2014-05-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
32
20
  type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: rake
36
21
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- none: false
39
- requirements:
40
- - - ~>
41
- - !ruby/object:Gem::Version
42
- segments:
43
- - 0
44
- - 9
45
- version: "0.9"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
46
34
  type: :development
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
49
42
  name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
50
49
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - ~>
55
- - !ruby/object:Gem::Version
56
- segments:
57
- - 2
58
- - 6
59
- version: "2.6"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bond
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
60
62
  type: :development
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: simplecov
64
63
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
68
- - - ~>
69
- - !ruby/object:Gem::Version
70
- segments:
71
- - 0
72
- - 4
73
- version: "0.4"
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
74
76
  type: :development
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: yard
78
77
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
80
- none: false
81
- requirements:
82
- - - ~>
83
- - !ruby/object:Gem::Version
84
- segments:
85
- - 0
86
- - 7
87
- version: "0.7"
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
88
90
  type: :development
89
- version_requirements: *id005
90
- - !ruby/object:Gem::Dependency
91
- name: sqlite3
92
91
  prerelease: false
93
- requirement: &id006 !ruby/object:Gem::Requirement
94
- none: false
95
- requirements:
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
96
101
  - - ">="
97
- - !ruby/object:Gem::Version
98
- segments:
99
- - 0
100
- version: "0"
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
101
104
  type: :development
102
- version_requirements: *id006
103
- - !ruby/object:Gem::Dependency
104
- name: activerecord
105
105
  prerelease: false
106
- requirement: &id007 !ruby/object:Gem::Requirement
107
- none: false
108
- requirements:
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
109
108
  - - ">="
110
- - !ruby/object:Gem::Version
111
- segments:
112
- - 3
113
- - 0
114
- - 1
115
- version: 3.0.1
116
- type: :runtime
117
- version_requirements: *id007
118
- description: ""
119
- email: pspitler@gmail.com
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: factory_girl
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '4.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '4.0'
125
+ description: ''
126
+ email:
127
+ - pspitler@gmail.com
120
128
  executables: []
121
-
122
129
  extensions: []
123
-
124
130
  extra_rdoc_files: []
125
-
126
- files:
127
- - .autotest
128
- - .gemtest
129
- - .gitignore
130
- - .rspec
131
- - .yardopts
131
+ files:
132
+ - ".autotest"
133
+ - ".gemtest"
134
+ - ".gitignore"
135
+ - ".irbrc"
136
+ - ".rspec"
137
+ - ".yardopts"
132
138
  - Gemfile
133
139
  - LICENSE.md
140
+ - LICENSE.txt
134
141
  - README.md
135
142
  - Rakefile
143
+ - exec/autospec
144
+ - exec/htmldiff
145
+ - exec/ldiff
146
+ - exec/rake
147
+ - exec/rspec
136
148
  - filterism.gemspec
137
149
  - lib/filterism.rb
150
+ - lib/filterism/adapters/active_record_adapter.rb
151
+ - lib/filterism/parsers/params_parser.rb
138
152
  - lib/filterism/version.rb
139
- - spec/filterism_spec.rb
140
- - spec/finders/activerecord_test_connector.rb
141
- - spec/fixtures/post.rb
142
- - spec/fixtures/posts.yml
143
- - spec/fixtures/schema.rb
144
- - spec/fixtures/user.rb
145
- - spec/fixtures/users.yml
146
- - spec/helper.rb
147
- has_rdoc: true
148
- homepage: https://github.com/philspitler/filterism
149
- licenses: []
150
-
153
+ - spec/adapters/active_record_adapter_spec.rb
154
+ - spec/db/schema.rb
155
+ - spec/factories.rb
156
+ - spec/parsers/params_parser_spec.rb
157
+ - spec/spec_helper.rb
158
+ - spec/support/active_record.rb
159
+ homepage: http://sproutkey.com
160
+ licenses:
161
+ - MIT
162
+ metadata: {}
151
163
  post_install_message:
152
164
  rdoc_options: []
153
-
154
- require_paths:
165
+ require_paths:
155
166
  - lib
156
- required_ruby_version: !ruby/object:Gem::Requirement
157
- none: false
158
- requirements:
167
+ required_ruby_version: !ruby/object:Gem::Requirement
168
+ requirements:
159
169
  - - ">="
160
- - !ruby/object:Gem::Version
161
- segments:
162
- - 0
163
- version: "0"
164
- required_rubygems_version: !ruby/object:Gem::Requirement
165
- none: false
166
- requirements:
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ required_rubygems_version: !ruby/object:Gem::Requirement
173
+ requirements:
167
174
  - - ">="
168
- - !ruby/object:Gem::Version
169
- segments:
170
- - 0
171
- version: "0"
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
172
177
  requirements: []
173
-
174
178
  rubyforge_project:
175
- rubygems_version: 1.3.7
179
+ rubygems_version: 2.2.2
176
180
  signing_key:
177
- specification_version: 3
178
- summary: A DSL for filtering active record results based on hash keys with the term _is_ in them.
179
- test_files:
180
- - spec/filterism_spec.rb
181
- - spec/finders/activerecord_test_connector.rb
182
- - spec/fixtures/post.rb
183
- - spec/fixtures/posts.yml
184
- - spec/fixtures/schema.rb
185
- - spec/fixtures/user.rb
186
- - spec/fixtures/users.yml
187
- - spec/helper.rb
181
+ specification_version: 4
182
+ summary: DSL for communicating filter intent via HTTP parameters in the URL
183
+ test_files:
184
+ - spec/adapters/active_record_adapter_spec.rb
185
+ - spec/db/schema.rb
186
+ - spec/factories.rb
187
+ - spec/parsers/params_parser_spec.rb
188
+ - spec/spec_helper.rb
189
+ - spec/support/active_record.rb