simple_params 0.0.2.pre4 → 0.0.2.pre5

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.
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