simple_params 0.0.2.pre4 → 0.0.2.pre5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTVhZDQxZjQzMzZiMWI2ODU1MTc2MWNkMDJlYWY2M2YxN2JlNzMxZQ==
4
+ ZTZkN2ZhYmUzN2JhN2UyMTFmZDA1ZmE5MThiNGJiOTg1ZGEzZGY3YQ==
5
5
  data.tar.gz: !binary |-
6
- YTk1ZjhhZGUwMmIyMjFlNmU5NThkNTczMDNiNDA0MGJhMmY4Y2U5Ng==
6
+ OWFiODcyY2M2ODAwODA3MGFhMDY5ZTkwMDQxM2M3MWE4NDdiNzAwMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZDJhZDkzY2Q5OTFmZmY1NDNhMDlmNDQ1MDA1YThiNjcwZDBlZDhhNmIxODQ0
10
- NWQzYzg4YzQxMjMwZTY2NWJlZDg1ZGQxMDhmNWU0YTExMmI0ZjBhZmQwMzFm
11
- ZWE0M2JiY2IzNzY5MTZmYWMzYzllYmE2Y2Q5ZGU1ZDYyOTgyZmY=
9
+ N2UwMzExNTc0ZGIxMzA4MDYxYzdiZWM1YTgwMzUxMmQzYjc4OTkzOTBiOGEw
10
+ YTBlMWM3Nzk2MzVjNjYxYzQ3ZmZkMzdhYjk2Y2MwM2ZhZTU3YjhiNTk1Y2Ix
11
+ ZDc4NzU3MzdhOGYzZjZkNTUxMjdjODZhYTE4Yzk0ZGUxMTJhZDc=
12
12
  data.tar.gz: !binary |-
13
- NjFhZmI0NTZhNWE0NjNhNGU0YmUxZWFjYmY2M2NhM2MzMDgxZGYzNGMxZTFj
14
- ZDI0YzgwOWE3YjQxMjAwZTgxNjU0NTA3NDJhNmM3MzlkNzVkMDhmYmZiOWFl
15
- ZjMwMzFmYmY3ZTc3ZWVhOTYwOGZlM2FlZGMyNDNhNjQxYmFlNmI=
13
+ YjM3MTNkY2UxYzU5YmE5OGQxYmNiNTI2MjUzZGI4ZGExYWQzZTA4NjM3MzFm
14
+ YjllOGU4ZWZiYWRiODQxY2E1NmE4NDExY2JjNGNhYzYzODhiNDUwMjhlMDRh
15
+ YTdhOWE1MTNkZmRlYTY4NDZmNWEyYjFhN2U3NTkzZTliNGY2OGI=
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_params (0.0.2.pre3)
4
+ simple_params (0.0.2.pre4)
5
5
  activemodel (>= 3.0, < 5.0)
6
6
  virtus (>= 1.0.0)
7
7
 
@@ -22,6 +22,7 @@ GEM
22
22
  ice_nine (~> 0.11.0)
23
23
  thread_safe (~> 0.3, >= 0.3.1)
24
24
  builder (3.2.2)
25
+ coderay (1.1.0)
25
26
  coercible (1.0.0)
26
27
  descendants_tracker (~> 0.0.1)
27
28
  descendants_tracker (0.0.4)
@@ -31,7 +32,12 @@ GEM
31
32
  i18n (0.7.0)
32
33
  ice_nine (0.11.1)
33
34
  json (1.8.2)
35
+ method_source (0.8.2)
34
36
  minitest (5.5.1)
37
+ pry (0.10.1)
38
+ coderay (~> 1.1.0)
39
+ method_source (~> 0.8.1)
40
+ slop (~> 3.4)
35
41
  rake (10.4.2)
36
42
  rspec (2.99.0)
37
43
  rspec-core (~> 2.99.0)
@@ -41,7 +47,8 @@ GEM
41
47
  rspec-expectations (2.99.2)
42
48
  diff-lcs (>= 1.1.3, < 2.0)
43
49
  rspec-mocks (2.99.3)
44
- thread_safe (0.3.4)
50
+ slop (3.6.0)
51
+ thread_safe (0.3.5)
45
52
  tzinfo (1.2.2)
46
53
  thread_safe (~> 0.1)
47
54
  virtus (1.0.4)
