praxis 0.14.0 → 0.15.0

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -1
  3. data/Gemfile +5 -0
  4. data/bin/praxis +7 -4
  5. data/lib/api_browser/package.json +1 -1
  6. data/lib/praxis/action_definition.rb +10 -5
  7. data/lib/praxis/application.rb +30 -0
  8. data/lib/praxis/bootloader_stages/subgroup_loader.rb +2 -2
  9. data/lib/praxis/bootloader_stages/warn_unloaded_files.rb +7 -2
  10. data/lib/praxis/file_group.rb +1 -1
  11. data/lib/praxis/handlers/json.rb +32 -0
  12. data/lib/praxis/handlers/www_form.rb +20 -0
  13. data/lib/praxis/handlers/xml.rb +78 -0
  14. data/lib/praxis/links.rb +4 -1
  15. data/lib/praxis/media_type.rb +55 -0
  16. data/lib/praxis/media_type_identifier.rb +198 -0
  17. data/lib/praxis/multipart/part.rb +16 -0
  18. data/lib/praxis/request.rb +34 -25
  19. data/lib/praxis/response.rb +22 -3
  20. data/lib/praxis/response_definition.rb +11 -36
  21. data/lib/praxis/restful_doc_generator.rb +1 -1
  22. data/lib/praxis/simple_media_type.rb +6 -1
  23. data/lib/praxis/types/media_type_common.rb +8 -3
  24. data/lib/praxis/types/multipart.rb +6 -6
  25. data/lib/praxis/version.rb +1 -1
  26. data/lib/praxis.rb +7 -1
  27. data/praxis.gemspec +1 -1
  28. data/spec/functional_spec.rb +3 -1
  29. data/spec/praxis/application_spec.rb +58 -1
  30. data/spec/praxis/handlers/json_spec.rb +37 -0
  31. data/spec/praxis/handlers/xml_spec.rb +155 -0
  32. data/spec/praxis/media_type_identifier_spec.rb +209 -0
  33. data/spec/praxis/media_type_spec.rb +50 -3
  34. data/spec/praxis/plugins/praxis_mapper_plugin_spec.rb +2 -2
  35. data/spec/praxis/request_spec.rb +39 -1
  36. data/spec/praxis/response_definition_spec.rb +12 -9
  37. data/spec/praxis/response_spec.rb +37 -6
  38. data/spec/praxis/types/collection_spec.rb +2 -2
  39. data/spec/praxis/types/multipart_spec.rb +17 -0
  40. data/spec/spec_app/app/controllers/instances.rb +1 -1
  41. data/spec/support/spec_media_types.rb +19 -0
  42. metadata +11 -6
  43. data/lib/praxis/content_type_parser.rb +0 -62
  44. data/spec/praxis/content_type_parser_spec.rb +0 -91
