ryquest 1.0.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b32ac1fdb4ae871b7e52a0df4179d982cc3a9a8bd8bc6bac8e7ea17b2858a81c
4
- data.tar.gz: 80cf2f367cf8b5f321891be62fe74386f74c53b48af98309442c422e9f7c0b23
3
+ metadata.gz: 2a77be824e336c393322a2ca0612d66a2a422ec2188bc8e9c69843f7679ac845
4
+ data.tar.gz: a2b08ab7d1dd13480fee42dbadeeb0bdecf4fa4879f29f45adeb35cb09581462
5
5
  SHA512:
6
- metadata.gz: '0415958de921a0769182be9f4fa46b13937203818b88b688d8099ad744f2ad5b0da24cd00f9db2349503badb65b33daf7c50aa3f05ebc97ce80e59d872f829ec'
7
- data.tar.gz: b2a4c736dc8c802ed6d482a6ace36dc7cd2f2a01b2c374a9b6d93f94265e4fedd938f926d975a0750bf087a7116d395719c46ff8ea5a441847eb277cf3aae2a8
6
+ metadata.gz: ec077bc542b01e5d8f32761bd07a4b5c14d9dbe93ba8ca2bab9199caecc0e6d651c83aa37fe1d25463ad56afb0e1935c07c876a0925afdc22adbcbb4beed6f2e
7
+ data.tar.gz: ba2cb2a88461ae68c648a6e217e4ca70133687248ed30b68fc1c67478f44d60f48595e8c4dd45146dd034019b73ec02f07ade4972a378bfe1b2cc05d658c8ea2
data/README.md CHANGED
@@ -95,6 +95,9 @@ To use specific headers and params with `response!`, put their value in `let` va
95
95
  end
96
96
  ```
97
97
 
98
+ Params are converted by default to form-urlencoded format.
99
+ `Ryquest.configuration.content_type` can change this behaviour.
100
+
98
101
  ### With route parameters
99
102
 
100
103
  `response!` handle route parameters by looking for a `let` variable with the same parameter name.
@@ -133,3 +136,15 @@ To use specific headers and params with `response!`, put their value in `let` va
133
136
  end
134
137
  end
135
138
  ```
139
+
140
+ ### Configuration
141
+
142
+ Configuration can be change with `Ryquest.configuration` or `Ryquest.configure` method.
143
+
144
+ * `content_type` change how params are converted and sent. Note that it can change CONTENT_TYPE header
145
+ * `:form` (default value) convert to form-urlencoded
146
+ * `:json` convert to JSON, change CONTENT-TYPE to application/json
147
+
148
+ ### TODO
149
+
150
+ * Permit to pass params and headers into response rather than update params directly
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ryquest
4
+ # Hold / handle writable configuration variables
5
+ # @attr content_type [Symbol] Must be :form or :json.
6
+ # Define in which format response! send data. Accepted value:
7
+ # * :form (default) - x-www-form-urlencoded
8
+ # * :json - JSON (only affect post, put, patch))
9
+ # Note that the value will affect CONTENT-TYPE header
10
+ class Configuration
11
+ attr_reader :content_type
12
+
13
+ def content_type= value
14
+ raise ArgumentError, 'content_type configuration value must be form or json' if %i[form json].exclude? value
15
+
16
+ @content_type = value
17
+ end
18
+
19
+ # Define default configuration value
20
+ def initialize
21
+ @content_type = :form
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,79 @@
1
+ # Context to include to get request DSL improvment
2
+ RSpec.shared_context 'ryquest helper' do # rubocop:disable Metrics/BlockLength
3
+ let(:headers) { nil }
4
+ let(:params) { nil }
5
+
6
+ # Execute request described in example description and return #response value.
7
+ # Example description must be formated as: "VERB /path".
8
+ #
9
+ # Request will not be launch if it not exist or response already have a value.
10
+ #
11
+ # VERB can be: GET, POST, PUT, PATCH, DELETE
12
+ #
13
+ # To add specific body or headers define them with `let(:headers/:params) { { key: :value } }
14
+ #
15
+ # Params path can be send as: 'VERB /path/:param',
16
+ # :param will be replaced by `param` value (let, method, ...) or their `id` value.
17
+ #
18
+ # @return [ActionDispatch::TestResponse] the #response value
19
+ def response!
20
+ match = match_verb
21
+ return response if response || match.nil?
22
+
23
+ verb = match[1]
24
+ path = match[2]
25
+ content = build_content verb
26
+
27
+ send verb.downcase, build_path(path), params: content[:params], headers: content[:headers]
28
+ response
29
+ end
30
+
31
+ # @return [Hash] the #response!.body parsed from json
32
+ def json!; JSON.parse response!.body end
33
+
34
+ private
35
+ # Convert params and header to the request content (body, params, headers, ...)
36
+ # @return [Hash] with params and headers key
37
+ def build_content verb
38
+ if Ryquest.configuration.content_type == :form || %w[GET DELETE].include?(verb)
39
+ return { params: params, headers: headers }
40
+ end
41
+
42
+ { params: params, headers: headers || {} }.tap do |result|
43
+ result[:params] = result[:params].to_json
44
+ result[:headers] = result[:headers].merge 'CONTENT_TYPE' => 'application/json'
45
+ end
46
+ end
47
+
48
+ # Find request http verb and path in the parents example description.
49
+ # @return [MatchData] verb in [0] path in [1]
50
+ def match_verb
51
+ match = nil
52
+
53
+ self.class.parent_groups.each do |parent|
54
+ match = parent.description.match /^(GET|POST|PATCH|PUT|DELETE) (.+)/
55
+ break if match
56
+ end
57
+
58
+ match
59
+ end
60
+
61
+ # Replace params path with their value.
62
+ # Use param path #id if present.
63
+ # @return [String]
64
+ def build_path path
65
+ return path if path.exclude? ':'
66
+
67
+ path.scan(/:(\w+\b)/).flatten.each do |match|
68
+ value = send match
69
+ value = value.id if value.respond_to? :id
70
+
71
+ path = path.gsub ":#{match}", value.to_s
72
+ end
73
+
74
+ path
75
+ end
76
+ end
77
+
78
+ # Include the context when using the type: :request option
79
+ RSpec.configure { |config| config.include_context 'ryquest helper', type: :request }
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Root module
4
3
  module Ryquest