@@ -55,6 +62,7 @@ PLATFORMS
55
62
 
56
63
  DEPENDENCIES
57
64
  bundler (~> 1.5)
65
+ pry
58
66
  rake (~> 10.1)
59
67
  rspec (~> 2.6)
60
68
  simple_params!
@@ -0,0 +1,81 @@
1
+ module SimpleParams
2
+ class ApiPieDoc::Attribute
3
+ attr_accessor :attribute, :nested, :options
4
+
5
+ alias :nested? :nested
6
+
7
+ def initialize(simple_params_attribute)
8
+ self.attribute = simple_params_attribute
9
+ self.nested = simple_params_attribute.is_a?(Hash)
10
+ self.options ||= nested? ? attribute.delete(:options) : attribute[1]
11
+ end
12
+
13
+ def name
14
+ nested? ? attribute.keys.first.to_s : attribute[0].to_s
15
+ end
16
+
17
+ def to_s
18
+ return nil if do_not_document?
19
+
20
+ if nested?
21
+ nested_description
22
+ else
23
+ attribute_description
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def do_not_document?
30
+ options[:document].eql?(false)
31
+ end
32
+
33
+ def nested_description
34
+ start = "param :#{name}, Hash, #{description}, #{requirement_description} do"
35
+ attribute_descriptors = []
36
+ attribute.values.flat_map(&:to_a).each do |nested_attribute|
37
+ attribute_descriptors << self.class.new(nested_attribute).to_s
38
+ end
39
+ finish = "end"
40
+ [start, attribute_descriptors, finish].flatten.join("\n")
41
+ end
42
+
43
+ def attribute_description
44
+ base = "param :#{name}"
45
+ [base, type_description, description, requirement_description].reject(&:blank?).join(", ")
46
+ end
47
+
48
+ NotValidValueError = Class.new(StandardError)
49
+
50
+ def type_description
51
+ value = options[:type]
52
+ case value
53
+ when :string, :integer, :array, :hash
54
+ "#{value.to_s.capitalize.constantize}"
55
+ when 'String', 'Integer', 'Array', 'Hash'
56
+ "#{value}"
57
+ when :decimal, :datetime, :date, :time, :float, :boolean
58
+ ""
59
+ else
60
+ raise NotValidValueError.new("Must be one of #{SimpleParams::Params::TYPES}")
61
+ end
62
+ end
63
+
64
+ def requirement_description
65
+ value = options[:optional]
66
+ case value
67
+ when true
68
+ ""
69
+ when false
70
+ "required: true"
71
+ else
72
+ "required: true"
73
+ end
74
+ end
75
+
76
+ def description
77
+ description = options[:desc] || ''
78
+ "desc: '#{description}'"
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,38 @@
1
+ module SimpleParams
2
+ class ApiPieDoc
3
+
4
+ attr_accessor :base_attributes,
5
+ :nested_hashes,
6
+ :nested_attributes,
7
+ :docs
8
+
9
+ def initialize(simple_params)
10
+ self.base_attributes = simple_params.defined_attributes
11
+ self.nested_hashes = simple_params.nested_hashes
12
+ self.nested_attributes = []
13
+ self.docs = []
14
+
15
+ build_nested_attributes
16
+ end
17
+
18
+ def build
19
+ base_attributes.each do |attribute|
20
+ docs << Attribute.new(attribute).to_s
21
+ end
22
+
23
+ nested_attributes.each do |nested_attribute|
24
+ docs << Attribute.new(nested_attribute).to_s
25
+ end
26
+
27
+ docs.join("\n")
28
+ end
29
+
30
+ private
31
+
32
+ def build_nested_attributes
33
+ nested_hashes.each do |name, parameter_set|
34
+ nested_attributes << { name => parameter_set.defined_attributes, options: parameter_set.options }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -7,19 +7,20 @@ module SimpleParams
7
7
  include ActiveModel::Validations
8
8
  include SimpleParams::Validations
9
9
 
10
+ TYPES = [
11
+ :integer,
12
+ :string,
13
+ :decimal,
14
+ :datetime,
15
+ :date,
16
+ :time,
17
+ :float,
18
+ :boolean,
19
+ :array,
20
+ :hash
21
+ ]
22
+
10
23
  class << self
