query_string_search 0.0.3 → 0.0.4

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: 5750a3574b4f201d0e9274a96fa4e1a10aff5593
4
- data.tar.gz: 6bddcc98d4a95cd33a88ecd0d7d5adb49cc787ea
3
+ metadata.gz: 3b484ab328b2b5e889f3c0760ef857b3eccdddd8
4
+ data.tar.gz: d0071f6f1ca439042d640ce53271beda186375e2
5
5
  SHA512:
6
- metadata.gz: 97feeae7f780d9513c10b1861cee25a72297d4e6af9fddd2e341e922349d627fa11bd25c4b785a5323cbe805846d5dbdec514474c6a30e912a9312d8479c51fd
7
- data.tar.gz: 1f275d60e2f5b2075214b60e58546edbe261fc40db111734bb56584daac3088da502281314695fd3415a0c2ffae5c597ba1f8bbaaac30c4b4a9a19a2e4f5363e
6
+ metadata.gz: 44babe5feac2376030fe68edaa8a740c7f684959de01142558faa0d108ae86fc29ceeec5fd4a37896f38a19f6c95783c9da365afdea532632ab3e0ed110282f7
7
+ data.tar.gz: bc97993d98ba3a8fd352729a2bbbb3a329ee1d28d957c926e210f311fd42670526b538834a423092bdac947b519d0d3e4c99849cf47886b30722b908025d1bb5
data/.hound.yml ADDED
@@ -0,0 +1,3 @@
1
+ ruby:
2
+ enabled: true
3
+ config_file: .rubocop.yml
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.5
4
+ - 2.2.0
5
+ - 2.0.0-p598
6
+ addons:
7
+ code_climate:
8
+ repo_token:
9
+ secure: XnZ8VLwsAVr3lrJ3gInolfi1dALfyu0XF74t7VExawsSGuDJzFnx4lwqw139uQHqEUNOl/lj+SHMjgEIxtoM6LjX/JBiCQLTMyKKz5EMwUvFULz4vWaGy2mgyA48WDXZL/s1k0GW7/Q8wxpdQ7uU2izx2RaJ+PLmcYUNQhNBbMI=
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Query String Search
1
+ # Query String Search [![Build Status](https://api.travis-ci.org/umn-asr/query_string_search.svg?branch=master)](https://travis-ci.org/umn-asr/query_string_search) [![Code Climate](https://codeclimate.com/github/umn-asr/query_string_search/badges/gpa.svg)](https://codeclimate.com/github/umn-asr/query_string_search)
2
2
 
3
3
  Provides an easy way to implement searching in your API endpoints
4
4
 
@@ -28,6 +28,12 @@ Returns every movie without ratings.
28
28
 
29
29
  Returns every movie with a year of 1994
30
30
 
31
+ ### Return all data that matches one of many attributes
32
+
33
+ `movies?q=year=1994|1995`
34
+
35
+ Returns all movies with a year of 1994 or 1995
36
+
31
37
  ### Combining Searches
32
38
 
33
39
  Search criteria can be separated with commas
@@ -41,7 +47,7 @@ Records that match **all** the criteria will be returned. All un-rated movies ma
41
47
  Add this line to your application's Gemfile:
42
48
 
43
49
  ```ruby
44
- gem 'query_string_search', git: https://github.umn.edu/asrweb/query_string_search.git
50
+ gem 'query_string_search'
45
51
  ```
46
52
 
47
53
  And then execute:
@@ -4,10 +4,13 @@ class MatchAttribute < QueryStringSearch::AbstractMatcher
4
4
  end
5
5
 
6
6
  def self.reserved_words
7
- %w(true all)
7
+ [
8
+ /^true$/,
9
+ /^all$/
10
+ ]
8
11
  end
9
12
 
10
13
  def self.build_me?(_, search_param)
11
- reserved_words.include?(search_param)
14
+ reserved_words.any? { |r| r.match(search_param) }
12
15
  end