@@ -1,62 +0,0 @@
1
- module Praxis
2
- module ContentTypeParser
3
- REGEXP = /^
4
- \s*
5
- (?<type>[^+;\s]+)
6
- (\+(?<sub_type>[^;\s]+))?
7
- (\s*;\s*)?
8
- (?<params>.*?)?
9
- (\s*;\s*)?
10
- $/x
11
-
12
- # Parses Content type
13
- #
14
- # @param [String] Content type to parse
15
- # @return [Hash] A hash with keys: :type, :sub_type(optional) and :params(optional)
16
- # @raise [ArgumentError] It fails when blank or weird content type is provided
17
- #
18
- # @example
19
- # parse(nil) #=> Exception: Content type does not have any type defined (ArgumentError)
20
- # parse('+json') #=> Exception: Content type does not have any type defined (ArgumentError)
21
- # parse(';p1=11') #=> Exception: Content type does not have any type defined (ArgumentError)
22
- #
23
- # @example
24
- # parse('text/xml') #=>
25
- # {:type => "text/xml",
26
- # :sub_type => nil,
27
- # :params => {}}
28
- #
29
- # @example
30
- # parse('application/vnd.something+json') #=>
31
- # {:type => "application/vnd.something",
32
- # :sub_type => "json",
33
- # :params => {}}
34
- #
35
- # @example
36
- # parse('application/vnd.something+json;p1=1.0;param_with_noval;p2=a13') #=>
37
- # {:type => "application/vnd.something",
38
- # :sub_type => "json",
39
- # :params => {"p1"=>"1.0", "param_with_noval"=>nil, "p2"=>"a13"}}
40
- #
41
- def self.parse(content_type)
42
- parsed = REGEXP.match(content_type.to_s)
43
- raise(ArgumentError, 'Content type does not have any type defined') unless parsed
44
-
45
- result = {
46
- type: parsed[:type]
47
- }
48
- result[:sub_type] = parsed[:sub_type] if parsed[:sub_type]
49
- if parsed[:params]
50
- params = {}
51
- parsed[:params].split(';').each do |param|
52
- key, value = param.split('=')
53
- key = key.to_s.strip
54
- next if key.empty?
55
- params[key.strip] = value && value.strip
56
- end
57
- result[:params] = params unless params.empty?
58
- end
59
- result
60
- end
61
- end
62
- end
@@ -1,91 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Praxis::ContentTypeParser do
4
-
5
- describe '.parse' do
6
- context 'when content type is blank' do
7
- it 'complains' do
8
- expect{ subject.parse(nil) }.to raise_error(ArgumentError)
9
- expect{ subject.parse('') }.to raise_error(ArgumentError)
10
- expect{ subject.parse(' ') }.to raise_error(ArgumentError)
11
- end
12
- end
13
-
14
- context 'when content type is weird' do
15
- it 'complains' do
16
- expect{ subject.parse('+json') }.to raise_error(ArgumentError)
17
- expect{ subject.parse(';p1=2') }.to raise_error(ArgumentError)
18
- end
19
- end
20
-
21
- context 'when content type has only type' do
22
- it 'returns the type only' do
23
- content_type = 'application/json'
24
- expectation = {
25
- type: 'application/json'
26
- }
27
- expect(subject.parse(content_type)).to eq(expectation)
28
- end
29
- end
30
-
31
- context 'when content type has type and subtype' do
32
- it 'returns both the type and the sub_type' do
33
- content_type = 'application/vnd.something+json'
34
- expectation = {
35
- type: 'application/vnd.something',
36
- sub_type: 'json'
37
- }
38
- expect(subject.parse(content_type)).to eq(expectation)
39
- end
40
- end
41
-
42
- context 'when content type has type and params' do
43
- it 'returns both the type and the params' do
44
- content_type = 'application/json;p1=2;no_value;foo=bar'
45
- expectation = {
46
- type: 'application/json',
47
- params: {"p1"=>"2", "no_value"=>nil, "foo"=>"bar"}
48
- }
49
- expect(subject.parse(content_type)).to eq(expectation)
50
- end
51
- end
52
-
53
- context 'when content type has type, sub_type and params' do
54
- it 'returns them all' do
55
- content_type = 'application/vnd.something+json;p1=2;no_value;foo=bar'
56
- expectation = {
57
- type: 'application/vnd.something',
58
- sub_type: 'json',
59
- params: {"p1"=>"2", "no_value"=>nil, "foo"=>"bar"}
60
- }
61
- expect(subject.parse(content_type)).to eq(expectation)
62
- end
63
- end
64
-
65
-
66
- context 'when there are spaces all around it should ignore them' do
67
- it 'returns them all' do
68
- content_type = ' application/vnd.something+json ; p1=2 ;no_value ; foo=bar ; '
69
- expectation = {
70
- type: 'application/vnd.something',
71
- sub_type: 'json',
72
- params: {"p1"=>"2", "no_value"=>nil, "foo"=>"bar"}
73
- }
74
- expect(subject.parse(content_type)).to eq(expectation)
75
- end
76
- end
77
-
78
-
79
- context 'when there are multiple ;;;;;;' do
80
- it 'ignores them' do
81
- content_type = 'application/vnd.something+json;;;; ; ;;;; ;;'
82
- expectation = {
83
- type: 'application/vnd.something',
84
- sub_type: 'json'
85
- }
86
- expect(subject.parse(content_type)).to eq(expectation)
87
- end
88
- end
89
-
90
- end
91
- end