11
- TYPES = [
12
- :integer,
13
- :string,
14
- :decimal,
15
- :datetime,
16
- :date,
17
- :time,
18
- :float,
19
- :boolean,
20
- :array,
21
- :hash
22
- ]
23
24
 
24
25
  TYPES.each do |sym|
25
26
  define_method("#{sym}_param") do |name, opts={}|
@@ -27,7 +28,11 @@ module SimpleParams
27
28
  end
28
29
  end
29
30
 
30
- attr_accessor :strict_enforcement
31
+ attr_accessor :strict_enforcement, :options
32
+
33
+ def api_pie_documentation
34
+ SimpleParams::ApiPieDoc.new(self).build
35
+ end
31
36
 
32
37
  def strict
33
38
  @strict_enforcement = true
@@ -44,7 +49,7 @@ module SimpleParams
44
49
 
45
50
  def nested_hash(name, opts={}, &block)
46
51
  attr_accessor name
47
- nested_class = define_nested_class(&block)
52
+ nested_class = define_nested_class(opts, &block)
48
53
  @nested_hashes ||= {}
49
54
  @nested_hashes[name.to_sym] = nested_class
50
55
  end
@@ -82,7 +87,7 @@ module SimpleParams
82
87
  validates name, validations unless validations.empty?
83
88
  end
84
89
 
85
- def define_nested_class(&block)
90
+ def define_nested_class(options, &block)
86
91
  Class.new(Params).tap do |klass|
87
92
  name_function = Proc.new {
88
93
  def self.model_name
@@ -91,6 +96,7 @@ module SimpleParams
91
96
  }
92
97
  klass.class_eval(&name_function)
93
98
  klass.class_eval(&block)
99
+ klass.class_eval("self.options = options")
94
100
  end
95
101
  end
96
102
  end
@@ -151,7 +157,7 @@ module SimpleParams
151
157
  end
152
158
 
153
159
  def set_accessors(params={})
154
- params.each do |attribute_name, value|
160
+ params.each do |attribute_name, value|
155
161
  # Don't set accessors for nested classes
156
162
  unless value.is_a?(Hash)
157
163
  send("#{attribute_name}=", value)
@@ -187,4 +193,4 @@ module SimpleParams
187
193
  klass.new(hash)
188
194
  end
189
195
  end
190
- end
196
+ end
@@ -1,3 +1,3 @@
1
1
  module SimpleParams
2
- VERSION = "0.0.2.pre4"
2
+ VERSION = "0.0.2.pre5"
3
3
  end
data/lib/simple_params.rb CHANGED
@@ -5,3 +5,5 @@ require 'simple_params/errors'
5
5
  require 'simple_params/validations'
6
6
  require 'simple_params/params'
7
7
  require 'simple_params/simple_params_error'
8
+ require 'simple_params/api_pie_doc'
9
+ require 'simple_params/api_pie_doc/attribute'
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.5"
24
24
  spec.add_development_dependency "rake", "~> 10.1"
25
25
  spec.add_development_dependency "rspec", "~> 2.6"
26
+ spec.add_development_dependency "pry"
26
27
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  class AcceptanceParams < SimpleParams::Params
4
4
  param :name
5
- param :age, type: Integer, optional: true
5
+ param :age, type: :integer, optional: true
6
6
  param :color, default: "red", validations: { inclusion: { in: ["red", "green"] }}
7
7
 
8
8
  nested_hash :address do
@@ -23,7 +23,7 @@ describe SimpleParams::Params do
23
23
  params.name = "Tom"
24
24
  params.name.should eq("Tom")
25
25
  end
26
-
26
+
27
27
  it "has getter and setter methods for optional param" do
28
28
  params.should respond_to(:age)
29
29
  params.name.should be_nil
@@ -38,7 +38,7 @@ describe SimpleParams::Params do
38
38
  params.address.street = "1 Main St."
39
39
  params.address.street.should eq("1 Main St.")
40
40
  end
41
-
41
+
42
42
  it "has getter and setter methods for optional param" do
43
43
  params.address.should respond_to(:zip_code)
44
44
  params.address.zip_code.should be_nil
@@ -49,13 +49,13 @@ describe SimpleParams::Params do
49
49
  end
50
50
 
51
51
  describe "array syntax", array_syntax: true do