13
16
  end
@@ -6,6 +6,8 @@ class MatchAttributeValue < QueryStringSearch::AbstractMatcher
6
6
  end
7
7
 
8
8
  def self.build_me?(search_type, search_param)
9
- search_param && search_type && !all_reserved_words.include?(search_param)
9
+ search_param &&
10
+ search_type &&
11
+ all_reserved_words.none? { |r| r.match(search_param) }
10
12
  end
11
13
  end
@@ -0,0 +1,21 @@
1
+ class MatchMultipleAttributeValues < QueryStringSearch::AbstractMatcher
2
+ def match?(target)
3
+ match_with_contingency do
4
+ value.include?(target.public_send(attribute).to_s.upcase)
5
+ end
6
+ end
7
+
8
+ def self.reserved_words
9
+ [
10
+ /^\w+\|\w+/
11
+ ]
12
+ end
13
+
14
+ def value=(x)
15
+ super(x.split("|").map(&:upcase))
16
+ end
17
+
18
+ def self.build_me?(_, search_param)
19
+ reserved_words.any? { |r| r.match(search_param) }
20
+ end
21
+ end
@@ -4,10 +4,13 @@ class MatchNoAttribute < QueryStringSearch::AbstractMatcher
4
4
  end
5
5
 
6
6
  def self.reserved_words
7
- %w(false none)
7
+ [
8
+ /^false$/,
9
+ /^none$/
10
+ ]
8
11
  end
9
12
 
10
13
  def self.build_me?(_, search_param)
11
- reserved_words.include?(search_param)
14
+ reserved_words.any? { |r| r.match(search_param) }
12
15
  end
13
16
  end
@@ -1,3 +1,3 @@
1
1
  module QueryStringSearch
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -6,8 +6,8 @@ require 'query_string_search/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "query_string_search"
8
8
  spec.version = QueryStringSearch::VERSION
9
- spec.authors = ["Ian Whitney"]
10
- spec.email = ["whit0694@umn.edu"]
9
+ spec.authors = ["Ian Whitney", "Debbie Gillespie", "Davin Lagerroos"]
10
+ spec.email = ["asrwebteam@umn.edu"]
11
11
  spec.summary = %q{Provides a standard way to do searches using query strings in an API endpoint}
12
12
  spec.homepage = "https://github.com/umn-asr/query_string_search"
13
13
  spec.license = ""
@@ -20,5 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_development_dependency "bundler", "~> 1.7"
21
21
  spec.add_development_dependency "rake", "~> 10.0"
22
22
  spec.add_development_dependency "rspec", "~> 3"
23
+ spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
24
+ spec.add_development_dependency "travis", "~> 1.7"
23
25
  spec.add_development_dependency "rubocop"
24
26
  end
@@ -0,0 +1,6 @@
1
+ class SearchTarget
2
+ attr_accessor :property
3
+ def initialize(property: nil)
4
+ self.property = property
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ require_relative "../../lib/query_string_search"
2
+ require_relative "../fixtures/movie"
3
+
4
+ RSpec.describe "Finding data that matches one of many attributes" do
5
+ let(:data_set) { Movie.random_collection }
6
+ let(:movies_in_1994_or_1995) { data_set.select { |d| %w(1994 1995).include?(d.year) } }
7
+
8
+ it "Returns records that match the requested value" do
9
+ results = QueryStringSearch.new(data_set, "year=1994|1995").results
10
+
11
+ expect(results).to eq(movies_in_1994_or_1995)
12
+ end
13
+ end
@@ -1,10 +1,11 @@
1
1
  require_relative "../../../../lib/query_string_search/abstract_matcher"
2
+ require_relative "../../../doubles/search_target"
2
3
 
3
4
  RSpec.describe MatchAttribute do
4
5
  describe "match?" do
5
6
  describe "if the target's attribute is not nil" do
