Class: Praxis::MultipartPart
- Inherits:
-
Object
- Object
- Praxis::MultipartPart
- Includes:
- Attributor::Type
- Defined in:
- lib/praxis/multipart/part.rb
Instance Attribute Summary collapse
-
#body ⇒ Object
(also: #payload)
Returns the value of attribute body.
-
#default_handler ⇒ Object
Returns the value of attribute default_handler.
-
#filename ⇒ Object
Returns the value of attribute filename.
-
#filename_attribute ⇒ Object
Returns the value of attribute filename_attribute.
-
#headers ⇒ Object
Returns the value of attribute headers.
-
#headers_attribute ⇒ Object
Returns the value of attribute headers_attribute.
-
#name ⇒ Object
Returns the value of attribute name.
-
#payload_attribute ⇒ Object
Returns the value of attribute payload_attribute.
Class Method Summary collapse
- .check_option!(name, definition) ⇒ Object
- .describe(shallow = true, example: nil, options: {}) ⇒ Object
- .example(context = nil, options: {}) ⇒ Object
- .native_type ⇒ Object
Instance Method Summary collapse
- #attribute=(attribute) ⇒ Object
-
#content_type ⇒ MediaTypeIdentifier
Determine the content type of this response.
-
#content_type=(identifier) ⇒ String
Set the content type for this response.
-
#derive_content_type(handler_name) ⇒ Object
Determine an appropriate default content_type for this part given the preferred handler_name, if possible.
- #dump(default_format: nil, **opts) ⇒ Object
- #encode! ⇒ Object
- #handler ⇒ Object
-
#initialize(body, headers = {}, name: nil, filename: nil, payload_attribute: nil, headers_attribute: nil, filename_attribute: nil) ⇒ MultipartPart
constructor
A new instance of MultipartPart.
- #load_headers(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
- #load_payload(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
- #reset_content_disposition ⇒ Object
- #status ⇒ Object
- #validate(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
- #validate_filename(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
- #validate_headers(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
- #validate_payload(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
Constructor Details
#initialize(body, headers = {}, name: nil, filename: nil, payload_attribute: nil, headers_attribute: nil, filename_attribute: nil) ⇒ MultipartPart
Returns a new instance of MultipartPart.
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/praxis/multipart/part.rb', line 76 def initialize(body, headers={}, name: nil, filename: nil, payload_attribute: nil, headers_attribute: nil, filename_attribute: nil) @name = name @body = body @headers = headers @default_handler = Praxis::Application.instance.handlers['json'] if content_type.nil? self.content_type = 'text/plain' end @filename = filename @payload_attribute = payload_attribute @headers_attribute = headers_attribute @filename_attribute = filename_attribute reset_content_disposition end |
Instance Attribute Details
#body ⇒ Object Also known as: payload
Returns the value of attribute body.
5 6 7 |
# File 'lib/praxis/multipart/part.rb', line 5 def body @body end |
#default_handler ⇒ Object
Returns the value of attribute default_handler.
12 13 14 |
# File 'lib/praxis/multipart/part.rb', line 12 def default_handler @default_handler end |
#filename ⇒ Object
Returns the value of attribute filename.
7 8 9 |
# File 'lib/praxis/multipart/part.rb', line 7 def filename @filename end |
#filename_attribute ⇒ Object
Returns the value of attribute filename_attribute.
11 12 13 |
# File 'lib/praxis/multipart/part.rb', line 11 def filename_attribute @filename_attribute end |
#headers ⇒ Object
Returns the value of attribute headers.
6 7 8 |
# File 'lib/praxis/multipart/part.rb', line 6 def headers @headers end |
#headers_attribute ⇒ Object
Returns the value of attribute headers_attribute.
10 11 12 |
# File 'lib/praxis/multipart/part.rb', line 10 def headers_attribute @headers_attribute end |
#name ⇒ Object
Returns the value of attribute name.
8 9 10 |
# File 'lib/praxis/multipart/part.rb', line 8 def name @name end |
#payload_attribute ⇒ Object
Returns the value of attribute payload_attribute.
9 10 11 |
# File 'lib/praxis/multipart/part.rb', line 9 def payload_attribute @payload_attribute end |
Class Method Details
.check_option!(name, definition) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/praxis/multipart/part.rb', line 14 def self.check_option!(name, definition) case name when :payload_attribute, :headers_attribute, :filename_attribute unless definition.nil? || definition.kind_of?(Attributor::Attribute) raise Attributor::AttributorException.new("Value for option #{name.inspect} must be an Attribute. Got #{definition.class.name}") end else return :unknown end :ok end |
.describe(shallow = true, example: nil, options: {}) ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/praxis/multipart/part.rb', line 57 def self.describe(shallow=true, example: nil, options:{}) hash = super(shallow, example: example) if (payload_attribute = [:payload_attribute]) payload_example = example.payload if example hash[:payload] = payload_attribute.describe(shallow, example: payload_example) end if (headers_attribute = [:headers_attribute]) headers_example = example.headers if example hash[:headers] = headers_attribute.describe(shallow, example: headers_example) end if (filename_attribute = [:filename_attribute]) filename_example = example.filename if example hash[:filename] = filename_attribute.describe(shallow, example: filename_example) end hash end |
.example(context = nil, options: {}) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/praxis/multipart/part.rb', line 31 def self.example(context=nil, options:{}) if (payload_attribute = [:payload_attribute]) payload = payload_attribute.example(context + ['payload']) end headers = if (headers_attribute = [:headers_attribute]) headers_attribute.example(context + ['headers']) else {} end name = [:name] filename = if (filename_attribute = [:filename_attribute]) filename_attribute.example(context + ['filename']) else nil end self.new(payload, headers, name: name, filename: filename, payload_attribute: payload_attribute, headers_attribute: headers_attribute, filename_attribute: filename_attribute) end |
.native_type ⇒ Object
27 28 29 |
# File 'lib/praxis/multipart/part.rb', line 27 def self.native_type self end |
Instance Method Details
#attribute=(attribute) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/praxis/multipart/part.rb', line 98 def attribute=(attribute) unless self.kind_of?(attribute.type) raise ArgumentError, "invalid attribute type #{attribute.type}" end if attribute..key? :payload_attribute @payload_attribute = attribute.[:payload_attribute] end if attribute..key? :headers_attribute @headers_attribute = attribute.[:headers_attribute] end if attribute..key? :filename_attribute @filename_attribute = attribute.[:filename_attribute] end end |
#content_type ⇒ MediaTypeIdentifier
Determine the content type of this response.
138 139 140 |
# File 'lib/praxis/multipart/part.rb', line 138 def content_type @content_type ||= MediaTypeIdentifier.load(headers['Content-Type']).freeze end |
#content_type=(identifier) ⇒ String
DRY this out (also used in Response)
Set the content type for this response.
147 148 149 150 |
# File 'lib/praxis/multipart/part.rb', line 147 def content_type=(identifier) @content_type = nil headers['Content-Type'] = MediaTypeIdentifier.load(identifier).to_s end |
#derive_content_type(handler_name) ⇒ Object
Determine an appropriate default content_type for this part given the preferred handler_name, if possible.
Considers any pre-defined set of values on the content_type attributge of the headers.
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
# File 'lib/praxis/multipart/part.rb', line 224 def derive_content_type(handler_name) possible_values = if self.content_type.match 'text/plain' _, content_type_attribute = self.headers_attribute && self.headers_attribute.attributes.find { |k,v| k.to_s =~ /^content[-_]{1}type$/i } if content_type_attribute && content_type_attribute..key?(:values) content_type_attribute.[:values] else [] end else [self.content_type] end # generic default encoding is the best we can do if possible_values.empty? return MediaTypeIdentifier.load("application/#{handler_name}") end # if any defined value match the preferred handler_name, return it possible_values.each do |ct| mti = MediaTypeIdentifier.load(ct) return mti if mti.handler_name == handler_name end # otherwise, pick the first pick = MediaTypeIdentifier.load(possible_values.first) # and return that one if it already corresponds to a registered handler # otherwise, add the encoding if Praxis::Application.instance.handlers.include?(pick.handler_name) return pick else return pick + handler_name end end |
#dump(default_format: nil, **opts) ⇒ Object
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
# File 'lib/praxis/multipart/part.rb', line 260 def dump(default_format: nil, **opts) original_content_type = self.content_type body = self.payload_attribute.dump(self.payload, **opts) body_string = case body when Hash, Array if default_format self.content_type = derive_content_type(default_format) end self.handler.generate(body) else body end header_string = self.headers.collect do |name, value| "#{name}: #{value}" end.join("\r\n") "#{header_string}\r\n\r\n#{body_string}" ensure self.content_type = original_content_type end |
#encode! ⇒ Object
156 157 158 159 160 161 162 163 164 |
# File 'lib/praxis/multipart/part.rb', line 156 def encode! case @body when Hash, Array # response payload is structured data; transform it into an entity using the handler # implied by the response's media type. If no handler is registered for this # name, assume JSON as a default handler. @body = JSON.pretty_generate(@body) end end |
#handler ⇒ Object
214 215 216 217 |
# File 'lib/praxis/multipart/part.rb', line 214 def handler handlers = Praxis::Application.instance.handlers (content_type && handlers[content_type.handler_name]) || @default_handler end |
#load_headers(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
129 130 131 132 133 |
# File 'lib/praxis/multipart/part.rb', line 129 def load_headers(context=Attributor::DEFAULT_ROOT_CONTEXT) if self.headers_attribute self.headers = self.headers_attribute.load(self.headers) end end |
#load_payload(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/praxis/multipart/part.rb', line 117 def load_payload(context=Attributor::DEFAULT_ROOT_CONTEXT) if self.payload_attribute value = if self.payload.kind_of?(String) handler.parse(self.payload) else self.payload end self.payload = self.payload_attribute.load(value) end end |
#reset_content_disposition ⇒ Object
190 191 192 193 194 195 196 197 198 199 |
# File 'lib/praxis/multipart/part.rb', line 190 def reset_content_disposition self.headers['Content-Disposition'] = begin disposition = "form-data; name=#{name}" if filename disposition += "; filename=#{filename}" end disposition end end |
#status ⇒ Object
152 153 154 |
# File 'lib/praxis/multipart/part.rb', line 152 def status @headers['Status'].to_i end |
#validate(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
184 185 186 187 188 |
# File 'lib/praxis/multipart/part.rb', line 184 def validate(context=Attributor::DEFAULT_ROOT_CONTEXT) errors = validate_headers(context) errors.push *validate_payload(context) errors.push *validate_filename(context) end |
#validate_filename(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
178 179 180 181 182 |
# File 'lib/praxis/multipart/part.rb', line 178 def validate_filename(context=Attributor::DEFAULT_ROOT_CONTEXT) return [] unless self.filename_attribute self.filename_attribute.validate(filename, context + ['filename']) end |
#validate_headers(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
166 167 168 169 170 |
# File 'lib/praxis/multipart/part.rb', line 166 def validate_headers(context=Attributor::DEFAULT_ROOT_CONTEXT) return [] unless self.headers_attribute self.headers_attribute.validate(headers, context + ['headers']) end |
#validate_payload(context = Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object
172 173 174 175 176 |
# File 'lib/praxis/multipart/part.rb', line 172 def validate_payload(context=Attributor::DEFAULT_ROOT_CONTEXT) return [] unless self.payload_attribute self.payload_attribute.validate(payload, context + ['payload']) end |