52
- let(:params) do
52
+ let(:params) do
53
53
  AcceptanceParams.new(
54
- name: "Bill",
55
- age: 30,
56
- address: {
57
- city: "Greenville"
58
- }
54
+ name: "Bill",
55
+ age: 30,
56
+ address: {
57
+ city: "Greenville"
58
+ }
59
59
  )
60
60
  end
61
61
 
@@ -136,4 +136,24 @@ describe SimpleParams::Params do
136
136
  end
137
137
  end
138
138
  end
139
- end
139
+
140
+ describe "api_pie_documentation", api_pie_documentation: true do
141
+ it "generates valida api_pie documentation" do
142
+ documentation = AcceptanceParams.api_pie_documentation
143
+ api_docs = <<-API_PIE_DOCS
144
+ param :name, String, desc: '', required: true
145
+ param :age, Integer, desc: ''
146
+ param :color, String, desc: '', required: true
147
+ param :address, Hash, desc: '', required: true do
148
+ param :street, String, desc: '', required: true
149
+ param :city, String, desc: '', required: true
150
+ param :zip_code, String, desc: ''
151
+ param :state, String, desc: '', required: true
152
+ end
153
+ API_PIE_DOCS
154
+
155
+ expect(documentation).to be_a String
156
+ expect(documentation.gsub(/\s+/, "")).to eq api_docs.gsub(/\s+/, "")
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,145 @@
1
+ require 'spec_helper'
2
+
3
+ describe SimpleParams::ApiPieDoc::Attribute do
4
+ let(:simple_param_attribute) { [:name, {:type=>:string}] }
5
+ let(:nested_simple_param_attribute) {
6
+ {:address=>
7
+ {:street=>{:type=>:string},
8
+ :city=>{:validations=>{:length=>{:in=>4..40}, :presence=>true}, :type=>:string},
9
+ :zip_code=>{:optional=>true, :type=>:string},
10
+ :state=>{:default=>"North Carolina", :type=>:string}
11
+ },
12
+ :options=>{desc: 'i like pie'}
13
+ }
14
+ }
15
+ let(:api_pie_doc_attribute) { described_class.new(simple_param_attribute) }
16
+ let(:nested_api_pie_doc_attribute) { described_class.new(nested_simple_param_attribute) }
17
+
18
+ describe '#initialize' do
19
+
20
+ specify 'should give instance an attribute' do
21
+ expect(api_pie_doc_attribute.attribute).to eq simple_param_attribute
22
+ end
23
+
24
+ specify 'should set nested' do
25
+ expect(api_pie_doc_attribute.nested).to eq false
26
+ end
27
+ end
28
+
29
+ describe '#name' do
30
+ context 'when attribute is nested' do
31
+ specify 'should set respond with the right name' do
32
+ expect(nested_api_pie_doc_attribute.name).to eq 'address'
33
+ end
34
+ end
35
+
36
+ context 'when attribute is not nested' do
37
+ specify 'should set respond with the right name' do
38
+ expect(api_pie_doc_attribute.name).to eq 'name'
39
+ end
40
+ end
41
+ end
42
+
43
+ describe '#options' do
44
+ context 'when attribute is nested' do
45
+ specify 'should return nested attribute options' do
46
+ expect(nested_api_pie_doc_attribute.options).to eq({desc: 'i like pie'})
47
+ end
48
+ end
49
+
50
+ context 'when attribute is not nested' do
51
+ specify 'should return the attributes options' do
52
+ expect(api_pie_doc_attribute.options).to eq({ type: :string })
53
+ end
54
+ end
55
+ end
56
+
57
+ describe '#nested?' do
58
+ context 'when attribute is nested' do
59
+ specify 'should return true' do
60
+ expect(nested_api_pie_doc_attribute.nested?).to eq true
61
+ end
62
+ end
63
+
64
+ context 'when attribute is not nested' do
65
+ specify 'should return false' do
66
+ expect(api_pie_doc_attribute.nested?).to eq false
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#to_s' do
72
+ context 'when attribute is nested' do
73
+ specify 'should return properly formatted string' do
74
+ expect(nested_api_pie_doc_attribute.to_s).to eq("param :address, Hash, desc: 'i like pie', required: true do\nparam :street, String, desc: '', required: true\nparam :city, String, desc: '', required: true\nparam :zip_code, String, desc: ''\nparam :state, String, desc: '', required: true\nend")
75
+ end
76
+ end
77
+
78
+ context 'when attribute is not nested' do
79
+ specify 'should return properly formatted string' do
80
+ expect(api_pie_doc_attribute.to_s).to eq("param :name, String, desc: '', required: true")
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#type_description" do
86
+ context "where attribute.options[:type] is a accepted symbol" do
87
+ specify "should return a formatted string with constantized version of symbol" do
88
+ expect(api_pie_doc_attribute.send(:type_description)).to eq "String"
89
+ end
90
+ end
91
+
92
+ context "where attribute.options[:type] is a accepted string" do
93
+ specify "should return a formatted string with constantized version of symbol" do
94
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {:type=>'String'}])
95
+ expect(attribute.send(:type_description)).to eq "String"
96
+ end
97
+ end
98
+
99
+ context "where attribute.options[:type] is anything else" do
100
+ specify "should raise an error" do
101
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {:type=>'Craziness'}])
102
+ expect{attribute.send(:type_description)}.to raise_error(SimpleParams::ApiPieDoc::Attribute::NotValidValueError)
103
+ end
104
+ end
105
+ end
106
+
107
+ describe "#requirement_description" do
108
+ context "when attribute options[:optional] is true" do
109
+ specify "should return a formatted string indicating the attribute is not required" do
110
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {:optional=>true}])
111
+ expect(attribute.send(:requirement_description)).to eq ""
112
+ end
113
+ end
114
+
115
+ context "when attribute options[:optional] is false" do
116
+ specify "should return a formatted string indicating the attribute is required" do
117
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {:optional=>false}])
118
+ expect(attribute.send(:requirement_description)).to eq "required: true"
119
+ end
120
+ end
121
+
122
+ context "when passed anything other than true or false" do
123
+ specify "should return a formatted string indicating the attribute is required" do
124
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {:optional=>:blah}])
125
+ expect(attribute.send(:requirement_description)).to eq "required: true"
126
+ end
127
+ end
128
+ end
129
+
130
+ describe "#description" do
131
+ context "when attribute options[:desc] is not nil" do
132
+ specify "should use options[:desc] to populate attribute description" do
133
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {:desc => 'I like pie'}])
134
+ expect(attribute.send(:description)).to eq "desc: 'I like pie'"
135
+ end
136
+ end
137
+
138
+ context "when attribute options[:desc] is nil" do
139
+ specify "should return an empty string as the description" do
140
+ attribute = SimpleParams::ApiPieDoc::Attribute.new([:name, {}])
141
+ expect(attribute.send(:description)).to eq "desc: ''"
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'fixtures/dummy_params'
3
+
4
+ describe SimpleParams::ApiPieDoc do
5
+
6
+ let(:api_pie_doc) { SimpleParams::ApiPieDoc.new(DummyParams) }
7
+
8
+ describe "#initialize" do
9
+ specify "should give object base_attributes" do
10
+ expect(api_pie_doc.base_attributes).to include(name: { type: :string })
11
+ expect(api_pie_doc.base_attributes).to include(age: { optional: true, type: :integer })
12
+ expect(api_pie_doc.base_attributes.keys).to include(:amount, :color, :first_initial)
13
+ end
14
+
15
+ specify "should give object nested_hashes" do
16
+ expect(api_pie_doc.nested_hashes.keys).to eq [:address, :phone]
17
+ end
18
+
19
+ specify "should call #build_nested_attributes" do
20
+ expect_any_instance_of(SimpleParams::ApiPieDoc).to receive(:build_nested_attributes)
21
+ api_pie_doc
22
+ end
23
+
24
+ specify "should give object nested_attributes" do
25
+ expect(api_pie_doc.nested_attributes.flat_map(&:keys)).to include(:address, :phone)
26
+ expect(api_pie_doc.nested_attributes[0].values.flat_map(&:keys)).to eq [:street, :city, :zip_code, :state]
27
+ expect(api_pie_doc.nested_attributes[1].values.flat_map(&:keys)).to eq [:cell_phone, :phone_number, :area_code]
28
+ end
29
+
30
+ specify "should give object docs" do
31
+ expect(api_pie_doc.docs).to eq []
32
+ end
33
+ end
34
+
35
+ describe "#build" do
36
+ specify "should return a string of api_pie documentation params" do
37
+ expect(api_pie_doc.build).to be_a String
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ class DummyParams < SimpleParams::Params
2
+ string_param :name
3
+ integer_param :age, optional: true
4
+ string_param :first_initial, default: lambda { |params, param| params.name[0] if params.name.present? }
5
+ decimal_param :amount, optional: true, default: 0.10, formatter: lambda { |params, param| param.round(2) }
6
+ param :color, default: "red", validations: { inclusion: { in: ["red", "green"] }}, formatter: :lower_case_colors
7
+
8
+ nested_hash :address do
9
+ string_param :street
10
+ string_param :city, validations: { length: { in: 4..40 } }
11
+ string_param :zip_code, optional: true, validations: { length: { in: 5..9 } }
12
+ param :state, default: "North Carolina", formatter: :transform_state_code
13
+
14
+ def transform_state_code(val)
15
+ val == "SC" ? "South Carolina" : val
16
+ end
17
+ end
18
+
19
+ nested_hash :phone do
20
+ boolean_param :cell_phone, default: true
21
+ string_param :phone_number, validations: { length: { in: 7..10 } }, formatter: lambda { |params, attribute| attribute.gsub(/\D/, "") }
22
+ string_param :area_code, default: lambda { |params, param|
23
+ if params.phone_number.present?
24
+ params.phone_number[0..2]
25
+ end
26
+ }
27
+ end
28
+
29
+ def lower_case_colors(val)
30
+ val.downcase
31
+ end
32
+ end
data/spec/params_spec.rb CHANGED
@@ -1,37 +1,5 @@
1
1
  require 'spec_helper'