6
- let(:target) { Target.new("search_value") }
7
- let(:subject) { MatchAttribute.new(:search_attr) }
7
+ let(:target) { SearchTarget.new(property: "search_value") }
8
+ let(:subject) { MatchAttribute.new(:property) }
8
9
 
9
10
  it "is true" do
10
11
  expect(subject.match?(target)).to be_truthy
@@ -12,8 +13,8 @@ RSpec.describe MatchAttribute do
12
13
  end
13
14
 
14
15
  describe "if the target's attribute is true" do
15
- let(:target) { Target.new(true) }
16
- let(:subject) { MatchAttribute.new(:search_attr) }
16
+ let(:target) { SearchTarget.new(property: true) }
17
+ let(:subject) { MatchAttribute.new(:property) }
17
18
 
18
19
  it "is true" do
19
20
  expect(subject.match?(target)).to be_truthy
@@ -21,8 +22,8 @@ RSpec.describe MatchAttribute do
21
22
  end
22
23
 
23
24
  describe "if the target's attribute is nil" do
24
- let(:target) { Target.new(nil) }
25
- let(:subject) { MatchAttribute.new(:search_attr) }
25
+ let(:target) { SearchTarget.new(property: nil) }
26
+ let(:subject) { MatchAttribute.new(:property) }
26
27
 
27
28
  it "is false" do
28
29
  expect(subject.match?(target)).to be_falsey
@@ -30,8 +31,8 @@ RSpec.describe MatchAttribute do
30
31
  end
31
32
 
32
33
  describe "if the target's attribute is false" do
33
- let(:target) { Target.new(false) }
34
- let(:subject) { MatchAttribute.new(:search_attr) }
34
+ let(:target) { SearchTarget.new(property: false) }
35
+ let(:subject) { MatchAttribute.new(:property) }
35
36
 
36
37
  it "is true" do
37
38
  expect(subject.match?(target)).to be_falsey
@@ -39,7 +40,7 @@ RSpec.describe MatchAttribute do
39
40
  end
40
41
 
41
42
  describe "if the target doesn't have the attribute" do
42
- let(:target) { Target.new(rand) }
43
+ let(:target) { SearchTarget.new(property: rand) }
43
44
  let(:subject) { MatchAttribute.new(:bad_attr) }
44
45
 
45
46
  it "is false" do
@@ -1,11 +1,11 @@
1
1
  require_relative "../../../../lib/query_string_search/abstract_matcher"
2
+ require_relative "../../../doubles/search_target"
2
3
 
3
4
  RSpec.describe MatchAttributeValue do
4
5
  describe "match?" do
5
6
  describe "given a target with an attribute that matches the Parameter's attribute" do
6
- let(:target) { Target.new("search_value") }
7
- let(:value) { "search_value" }
8
- let(:subject) { MatchAttributeValue.new(:search_attr, value) }
7
+ let(:target) { SearchTarget.new(property: "search_value") }
8
+ let(:subject) { MatchAttributeValue.new(:property, "search_value") }
9
9
 
10
10
  it "returns true" do
11
11
  expect(subject.match?(target)).to be_truthy
@@ -13,9 +13,8 @@ RSpec.describe MatchAttributeValue do
13
13
  end
14
14
 
15
15
  describe "given a value with spaces" do
16
- let(:target) { Target.new("search value") }
17
- let(:value) { "search value" }
18
- let(:subject) { MatchAttributeValue.new(:search_attr, value) }
16
+ let(:target) { SearchTarget.new(property: "search value") }
17
+ let(:subject) { MatchAttributeValue.new(:property, "search value") }
19
18
 
20
19
  it "returns true" do
21
20
  expect(subject.match?(target)).to be_truthy
@@ -23,9 +22,8 @@ RSpec.describe MatchAttributeValue do
23
22
  end
24
23
 
25
24
  describe "given a target with an attribute that does not match the Parameter's attribute" do
