filterism 1.0.0 → 2.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.
@@ -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