2
-
3
- class DummyParams < SimpleParams::Params
4
- string_param :name
5
- integer_param :age, optional: true
6
- string_param :first_initial, default: lambda { |params, param| params.name[0] if params.name.present? }
7
- decimal_param :amount, optional: true, default: 0.10, formatter: lambda { |params, param| param.round(2) }
8
- param :color, default: "red", validations: { inclusion: { in: ["red", "green"] }}, formatter: :lower_case_colors
9
-
10
- nested_hash :address do
11
- string_param :street
12
- string_param :city, validations: { length: { in: 4..40 } }
13
- string_param :zip_code, optional: true, validations: { length: { in: 5..9 } }
14
- param :state, default: "North Carolina", formatter: :transform_state_code
15
-
16
- def transform_state_code(val)
17
- val == "SC" ? "South Carolina" : val
18
- end
19
- end
20
-
21
- nested_hash :phone do
22
- boolean_param :cell_phone, default: true
23
- string_param :phone_number, validations: { length: { in: 7..10 } }, formatter: lambda { |params, attribute| attribute.gsub(/\D/, "") }
24
- string_param :area_code, default: lambda { |params, param|
25
- if params.phone_number.present?
26
- params.phone_number[0..2]
27
- end
28
- }
29
- end
30
-
31
- def lower_case_colors(val)
32
- val.downcase
33
- end
34
- end
2
+ require 'fixtures/dummy_params'
35
3
 