26
- let(:target) { Target.new("other_value") }
27
- let(:value) { "search_value" }
28
- let(:subject) { MatchAttributeValue.new(:search_attr, value) }
25
+ let(:target) { SearchTarget.new(property: "other_value") }
26
+ let(:subject) { MatchAttributeValue.new(:property, "search_value") }
29
27
 
30
28
  it "returns false" do
31
29
  expect(subject.match?(target)).to be_falsey
@@ -33,9 +31,8 @@ RSpec.describe MatchAttributeValue do
33
31
  end
34
32
 
35
33
  describe "if the target doesn't have the attribute" do
36
- let(:value) { "search_value" }
37
- let(:target) { Target.new(value) }
38
- let(:subject) { MatchAttribute.new(:bad_attr, value) }
34
+ let(:target) { SearchTarget.new(property: "search_value") }
35
+ let(:subject) { MatchAttribute.new(:bad_attr, "search_value") }
39
36
 
40
37
  it "is false" do
41
38
  expect(subject.match?(target)).to be_falsey
@@ -46,14 +43,14 @@ RSpec.describe MatchAttributeValue do
46
43
  describe "build_me?" do
47
44
  describe "given a non-nil search_type and search_param" do
48
45
  it "is true" do
49
- expect(MatchAttributeValue.build_me?(rand, rand)).to be_truthy
46
+ expect(MatchAttributeValue.build_me?(rand.to_s, rand.to_s)).to be_truthy
50
47
  end
51
48
  end
52
49
 
53
50
  describe "given a nil search_type or search_param" do
54
51
  it "is false" do
55
- expect(MatchAttributeValue.build_me?(rand, nil)).to be_falsey
56
- expect(MatchAttributeValue.build_me?(nil, rand)).to be_falsey
52
+ expect(MatchAttributeValue.build_me?(rand.to_s, nil)).to be_falsey
53
+ expect(MatchAttributeValue.build_me?(nil, rand.to_s)).to be_falsey
57
54
  expect(MatchAttributeValue.build_me?(nil, nil)).to be_falsey
58
55
  end
59
56
  end
@@ -0,0 +1,47 @@
1
+ require_relative "../../../../lib/query_string_search/abstract_matcher"
2
+ require_relative "../../../doubles/search_target"
3
+
4
+ RSpec.describe MatchMultipleAttributeValues do
5
+ describe "match?" do
6
+ it "matches if the target's attribute is one of the values" do
7
+ target = SearchTarget.new(property: "1994")
8
+ matcher = MatchMultipleAttributeValues.new(:property, "1994|1995")
9
+ expect(matcher.match?(target)).to be_truthy
10
+ end
11
+
12
+ it "does not match if the target's attribute is not one of the values" do
13
+ target = SearchTarget.new(property: "199")
14
+ matcher = MatchMultipleAttributeValues.new(:property, "1994|1995")
15
+ expect(matcher.match?(target)).to be_falsey
16
+ end
17
+
18
+ describe "if the target doesn't have the attribute" do
19
+ it "is false" do
20
+ target = SearchTarget.new(property: "1994")
21
+ subject = MatchAttribute.new(:bad_attr, "1994|1995")
22
+
23
+ expect(subject.match?(target)).to be_falsey
24
+ end
25
+ end
26
+ end
27
+
28
+ describe "build_me?" do
29
+ describe "given a search type and search param that contains a pipe" do
30
+ it "is true" do
31
+ expect(MatchMultipleAttributeValues.build_me?(rand, "x|y")).to be_truthy
32
+ end
33
+ end
34
+
35
+ describe "given a search type and search param that starts with a pipe" do
36
+ it "is false" do
37
+ expect(MatchMultipleAttributeValues.build_me?(rand, "|x|y")).to be_falsey
38
+ end
39
+ end
40
+
41
+ describe "given a search type without a pipe" do
42
+ it "is false" do
43
+ expect(MatchMultipleAttributeValues.build_me?(rand, "xy")).to be_falsey
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,10 +1,11 @@
1
1
  require_relative "../../../../lib/query_string_search/abstract_matcher"