5
4
  # Ryquest version number: major.minor.maintenance
6
- VERSION = '1.0.0'
5
+ VERSION = '1.1.0'
7
6
  end
data/lib/ryquest.rb CHANGED
@@ -1,68 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Context to include to get request DSL improvment
4
- RSpec.shared_context 'ryquest helper' do # rubocop:disable Metrics/BlockLength
5
- let(:headers) { nil }
6
- let(:params) { nil }
3
+ require 'ryquest/configuration'
4
+ require 'ryquest/context'
7
5
 
8
- # Execute request described in example description and return #response value.
9
- # Example description must be formated as: "VERB /path".
10
- #
11
- # Request will not be launch if it not exist or response already have a value.
12
- #
13
- # VERB can be: GET, POST, PUT, PATCH, DELETE
14
- #
15
- # To add specific body or headers define them with `let(:headers/:params) { { key: :value } }
16
- #
17
- # Params path can be send as: 'VERB /path/:param',
18
- # :param will be replaced by `param` value (let, method, ...) or their `id` value.
19
- #
20
- # @return [ActionDispatch::TestResponse] the #response value
21
- def response!
22
- match = match_verb
23
- return response if response || match.nil?
6
+ # Root module
7
+ module Ryquest
8
+ # @return [Ryquest::Configuration] Global configuration instance (create it if not present)
9
+ def self.configuration; @configuration ||= Configuration.new end
24
10
 
25
- verb = match[1]
26
- path = match[2]
27
-
28
- send verb.downcase, build_path(path), params: params, headers: headers
29
- response
30
- end
31
-
32
- # @return [Hash] the #response!.body parsed from json
33
- def json!; JSON.parse response!.body end
34
-
35
- private
36
-
37
- # Find request http verb and path in the parents example description.
38
- # @return [MatchData] verb in [0] path in [1]
39
- def match_verb
40
- match = nil
41
-
42
- self.class.parent_groups.each do |parent|
43
- match = parent.description.match /^(GET|POST|PATCH|PUT|DELETE) (.+)/
44
- break if match
45
- end
46
-
47
- match
48
- end
49
-
50
- # Replace params path with their value.
51
- # Use param path #id if present.
52
- # @return [String]
53
- def build_path path
54
- return path if path.exclude? ':'
55
-
56
- path.scan(/:(\w+\b)/).flatten.each do |match|
57
- value = send match
58
- value = value.id if value.respond_to? :id
59
-
60
- path = path.gsub ":#{match}", value.to_s
61
- end
62
-
63
- path
64
- end
11
+ # Yields #configuration to a block
12
+ # @yield [Ryquest::Configuration]
13
+ def self.configure; yield configuration end
65
14
  end
66
15
 
67
- # Include the context when using the type: :request option
68
- RSpec.configure { |config| config.include_context 'ryquest helper', type: :request }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ryquest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Guego
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-03 00:00:00.000000000 Z
11
+ date: 2022-01-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -27,6 +27,8 @@ files:
27
27
  - Makefile
28
28
  - README.md
29
29
  - lib/ryquest.rb
30
+ - lib/ryquest/configuration.rb
31
+ - lib/ryquest/context.rb
30
32
  - lib/ryquest/version.rb
31
33
  - ryquest.gemspec
32
34
  homepage: https://github.com/faljie/ryquest