36
4
  describe SimpleParams::Params do
37
5
  describe "strict parameter enforcement" do
@@ -76,7 +44,7 @@ describe SimpleParams::Params do
76
44
  params.name = "Tom"
77
45
  params.name.should eq("Tom")
78
46
  end
79
-
47
+
80
48
  it "has getter and setter methods for optional param" do
81
49
  params.should respond_to(:age)
82
50
  params.name.should be_nil
@@ -91,7 +59,7 @@ describe SimpleParams::Params do
91
59
  params.address.street = "1 Main St."
92
60
  params.address.street.should eq("1 Main St.")
93
61
  end
94
-
62
+
95
63
  it "has getter and setter methods for optional param" do
96
64
  params.address.should respond_to(:zip_code)
97
65
  params.address.zip_code.should be_nil
@@ -102,13 +70,13 @@ describe SimpleParams::Params do
102
70
  end
103
71
 
104
72
  describe "array syntax", array_syntax: true do
105
- let(:params) do
73
+ let(:params) do
106
74
  DummyParams.new(
107
- name: "Bill",
108
- age: 30,
109
- address: {
110
- city: "Greenville"
111
- }
75
+ name: "Bill",
76
+ age: 30,
77
+ address: {
78
+ city: "Greenville"
79
+ }
112
80
  )
113
81
  end
114
82
 