2
+ require_relative "../../../doubles/search_target"
2
3
 
3
4
  RSpec.describe MatchNoAttribute do
4
5
  describe "match?" do
5
6
  describe "if the target's attribute is not nil" do
6
- let(:target) { Target.new("search_value") }
7
- let(:subject) { MatchNoAttribute.new(:search_attr) }
7
+ let(:target) { SearchTarget.new(property: "search_value") }
8
+ let(:subject) { MatchNoAttribute.new(:property) }
8
9
 
9
10
  it "is false" do
10
11
  expect(subject.match?(target)).to be_falsey
@@ -12,8 +13,8 @@ RSpec.describe MatchNoAttribute do
12
13
  end
13
14
 
14
15
  describe "if the target's attribute is true" do
15
- let(:target) { Target.new(true) }
16
- let(:subject) { MatchNoAttribute.new(:search_attr) }
16
+ let(:target) { SearchTarget.new(property: true) }
17
+ let(:subject) { MatchNoAttribute.new(:property) }
17
18
 
18
19
  it "is true" do
19
20
  expect(subject.match?(target)).to be_falsey
@@ -21,8 +22,8 @@ RSpec.describe MatchNoAttribute do
21
22
  end
22
23
 
23
24
  describe "if the target's attribute is false" do
24
- let(:target) { Target.new(false) }
25
- let(:subject) { MatchNoAttribute.new(:search_attr) }
25
+ let(:target) { SearchTarget.new(property: false) }
26
+ let(:subject) { MatchNoAttribute.new(:property) }
26
27
 
27
28
  it "is true" do
28
29
  expect(subject.match?(target)).to be_truthy
@@ -30,8 +31,8 @@ RSpec.describe MatchNoAttribute do
30
31
  end
31
32
 
32
33
  describe "if the target's attribute is nil" do
33
- let(:target) { Target.new(nil) }
34
- let(:subject) { MatchNoAttribute.new(:search_attr) }
34
+ let(:target) { SearchTarget.new(property: nil) }
35
+ let(:subject) { MatchNoAttribute.new(:property) }
35
36
 
36
37
  it "is true" do
37
38
  expect(subject.match?(target)).to be_truthy
@@ -39,7 +40,7 @@ RSpec.describe MatchNoAttribute do
39
40
  end
40
41
 
41
42
  describe "if the target doesn't have the attribute" do
42
- let(:target) { Target.new(rand) }
43
+ let(:target) { SearchTarget.new(property: rand) }
43
44
  let(:subject) { MatchNoAttribute.new(:bad_attr) }
44
45
 
45
46
  it "is false" do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require "codeclimate-test-reporter"
2
+ CodeClimate::TestReporter.start
3
+
1
4
  # This file was generated by the `rails generate rspec:install` command. Conventionally, all
2
5
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
6
  # The generated `.rspec` file contains `--require spec_helper` which will cause this
@@ -81,5 +84,3 @@ RSpec.configure do |config|
81
84
  # as the one that triggered the failure.
82
85
  Kernel.srand config.seed
83
86
  end
84
-
85
- Target = Struct.new(:search_attr)
metadata CHANGED
@@ -1,14 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: query_string_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Whitney
8
+ - Debbie Gillespie
9
+ - Davin Lagerroos
8
10
  autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2015-01-03 00:00:00.000000000 Z
13
+ date: 2015-02-11 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
16
  name: bundler
@@ -52,6 +54,34 @@ dependencies:
52
54
  - - "~>"
53
55
  - !ruby/object:Gem::Version
54
56
  version: '3'
57
+ - !ruby/object:Gem::Dependency
58
+ name: codeclimate-test-reporter
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.4'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.4'
71
+ - !ruby/object:Gem::Dependency
72
+ name: travis
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.7'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '1.7'
55
85
  - !ruby/object:Gem::Dependency
