flapjack-diner 2.0.0b1 → 2.0.0.pre.alpha.1

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +21 -0
  3. data/.rubocop_todo.yml +135 -0
  4. data/.travis.yml +10 -5
  5. data/README.md +125 -143
  6. data/flapjack-diner.gemspec +1 -1
  7. data/lib/flapjack-diner.rb +24 -54
  8. data/lib/flapjack-diner/argument_validator.rb +17 -0
  9. data/lib/flapjack-diner/resources/checks.rb +52 -0
  10. data/lib/flapjack-diner/resources/contacts.rb +54 -0
  11. data/lib/flapjack-diner/resources/events.rb +54 -0
  12. data/lib/flapjack-diner/resources/maintenance_periods.rb +76 -0
  13. data/lib/flapjack-diner/resources/media.rb +75 -0
  14. data/lib/flapjack-diner/resources/metrics.rb +23 -0
  15. data/lib/flapjack-diner/resources/relationships.rb +275 -0
  16. data/lib/flapjack-diner/resources/rules.rb +75 -0
  17. data/lib/flapjack-diner/resources/states.rb +24 -0
  18. data/lib/flapjack-diner/resources/statistics.rb +24 -0
  19. data/lib/flapjack-diner/resources/tags.rb +47 -0
  20. data/lib/flapjack-diner/tools.rb +456 -46
  21. data/lib/flapjack-diner/version.rb +1 -1
  22. data/spec/flapjack-diner_spec.rb +18 -9
  23. data/spec/resources/checks_spec.rb +7 -7
  24. data/spec/resources/contacts_spec.rb +12 -14
  25. data/spec/resources/events_spec.rb +13 -13
  26. data/spec/resources/maintenance_periods_spec.rb +3 -3
  27. data/spec/resources/media_spec.rb +3 -3
  28. data/spec/resources/metrics_spec.rb +1 -1
  29. data/spec/{relationships_spec.rb → resources/relationships_spec.rb} +25 -71
  30. data/spec/resources/rules_spec.rb +62 -62
  31. data/spec/resources/states_spec.rb +1 -1
  32. data/spec/resources/statistics_spec.rb +1 -1
  33. data/spec/resources/tags_spec.rb +19 -75
  34. data/spec/support/fixture_data.rb +43 -80
  35. metadata +22 -17
  36. data/lib/flapjack-diner/configuration.rb +0 -417
  37. data/lib/flapjack-diner/log_formatter.rb +0 -22
  38. data/lib/flapjack-diner/query.rb +0 -114
  39. data/lib/flapjack-diner/relationships.rb +0 -180
  40. data/lib/flapjack-diner/request.rb +0 -280
  41. data/lib/flapjack-diner/resources.rb +0 -64
  42. data/lib/flapjack-diner/response.rb +0 -91
  43. data/lib/flapjack-diner/utility.rb +0 -16