@@ -163,13 +131,13 @@ describe SimpleParams::Params do
163
131
  it "coerces nested attributes on initialization" do
164
132
  params = DummyParams.new(address: { zip_code: 90210 })
165
133
  params.address.zip_code.should eq("90210")
166
- end
134
+ end
167
135
 
168
136
  it "coerces nested attributes from setters" do
169
137
  params = DummyParams.new
170
138
  params.address.zip_code = 90210
171
139
  params.address.zip_code.should eq("90210")
172
- end
140
+ end
173
141
  end
174
142
 
175
143
  describe "defaults", defaults: true do
@@ -312,4 +280,31 @@ describe SimpleParams::Params do
312
280
  end
313
281
  end
314
282
  end
315
- end
283
+
284
+ describe "api_pie_documentation", api_pie_documentation: true do
285
+ it "generates valida api_pie documentation" do
286
+ documentation = DummyParams.api_pie_documentation
287
+ api_docs = <<-API_PIE_DOCS
288
+ param :name, String, desc: '', required: true
289
+ param :age, Integer, desc: ''
290
+ param :first_initial, String, desc: '', required: true
291
+ param :amount, desc: ''
292
+ param :color, String, desc: '', required: true
293
+ param :address, Hash, desc: '', required: true do
294
+ param :street, String, desc: '', required: true
295
+ param :city, String, desc: '', required: true
296
+ param :zip_code, String, desc: ''
297
+ param :state, String, desc: '', required: true
298
+ end
299
+ param :phone, Hash, desc: '', required: true do
300
+ param :cell_phone, desc: '', required: true
301
+ param :phone_number, String, desc: '', required: true
302
+ param :area_code, String, desc: '', required: true
303
+ end
304
+ API_PIE_DOCS
305
+
306
+ expect(documentation).to be_a String
307
+ expect(documentation.gsub(/\s+/, "")).to eq api_docs.gsub(/\s+/, "")
308
+ end
309
+ end
310
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  require 'simple_params'
4
+ require 'pry'
4
5
 
5
6
  Dir[("../spec/support/**/*.rb")].each {|f| require f}
6
7
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_params
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.pre4
4
+ version: 0.0.2.pre5
5
5
  platform: ruby
6
6
  authors:
7
7
  - brycesenz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-07 00:00:00.000000000 Z
11
+ date: 2015-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -86,6 +86,20 @@ dependencies:
86
86
  - - ~>
87
87
  - !ruby/object:Gem::Version
88
88
  version: '2.6'
89
+ - !ruby/object:Gem::Dependency
90
+ name: pry
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
89
103
  description: Simple way to specify API params
90
104
  email:
91
105
  - bryce.senz@gmail.com
@@ -100,6 +114,8 @@ files:
100
114
  - Gemfile.lock
101
115
  - README.md
102
116
  - lib/simple_params.rb
117
+ - lib/simple_params/api_pie_doc.rb
118
+ - lib/simple_params/api_pie_doc/attribute.rb
103
119
  - lib/simple_params/attribute.rb
104
120
  - lib/simple_params/errors.rb
105
121
  - lib/simple_params/formatter.rb
@@ -109,8 +125,11 @@ files:
109
125
  - lib/simple_params/version.rb
110
126
  - simple_params.gemspec
111
127
  - spec/acceptance_spec.rb
128
+ - spec/api_pie_doc/attribute_spec.rb
129
+ - spec/api_pie_doc_spec.rb
112
130
  - spec/attribute_spec.rb
113
131
  - spec/errors_spec.rb
132
+ - spec/fixtures/dummy_params.rb
114
133
  - spec/formatter_spec.rb
115
134
  - spec/params_spec.rb
116
135
  - spec/spec_helper.rb
@@ -140,8 +159,11 @@ specification_version: 4
140
159
  summary: A DSL for specifying params, including type coercion and validation
141
160
  test_files:
142
161
  - spec/acceptance_spec.rb
162
+ - spec/api_pie_doc/attribute_spec.rb
163
+ - spec/api_pie_doc_spec.rb
143
164
  - spec/attribute_spec.rb
144
165
  - spec/errors_spec.rb
166
+ - spec/fixtures/dummy_params.rb
145
167
  - spec/formatter_spec.rb
146
168
  - spec/params_spec.rb
147
169
  - spec/spec_helper.rb