56
86
  name: rubocop
57
87
  requirement: !ruby/object:Gem::Requirement
@@ -68,15 +98,17 @@ dependencies:
68
98
  version: '0'
69
99
  description:
70
100
  email:
71
- - whit0694@umn.edu
101
+ - asrwebteam@umn.edu
72
102
  executables: []
73
103
  extensions: []
74
104
  extra_rdoc_files: []
75
105
  files:
76
106
  - ".gitignore"
107
+ - ".hound.yml"
77
108
  - ".rspec"
78
109
  - ".rubocop.yml"
79
110
  - ".ruby-version"
111
+ - ".travis.yml"
80
112
  - Gemfile
81
113
  - LICENSE.txt
82
114
  - README.md
@@ -87,13 +119,16 @@ files:
87
119
  - lib/query_string_search/matchers/match_all.rb
88
120
  - lib/query_string_search/matchers/match_attribute.rb
89
121
  - lib/query_string_search/matchers/match_attribute_value.rb
122
+ - lib/query_string_search/matchers/match_multiple_attribute_values.rb
90
123
  - lib/query_string_search/matchers/match_no_attribute.rb
91
124
  - lib/query_string_search/search_options.rb
92
125
  - lib/query_string_search/search_parameters.rb
93
126
  - lib/query_string_search/version.rb
94
127
  - query_string_search.gemspec
128
+ - spec/doubles/search_target.rb
95
129
  - spec/features/find_all_data_spec.rb
96
130
  - spec/features/find_records_that_match_multiple_parameters_spec.rb
131
+ - spec/features/find_records_that_match_one_of_many_attributes_spec.rb
97
132
  - spec/features/find_records_with_matching_attribute_values_spec.rb
98
133
  - spec/features/find_records_with_nil_attributes_spec.rb
99
134
  - spec/features/find_records_with_nonnil_attributes_spec.rb
@@ -104,6 +139,7 @@ files:
104
139
  - spec/lib/query_string_search/matchers/match_all_spec.rb
105
140
  - spec/lib/query_string_search/matchers/match_attribute_spec.rb
106
141
  - spec/lib/query_string_search/matchers/match_attribute_value_spec.rb
142
+ - spec/lib/query_string_search/matchers/match_multiple_attribute_values_spec.rb
107
143
  - spec/lib/query_string_search/matchers/match_no_attribute_spec.rb
108
144
  - spec/lib/query_string_search/search_options_spec.rb
109
145
  - spec/lib/query_string_search/search_parameters_spec.rb
@@ -133,8 +169,10 @@ signing_key:
133
169
  specification_version: 4
134
170
  summary: Provides a standard way to do searches using query strings in an API endpoint
135
171
  test_files:
172
+ - spec/doubles/search_target.rb
136
173
  - spec/features/find_all_data_spec.rb
137
174
  - spec/features/find_records_that_match_multiple_parameters_spec.rb
175
+ - spec/features/find_records_that_match_one_of_many_attributes_spec.rb
138
176
  - spec/features/find_records_with_matching_attribute_values_spec.rb
139
177
  - spec/features/find_records_with_nil_attributes_spec.rb
140
178
  - spec/features/find_records_with_nonnil_attributes_spec.rb
@@ -145,6 +183,7 @@ test_files:
145
183
  - spec/lib/query_string_search/matchers/match_all_spec.rb
146
184
  - spec/lib/query_string_search/matchers/match_attribute_spec.rb
147
185
  - spec/lib/query_string_search/matchers/match_attribute_value_spec.rb
186
+ - spec/lib/query_string_search/matchers/match_multiple_attribute_values_spec.rb
148
187
  - spec/lib/query_string_search/matchers/match_no_attribute_spec.rb
149
188
  - spec/lib/query_string_search/search_options_spec.rb
150
189
  - spec/lib/query_string_search/search_parameters_spec.rb