@@ -1,22 +0,0 @@
1
- module Flapjack
2
- module Diner
3
- class LogFormatter #:nodoc:
4
- TAG_NAME = Flapjack::Diner.name
5
-
6
- attr_accessor :level, :logger, :current_time
7
-
8
- def initialize(logger, level)
9
- @logger = logger
10
- @level = level.to_sym
11
- end
12
-
13
- def format(request, response)
14
- current_time = Time.now.strftime("%Y-%m-%d %H:%M:%S %z")
15
- http_method = request.http_method.name.split("::").last.upcase
16
- path = request.path.to_s
17
- content_length = response.respond_to?(:headers) ? response.headers['Content-Length'] : response['Content-Length']
18
- @logger.send @level, "[#{TAG_NAME}] [#{current_time}] #{response.code} \"#{http_method} #{path}\" #{content_length || '-'} "
19
- end
20
- end
21
- end
22
- end
@@ -1,114 +0,0 @@
1
- require 'flapjack-diner/utility'
2
-
3
- module Flapjack
4
- module Diner
5
- module Query
6
-
7
- def self.validate_params(query = {}, &validation)
8
- return unless block_given?
9
- query = {} if [].eql?(query)
10
- case query
11
- when Array
12
- query.each do |q|
13
- ArgumentValidator.new(q).instance_eval(&validation)
14
- end
15
- else
16
- ArgumentValidator.new(query).instance_eval(&validation)
17
- end
18
- end
19
-
20
- # copied from Rack::Utils -- builds the query string for GETs
21
- def self.build_nested(value, prefix = nil)
22
- case value
23
- when Array
24
- build_array(value, prefix)
25
- when Hash
26
- build_hash(value, prefix)
27
- else
28
- build_data(value, prefix)
29
- end
30
- end
31
-
32
- # used for the JSON data hashes in POST, PUT, DELETE
33
- def self.prepare_nested(value)
34
- case value
35
- when Array
36
- prepare_array(value)
37
- when Hash
38
- prepare_hash(value)
39
- else
40
- prepare_data(value)
41
- end
42
- end
43
-
44
- def self.unwrap_uuids(*args)
45
- ids = args.select {|a| a.is_a?(String) }
46
- raise "IDs must be RFC 4122-compliant UUIDs" unless ids.all? {|id|
47
- id =~ /^#{Flapjack::Diner::UUID_RE}$/i
48
- }
49
- ids
50
- end
51
-
52
- def self.unwrap_data(*args)
53
- data = args.reject {|a| a.is_a?(String) || a.is_a?(Integer) }
54
- unless data.all? {|a| a.is_a?(Hash) }
55
- raise 'Data must be passed as a Hash, or multiple Hashes'
56
- end
57
- return Flapjack::Diner::Utility.symbolize(data.first) if data.size == 1
58
- data.each_with_object([]) {|d, o| o << Flapjack::Diner::Utility.symbolize(d) }
59
- end
60
-
61
- private
62
-
63
- def self.build_array(value, prefix)
64
- value.map {|v| build_nested(v, "#{prefix}[]") }.join('&')
65
- end
66
-
67
- def self.build_hash(value, prefix)
68
- value.map do |k, v|
69
- data = prefix ? "#{prefix}[#{k}]" : k
70
- build_nested(v, data)
71
- end.join('&')
72
- end
73
-
74
- def self.build_data(value, prefix)
75
- if value.respond_to?(:iso8601)
76
- raise(ArgumentError, 'Value must be a Hash') if prefix.nil?
77
- "#{escape(prefix)}=#{escape(value.iso8601)}"
78
- elsif value.is_a?(String) || value.is_a?(Integer)
79
- raise(ArgumentError, 'Value must be a Hash') if prefix.nil?
80
- "#{escape(prefix)}=#{escape(value.to_s)}"
81
- else
82
- prefix
83
- end
84
- end
85
-
86
- def self.escape(s)
87
- URI.encode_www_form_component(s)
88
- end
89
-
90
- def self.prepare_array(value)
91
- value.map {|v| prepare_nested(v) }
92
- end
93
-
94
- def self.prepare_hash(value)
95
- value.each_with_object({}) do |(k, v), a|
96
- a[k] = prepare_nested(v)
97
- end
98
- end
99
-
100
- def self.prepare_data(value)
101
- if value.respond_to?(:iso8601)
102
- value.iso8601
103
- else
104
- case value
105
- when Integer, TrueClass, FalseClass, NilClass
106
- value
107
- else
108
- value.to_s
109
- end
110
- end
111
- end
112
- end
113
- end
114
- end
@@ -1,180 +0,0 @@
1
- require 'flapjack-diner/query'
2
-
3
- module Flapjack
4
- module Diner
5
- module Relationships
6
-
7
- # FIXME include option for GET should check config settings for includable
8
-
9
- def self.included(base)
10
- # base.extend ClassMethods
11
- base.class_eval do
12
-
13
- ::Flapjack::Diner::Configuration::RESOURCES.each_pair do |resource, config|
14
- mappings = config[:relationships]
15
- next if mappings.nil?
16
-
17
- res = config[:resource]
18
- resource_id_validator = :uuid
19
-
20
- # # NB: no non-GET singular link methods, so commented out for now
21
- # mappings.select {|n, a| a[:post] && a[:link] && :singular.eql?(a[:number]) }.each do |linked, assoc|
22
- # linked_id_validator = :singular_link_uuid
23
-
24
- # define_singleton_method("create_#{res}_link_#{linked}") do |resource_id, linked_id|
25
- # validations_proc = proc do
26
- # Flapjack::Diner::Query.validate_params(:resource_id => resource_id, :linked_id => linked_id) do
27
- # validate :query => :resource_id, :as => resource_id_validator
28
- # validate :query => :linked_id, :as => linked_id_validator
29
- # end
30
- # end
31
-
32
- # resp = Flapjack::Diner::Request.new(
33
- # linked, "/#{resource}/#{resource_id}/relationships/#{linked}",
34
- # :ids => linked_id, :validations_proc => validations_proc
35
- # ).post_links
36
- # @response = Flapjack::Diner::Response.new(resp)
37
- # @response.process
38
- # @response.output
39
- # end
40
- # end
41
-
42
- mappings.select {|n, a| a[:post] && a[:link] && :multiple.eql?(a[:number]) }.each do |linked, assoc|
43
- type = ::Flapjack::Diner::Configuration::RESOURCES[linked][:resource]
44
- linked_ids_validator = :multiple_link_uuid
45
-
46
- define_singleton_method("create_#{res}_link_#{linked}") do |resource_id, *linked_ids|
47
- validations_proc = proc do
48
- Flapjack::Diner::Query.validate_params(:resource_id => resource_id, :linked_ids => linked_ids) do
49
- validate :query => :resource_id, :as => resource_id_validator
50
- validate :query => :linked_ids, :as => linked_ids_validator
51
- end
52
- end
53
-
54
- resp = Flapjack::Diner::Request.new(
55
- type, "/#{resource}/#{resource_id}/relationships/#{linked}",
56
- :ids => linked_ids, :validations_proc => validations_proc
57
- ).post_links
58
- @response = Flapjack::Diner::Response.new(resp)
59
- @response.process
60
- @response.output
61
- end
62
- end
63
-
64
- mappings.select {|n, a| a[:get] && a[:link] }.each do |linked, assoc|
65
- define_singleton_method("#{res}_link_#{linked}") do |resource_id, opts = {}|
66
- validations_proc = proc do |data|
67
- Flapjack::Diner::Query.validate_params(:resource_id => resource_id) do
68
- validate :query => :resource_id, :as => resource_id_validator
69
- end
70
-
71
- Flapjack::Diner::Query.validate_params(opts) do
72
- validate :query => [:fields, :sort, :include], :as => :string_or_array_of_strings
73
- validate :query => :filter, :as => :hash
74
- validate :query => [:page, :per_page], :as => :positive_integer
75
- end
76
- end
77
-
78
- resp = Flapjack::Diner::Request.new(
79
- linked, "/#{resource}/#{resource_id}/#{linked}", :data => [opts],
80
- :assoc => linked, :validations_proc => validations_proc
81
- ).get
82
- @response = Flapjack::Diner::Response.new(resp)
83
- @response.process
84
- @response.output
85
- end
86
- end
87
-
88
- # # NB: no non-GET singular link methods, so commented out for now
89
- # mappings.select {|n, a| a[:patch] && a[:link] && :singular.eql?(a[:number]) }.each do |linked, assoc|
90
- # linked_id_validator = :singular_link_uuid
91
-
92
- # define_singleton_method("update_#{res}_link_#{linked}") do |resource_id, linked_id|
93
- # validations_proc = proc do
94
- # Flapjack::Diner::Query.validate_params(:resource_id => resource_id, :linked_id => linked_id) do
95
- # validate :query => :resource_id, :as => resource_id_validator
96
- # validate :query => :linked_id, :as => linked_id_validator
97
- # end
98
- # end
99
-
100
- # resp = Flapjack::Diner::Request.new(
101
- # linked, "/#{resource}/#{resource_id}/relationships/#{linked}",
102
- # :ids => linked_id, :validations_proc => validation_proc, :single => true
103
- # ).patch_links
104
- # @response = Flapjack::Diner::Response.new(resp)
105
- # @response.process
106
- # @response.output
107
- # end
108
- # end
109
-
110
- mappings.select {|n, a| a[:patch] && a[:link] && :multiple.eql?(a[:number]) }.each do |linked, assoc|
111
- type = ::Flapjack::Diner::Configuration::RESOURCES[linked][:resource]
112
- linked_ids_validator = :multiple_link_uuid
113
-
114
- define_singleton_method("update_#{res}_link_#{linked}") do |resource_id, *linked_ids|
115
- validations_proc = proc do
116
- Flapjack::Diner::Query.validate_params(:resource_id => resource_id, :linked_ids => linked_ids) do
117
- validate :query => :resource_id, :as => resource_id_validator
118
- validate :query => :linked_id, :as => linked_ids_validator
119
- end
120
- end
121
-
122
- resp = Flapjack::Diner::Request.new(
123
- type, "/#{resource}/#{resource_id}/relationships/#{linked}",
124
- :ids => linked_ids, :validations_proc => validations_proc
125
- ).patch_links
126
- @response = Flapjack::Diner::Response.new(resp)
127
- @response.process
128
- @response.output
129
- end
130
- end
131
-
132
- # # NB: no non-GET singular link methods, so commented out for now
133
- # mappings.select {|n, a| a[:delete] && a[:link] && :singular.eql?(a[:number]) }.each do |linked, assoc|
134
- # linked_id_validator = :singular_link_uuid
135
-
136
- # define_singleton_method("delete_#{res}_link_#{linked}") do |resource_id, linked_id|
137
- # validations_proc = proc do
138
- # Flapjack::Diner::Query.validate_params(:resource_id => resource_id, :linked_id => linked_id) do
139
- # validate :query => :resource_id, :as => resource_id_validator
140
- # validate :query => :linked_id, :as => linked_id_validator
141
- # end
142
- # end
143
-
144
- # resp = Flapjack::Diner::Request.new(
145
- # linked, "/#{resource}/#{resource_id}/relationships/#{linked}",
146
- # :ids => linked_ids :validations_proc => validations_proc
147
- # ).delete_links
148
- # @response = Flapjack::Diner::Response.new(resp)
149
- # @response.process
150
- # @response.output
151
- # end
152
- # end
153
-
154
- mappings.select {|n, a| a[:delete] && a[:link] && :multiple.eql?(a[:number]) }.each do |linked, assoc|
155
- type = ::Flapjack::Diner::Configuration::RESOURCES[linked][:resource]
156
- linked_ids_validator = :uuid_or_array_of_uuids
157
-
158
- define_singleton_method("delete_#{res}_link_#{linked}") do |resource_id, *linked_ids|
159
- validations_proc = proc do
160
- Flapjack::Diner::Query.validate_params(:resource_id => resource_id, :linked_ids => linked_ids) do
161
- validate :query => :resource_id, :as => resource_id_validator
162
- validate :query => :linked_ids, :as => linked_ids_validator
163
- end
164
- end
165
-
166
- resp = Flapjack::Diner::Request.new(
167
- type, "/#{resource}/#{resource_id}/relationships/#{linked}",
168
- :ids => linked_ids, :validations_proc => validations_proc
169
- ).delete_links
170
- @response = Flapjack::Diner::Response.new(resp)
171
- @response.process
172
- @response.output
173
- end
174
- end
175
- end
176
- end
177
- end
178
- end
179
- end
180
- end
@@ -1,280 +0,0 @@
1
- require 'set'
2
- require 'uri'
3
-
4
- require 'flapjack-diner/query'
5
-
6
- module Flapjack
7
- module Diner
8
- class Request
9
-
10
- def initialize(type, path, opts = {})
11
- @type = type
12
- @path = path
13
- @ids = opts.key?(:ids) ? opts[:ids] :
14
- (opts[:data].nil? ? nil : Flapjack::Diner::Query.unwrap_uuids(*opts[:data]))
15
- @data = opts[:data].nil? ? nil : Flapjack::Diner::Query.unwrap_data(*opts[:data])
16
- @assoc = opts[:assoc]
17
-
18
- unless @data.nil?
19
- validations = opts[:validations]
20
- unless validations.nil?
21
- Flapjack::Diner::Query.validate_params(@data) do
22
- validations.each_pair { |k,v| validate :query => k, :as => v }
23
- end
24
- end
25
- end
26
-
27
- validations_proc = opts[:validations_proc]
28
- validations_proc.call unless validations_proc.nil?
29
- end
30
-
31
- def post
32
- req_data = nil
33
- jsonapi_ext = ""
34
-
35
- case @data
36
- when Array
37
- req_data = @data.collect {|d| record_data(d, :post) }
38
- jsonapi_ext = "; ext=bulk"
39
- when Hash
40
- req_data = record_data(@data, :post)
41
- end
42
- req_uri = build_uri
43
-
44
- # TODO send current character encoding in content-type ?
45
- Flapjack::Diner.post(req_uri.request_uri,
46
- :body => Flapjack::Diner::Query.prepare_nested(:data => req_data).to_json,
47
- :headers => {'Content-Type' => "application/vnd.api+json#{jsonapi_ext}"})
48
- end
49
-
50
- def post_links
51
- @data = @ids.collect {|id| {:type => @type, :id => id}}
52
- @ids = nil
53
- req_uri = build_uri
54
- Flapjack::Diner.post(req_uri.request_uri,
55
- :body => Flapjack::Diner::Query.prepare_nested(:data => @data).to_json,
56
- :headers => {'Content-Type' => 'application/vnd.api+json'})
57
- end
58
-
59
- def get
60
- @data = @data.reduce({}, &:merge) if @data.is_a?(Array)
61
- if !@ids.nil? && (@ids.size > 1)
62
- if @data[:filter].nil?
63
- @data[:filter] = {:id => @ids}
64
- elsif !data[:filter].key?(:id)
65
- @data[:filter][:id] = @ids
66
- else
67
- @data[:filter][:id] |= @ids
68
- end
69
- end
70
-
71
- filt = @data.delete(:filter)
72
- unless filt.nil?
73
- @data[:filter] = filt.each_with_object([]) do |(k, v), memo|
74
- value = case v
75
- when Array, Set
76
- v.to_a.join("|")
77
- else
78
- v.to_s
79
- end
80
- memo << (@assoc.nil? ? "#{k}:#{value}" : "#{@assoc}.#{k}:#{value}")
81
- end
82
- end
83
-
84
- incl = @data[:include]
85
- unless incl.nil?
86
- case incl
87
- when Array
88
- raise ArgumentError.new("Include parameters must not contain commas") if incl.any? {|i| i =~ /,/}
89
- @data[:include] = if @assoc.nil?
90
- incl.join(",")
91
- else
92
- incl.map {|i|
93
- if i.eql?(@assoc.to_s) || (i =~ /^#{@assoc}\./)
94
- i
95
- else
96
- "#{@assoc}.#{i}"
97
- end
98
- }.join(",")
99
- end
100
- when String
101
- raise ArgumentError.new("Include parameters must not contain commas") if incl =~ /,/
102
- unless @assoc.nil? || (incl.eql?(@assoc.to_s)) || (incl =~ /^#{@assoc}\./)
103
- @data[:include] = "#{@assoc}.#{incl}"
104
- end
105
- end
106
- end
107
-
108
- req_uri = build_uri(@data)
109
- Flapjack::Diner.get(req_uri.request_uri)
110
- end
111
-
112
- def patch
113
- req_uri = nil
114
- req_data = nil
115
-
116
- jsonapi_ext = ""
117
- case @data
118
- when Hash
119
- raise "Update data does not contain :id" unless @data[:id]
120
- req_data = record_data(@data, :patch)
121
- @ids = [@data[:id]]
122
- req_uri = build_uri
123
- when Array
124
- ids = []
125
- req_data = []
126
- @data.each do |d|
127
- d_id = d.key?(:id) ? d[:id] : nil
128
- @ids << d_id unless d_id.nil? || d_id.empty?
129
- req_data << record_data(d, :patch)
130
- end
131
- raise "Update data must each contain :id" unless @ids.size == @data.size
132
- req_uri = build_uri
133
- jsonapi_ext = "; ext=bulk"
134
- end
135
-
136
- opts = if req_data.nil?
137
- {}
138
- else
139
- {:body => Flapjack::Diner::Query.prepare_nested(:data => req_data).to_json,
140
- :headers => {'Content-Type' => "application/vnd.api+json#{jsonapi_ext}"}}
141
- end
142
- Flapjack::Diner.patch(req_uri.request_uri, opts)
143
- end
144
-
145
- def patch_links
146
- # data = if opts[:single]
147
- # raise "Must provide one ID for a singular link" unless @ids.size == 1
148
- # [nil].eql?(@ids) ? nil : {:type => @type, :id => @ids.first}
149
- # else
150
- data = [[]].eql?(@ids) ? [] : @ids.collect {|id| {:type => @type, :id => id}}
151
- # end
152
- @ids = nil
153
-
154
- req_uri = build_uri
155
-
156
- opts = {:body => Flapjack::Diner::Query.prepare_nested(:data => data).to_json,
157
- :headers => {'Content-Type' => 'application/vnd.api+json'}}
158
- Flapjack::Diner.patch(req_uri.request_uri, opts)
159
- end
160
-
161
- def delete
162
- type = Flapjack::Diner::Configuration::RESOURCES[@type][:resource]
163
-
164
- req_uri = build_uri
165
- opts = if @ids.size == 1
166
- {}
167
- else
168
- data = @ids.collect {|id| {:type => type, :id => id} }
169
- {:body => Flapjack::Diner::Query.prepare_nested(:data => data).to_json,
170
- :headers => {'Content-Type' => 'application/vnd.api+json; ext=bulk'}}
171
- end
172
- Flapjack::Diner.delete(req_uri.request_uri, opts)
173
- end
174
-
175
- def delete_links
176
- data = @ids.collect {|id| {:type => @type, :id => id}}
177
- @ids = nil
178
- req_uri = build_uri
179
- opts = {:body => Flapjack::Diner::Query.prepare_nested(:data => data).to_json,
180
- :headers => {'Content-Type' => 'application/vnd.api+json'}}
181
- Flapjack::Diner.delete(req_uri.request_uri, opts)
182
- end
183
-
184
- private
185
-
186
- def record_data(source, method)
187
- res = Flapjack::Diner::Configuration::RESOURCES[@type]
188
- r_type = res[:resource]
189
-
190
- req_data = {}
191
- ['id', :id].each do |i|
192
- req_data[:id] = source[i] if source.key?(i)
193
- end
194
- req_data[:type] = r_type
195
-
196
- assocs = res[:relationships] || {}
197
-
198
- rel_singular = assocs.inject([]) do |memo, (assoc_name, assoc)|
199
- if assoc[method].is_a?(TrueClass) && :singular.eql?(assoc[:number])
200
- memo << assoc_name
201
- end
202
- memo
203
- end
204
-
205
- rel_multiple = assocs.inject([]) do |memo, (assoc_name, assoc)|
206
- if assoc[method].is_a?(TrueClass) && :multiple.eql?(assoc[:number])
207
- memo << assoc_name
208
- end
209
- memo
210
- end
211
-
212
- excluded = [:id, :type] + rel_singular + rel_multiple
213
- attrs = source.reject do |k, _|
214
- excluded.include?(k.to_sym)
215
- end
216
-
217
- req_data[:attributes] = attrs unless attrs.empty?
218
-
219
- rel_data = {}
220
-
221
- rel_singular.each do |singular_link|
222
- converted = false
223
- [singular_link, singular_link.to_s].each do |sl|
224
- next if converted || !source.key?(sl)
225
- rel_data[singular_link] = {
226
- :data => {
227
- :type => singular_link.to_s,
228
- :id => source[sl]
229
- }
230
- }
231
- converted = true
232
- end
233
- end
234
-
235
- rel_multiple.each do |multiple_link|
236
- converted = false
237
- ml_type = Flapjack::Diner::Configuration::RESOURCES[multiple_link][:resource]
238
- [multiple_link, multiple_link.to_s].each do |ml|
239
- next if converted || !source.key?(ml)
240
- rel_data[multiple_link] = {
241
- :data => source[ml].map {|id| {:type => ml_type, :id => id} }
242
- }
243
- converted = true
244
- end
245
- end
246
-
247
- req_data[:relationships] = rel_data unless rel_data.empty?
248
-
249
- req_data
250
- end
251
-
252
- def normalise_port(port_str, protocol)
253
- if port_str.nil? || port_str.to_i < 1 || port_str.to_i > 65_535
254
- 'https'.eql?(protocol) ? 443 : 80
255
- else
256
- port_str.to_i
257
- end
258
- end
259
-
260
- def protocol_host_port
261
- %r{^(?:(?<protocol>https?)://)
262
- (?<host>[a-zA-Z0-9][a-zA-Z0-9\.\-]*[a-zA-Z0-9])
263
- (?::(?<port>\d+))?
264
- }ix =~ Flapjack::Diner.base_uri
265
-
266
- protocol = protocol.nil? ? 'http' : protocol.downcase
267
- [protocol, host, normalise_port(port, protocol)]
268
- end
269
-
270
- def build_uri(params = [])
271
- pr, ho, po = protocol_host_port
272
- @path += "/#{URI.escape(@ids.first.to_s)}" if !@ids.nil? && @ids.size == 1
273
- params = params.reduce({}, &:merge) if params.is_a?(Array)
274
- query = params.empty? ? nil : Flapjack::Diner::Query.build_nested(params)
275
- URI::HTTP.build(:protocol => pr, :host => ho, :port => po,
276
- :path => @path, :query => query)
277
- end
278
- end
279
- end
280
- end