import_postman 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 25eac0e93409e3b9416aeed345a08766a975e5973b63cae485e74abbb9789863
4
+ data.tar.gz: f2c232428dd79b968abaa8b313f24ab534203b331077ad5b7a641873be36ad8e
5
+ SHA512:
6
+ metadata.gz: 596871c561d69c0f9bcb14d74dcf6fbe92a3e589335395619a188b3e3a8102a02983d474483d04cafce189fc6bbb6b1f117d00559f1c5896bf0a3578dc59e68d
7
+ data.tar.gz: af43a59b80d66a63ad93343dd1f31d231a328be49e60314bdab9bc1c2622a7ca33e1f40ae53fd2810b27e1535a4685454a6b48184819411082b12717474afe72
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Mario Ruiz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # ImportPostman
2
+ ## Description
3
+ Using import_postman method you will be able to import a postman collection and create a Ruby Requests Hash containing the path, headers, data...
4
+
5
+ You can also generate the Ruby tests from the tests you have declared on your collection by using the ImportPostman::Parsers module
6
+
7
+ Feel free to add more parsers or improve existing ones
8
+
9
+ ## Input parameters
10
+
11
+ The import_postman method has these arguments:
12
+
13
+ postman_collection_file_path: (positional) (String)
14
+ Specify just the name of the collection without the extension and in case we have on the same folder the environment and/or the global variable files they will be imported automatically also.
15
+ It is necessary in that case to use the default extensions from Postman: .postman_collection, .postman_environment, .postman_globals.
16
+ The postman collection need to be exported as v1
17
+
18
+ env_file: (optional) (keyword) (String)
19
+ Path to the environment postman file
20
+
21
+ global_file: (optional) (keyword) (String)
22
+ Path to the global postman file
23
+
24
+ output_file: (optional) (keyword) (String)
25
+ Path to output file
26
+
27
+ mock_vars: (optional) (keyword) (Hash)
28
+ Hash including all postman variables we want to mock for example: {"requestId": "return_requestId_method"}
29
+
30
+
31
+ ## Output
32
+ In case output_file is supplied the file will be exported to that location and name. In case not .rb extension it will be added.
33
+
34
+ In case a output_file is not supplied then automatically will create one with the same name as postman_collection_file_path and .rb extension on the same path
35
+
36
+ The postman environments variables will be added as global variables at the beginning of the resultant file
37
+
38
+ The postman global variables will be added as global variables at the beginning of the resultant file
39
+
40
+ All other postman variables will be added as parameters on the request methods created
41
+
42
+ The file when converted will be possible to be used in your code, for example:
43
+
44
+ ```ruby
45
+ request=RESTRequests::Customer.addAlias()
46
+ ```
47
+
48
+ The Postman Dynamic Variables will be converted into Ruby variables. Added $guid, $timestamp and $randomint
49
+
50
+ ## Examples of Use
51
+
52
+ ### Case #1
53
+
54
+ Only one parameter, the collection name with relative path and no extension supplied.
55
+
56
+ The file on the folder would be: MyCustomer.json.postman_collection
57
+
58
+ In case a MyCustomer.json.postman_environment and/or MyCustomer.json.postman_globals found on the same folder, they will be automatically imported also
59
+
60
+ ```ruby
61
+ import_postman "./interfaces/rest/postman/MyCustomer.json"
62
+ ```
63
+
64
+ ### Case #2
65
+
66
+ Relative paths, collection, environmental variables and global variables, with different extensions that the default ones
67
+
68
+ ```ruby
69
+ import_postman "./interfaces/rest/postman/collection.json.txt",
70
+ env_file: "./interfaces/rest/postman/env.json.txt",
71
+ global_file: "./interfaces/rest/postman/global.json.txt"
72
+ ```
73
+
74
+ ### Case #3
75
+
76
+ Full path for collection, environmental variables and global variables. relative path for resultant string. Different names and extensions
77
+
78
+ ```ruby
79
+ import_postman "c:/MyPostManFiles/MyCustomer_postman_collection.json",
80
+ env_file: "c:/MyPostManFiles/MyCustomer_env",
81
+ global_file: "c:/MyPostManFiles/MyCustomer_global",
82
+ output_file: "./interfaces/rest/customer_postman.rb"
83
+ ```
84
+
85
+ ### Case #4
86
+ Change the value of an environmental variable and create tests (mini-test) using the rest-client library
87
+
88
+ ```ruby
89
+ require 'string_pattern' #to generate the random value for requestId
90
+
91
+ require 'import_postman/parsers/rest_client' #to generate the tests
92
+ include ImportPostman::Parsers::RestClient
93
+
94
+ require 'import_postman'
95
+ import_postman "./my_collections/MyCustomer.json",
96
+ mock_vars: {"requestId": " '6:/Nx/'.gen"}
97
+ ```
98
+
99
+ ### Case #5
100
+ Change the value of an environmental variable and create tests (test-unit) using the rest-client library
101
+
102
+ ```ruby
103
+ require 'string_pattern' #to generate the random value for requestId
104
+
105
+ IP_TEST_FRAMEWORK='test-unit'
106
+ require 'import_postman/parsers/rest_client' #to generate the tests
107
+ include ImportPostman::Parsers::RestClient
108
+
109
+ require 'import_postman'
110
+ import_postman "./my_collections/MyCustomer.json",
111
+ mock_vars: {"requestId": " '6:/Nx/'.gen"}
112
+ ```
113
+
114
+ The tests file will be generated on the same folder than the output_file with the same name but finish by _tests
115
+
116
+ ## Contributing
117
+
118
+ Bug reports and pull requests are welcome on GitHub at https://github.com/marioruiz/import_postman.
119
+
120
+
121
+ ## License
122
+
123
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
124
+
@@ -0,0 +1,312 @@
1
+
2
+ require 'nice_hash'
3
+
4
+ ##################################################################################
5
+ # This method import a postman collection to be used as RequestHash object
6
+ # Input:
7
+ # postman_collection_file_path: specify just the name of the collection without the extension and in case we have on the same folder the environment and/or the global variable files they will be imported automatically also.
8
+ # It is necessary in that case to use the default extensions from Postman: .postman_collection, .postman_environment, .postman_globals.
9
+ # env_file: (optional) path to the environment postman file
10
+ # global_file: (optional) path to the global postman file
11
+ # output_file: (optional) path to output file
12
+ # mock_vars: (optional) Hash including all postman variables we want to mock for example: {"requestId": "return_requestId_method"}
13
+ # Output:
14
+ # In case output_file is supplied the file will be exported to that location and name. In case not .rb extension it will be added.
15
+ # In case a output_file is not supplied then automatically will create one with the same name as postman_collection_file_path and .rb extension on the same path
16
+ # The postman environments variables will be added as global variables at the beginning of the resultant file
17
+ # The postman global variables will be added as global variables at the beginning of the resultant file
18
+ # All other postman variables will be added as parameters for the request
19
+ # The file when converted will be possible to be used in your code, for example:
20
+ # request=RESTRequests::Customer.addAlias()
21
+ # The Postman Dynamic Variables will be converted into Ruby variables. Added $guid, $timestamp and $randomint
22
+ # examples:
23
+ # only one parameter, the collection name with relative path and no extension supplied.
24
+ # The file on the folder would be: MyCustomer.json.postman_collection
25
+ # In case a MyCustomer.json.postman_environment and/or MyCustomer.json.postman_globals found on the same folder, they will be automatically imported also
26
+ # import_postman "./interfaces/rest/postman/MyCustomer.json"
27
+ # relative paths, collection, environmental variables and global variables, with different extensions that the default ones
28
+ # import_postman "./interfaces/rest/postman/collection.json.txt", env_file: "./interfaces/rest/postman/env.json.txt", global_file: "./interfaces/rest/postman/global.json.txt"
29
+ # full path for collection, environmental variables and global variables. relative path for resultant string. Different names and extensions
30
+ # import_postman "c:/MyPostManFiles/MyCustomer_postman_collection.json", env_file: "c:/MyPostManFiles/MyCustomer_env", global_file: "c:/MyPostManFiles/MyCustomer_global", output_file: "./interfaces/rest/customer_postman.rb"
31
+ ##################################################################################
32
+ def import_postman(postman_collection_file_path, env_file: postman_collection_file_path+".postman_environment", global_file: postman_collection_file_path+".postman_globals", output_file: postman_collection_file_path+".rb", mock_vars: Hash.new())
33
+ #.postman_collection, .postman_environment, .postman_globals
34
+ require 'json'
35
+ postman_env_file_path = env_file
36
+ postman_global_file_path = global_file
37
+ output_file_path = output_file
38
+
39
+ if postman_collection_file_path["./"].nil? then
40
+ file_to_convert=postman_collection_file_path
41
+ else
42
+ file_to_convert=Dir.pwd.to_s() + "/" + postman_collection_file_path.gsub("./", "")
43
+ end
44
+
45
+ unless File.exist?(file_to_convert)
46
+ file_to_convert+=".postman_collection"
47
+ end
48
+
49
+ if output_file_path['.rb'].nil? then
50
+ output_file_path+=".rb"
51
+ end
52
+
53
+ unless output_file_path["./"].nil? then
54
+ output_file_path=Dir.pwd.to_s() + "/" + output_file_path.gsub("./", "")
55
+ end
56
+ env_vars = {}
57
+
58
+ if defined?(parse_postman_test)
59
+ test_output_file_path = output_file_path.gsub(/\.rb$/, "_tests.rb")
60
+ tests = ""
61
+ num_test = 0
62
+ end
63
+
64
+
65
+ unless postman_global_file_path==""
66
+ unless postman_global_file_path["./"].nil? then
67
+ postman_global_file_path=Dir.pwd.to_s() + "/" + postman_global_file_path.gsub("./", "")
68
+ end
69
+ if File.exist?(postman_global_file_path) then
70
+ begin
71
+ file=File.read(postman_global_file_path)
72
+ puts "** Postman Global file imported: #{postman_global_file_path}"
73
+ rescue Exception => stack
74
+ warn "* It seems there was a problem reading the Global file #{postman_global_file_path}"
75
+ warn stack.to_s()
76
+ return false
77
+ end
78
+
79
+ val=JSON.parse(file, {symbolize_names: true})
80
+ if val.keys.include?(:values) then
81
+ val=val[:values]
82
+ end
83
+ val.each {|v|
84
+ env_vars[v[:key]]=v[:value] if v[:key]!="url" and v[:key]!=:url and v[:key]!="host" and v[:key]!=:host
85
+ }
86
+ end
87
+ end
88
+
89
+ unless postman_env_file_path==""
90
+ unless postman_env_file_path["./"].nil? then
91
+ postman_env_file_path=Dir.pwd.to_s() + "/" + postman_env_file_path.gsub("./", "")
92
+ end
93
+ if File.exist?(postman_env_file_path) then
94
+ begin
95
+ file=File.read(postman_env_file_path)
96
+ puts "** Postman Env file imported: #{postman_env_file_path}"
97
+ rescue Exception => stack
98
+ warn "* It seems there was a problem reading the Env file #{postman_env_file_path}"
99
+ warn stack.to_s()
100
+ return false
101
+ end
102
+
103
+ val=JSON.parse(file, {symbolize_names: true})
104
+ val[:values].each {|v|
105
+ env_vars[v[:key]]=v[:value] if v[:key]!="url" and v[:key]!=:url and v[:key]!="host" and v[:key]!=:host
106
+ }
107
+ end
108
+ end
109
+
110
+ begin
111
+ if File.exist?(file_to_convert) then
112
+ file=File.read(file_to_convert)
113
+ puts "** Postman Collection file imported: #{file_to_convert}"
114
+ else
115
+ warn "* It seems the collection file #{file_to_convert} doesn't exist"
116
+ return false
117
+ end
118
+ rescue Exception => stack
119
+ warn "* It seems there was a problem reading the collection file #{file_to_convert}"
120
+ warn stack.to_s()
121
+ return false
122
+ end
123
+
124
+ val=JSON.parse(file, {symbolize_names: true})
125
+
126
+ module_main_name=val[:name].gsub(/^[\d\s\W]+/, "")
127
+ module_main_name=module_main_name.gsub(/\W+/, "_")
128
+ module_main_name=module_main_name[0, 1].upcase + module_main_name[1..-1] #to be sure first character is in capitalize
129
+ if defined?(parse_postman_test_headers)
130
+ tests="require './#{File.basename output_file_path}'\n"
131
+ tests+=parse_postman_test_headers(module_main_name)
132
+ end
133
+
134
+ requests={}
135
+ if val.keys.include?(:folders) and val.keys.include?(:requests) then
136
+ requests_added=[]
137
+ val[:folders].each {|folder|
138
+ folder[:order].each {|reqnum|
139
+ request=val[:requests].select {|f| f[:id]==reqnum}
140
+ if request.size==1 #found one
141
+ module_name=folder[:name].gsub(/^[\d\s\W]+/, "")
142
+ module_name=module_name.gsub(/\W+/, "_")
143
+ module_name=module_name[0, 1].upcase + module_name[1..-1] #to be sure first character is in capitalize
144
+ requests[module_name]=Array.new() unless requests.keys.include?(module_name)
145
+ requests[module_name].push(request[0])
146
+ requests_added.push(reqnum)
147
+ end
148
+ }
149
+ }
150
+ module_main_name="" if requests.keys.size>0 #there are folders
151
+ if val[:requests].size>requests_added.size then #if there are some requests that are not in folders
152
+ requests[""]=Array.new()
153
+ val[:requests].each {|req|
154
+ if !requests_added.include?(req[:id]) then
155
+ requests[""].push(req)
156
+ end
157
+ }
158
+ end
159
+ elsif val.keys.include?(:requests) then
160
+ requests[""]=Array.new()
161
+ val[:requests].each {|req|
162
+ requests[""].push(req)
163
+ }
164
+ end
165
+
166
+
167
+ rest_methods=""
168
+ all_variables_on_path=[]
169
+ all_variables_on_headers=[]
170
+ requests.each {|folder, requests_folder|
171
+ rest_methods+="\n \tmodule #{folder}\n\n" unless folder==""
172
+
173
+ requests_folder.each {|request|
174
+ #url, host or server are the postman variables for the testserver
175
+ path=request[:url].gsub(/\{\{url\}\}/, "").gsub(/\{\{server\}\}/, "").gsub(/\{\{host\}\}/, "").gsub(/https?:\/\//, "").gsub("{{", "\#{").gsub("}}", "}")
176
+ variables_on_path=path.scan(/{(\w+)}/)
177
+ variables_on_path.uniq!
178
+ if request[:rawModeData].to_s()!="" then
179
+ data=request[:rawModeData].gsub("\r", "")
180
+ variables_on_data=Array.new
181
+ begin
182
+ JSON.parse(data.gsub("{{",'"').gsub("}}",'"'))
183
+ data.gsub!(/"([^"]+)"\s*:/, '\1:')
184
+ variables_on_data=data.scan(/{([\w\-]+)}/)
185
+ variables_on_data.uniq!
186
+ if variables_on_data.size>0 and variables_on_data[0].size>0
187
+ variables_on_data[0].each {|v|
188
+ #for the case it is not a string
189
+ data.gsub!(": {{#{v}}}", ": #{v.gsub("-", "_").downcase}")
190
+ #for the case it is a string
191
+ data.gsub!("{{#{v}}}", "{{#{v.gsub("-", "_").downcase}}}")
192
+ v.gsub!("-", "_")
193
+ }
194
+ end
195
+ data.gsub!("{{", "\#{")
196
+ data.gsub!("}}", "}")
197
+ data.gsub!(/:\s*null/, ": nil")
198
+ rescue
199
+ data='"'+request[:rawModeData].gsub("\r", "") + '"'
200
+ end
201
+ else
202
+ data=""
203
+ variables_on_data=[]
204
+ end
205
+ all_variables_on_path+=variables_on_path
206
+ all_variables_on_path.uniq!
207
+ header=request[:headers].gsub(/\{\{url\}\}/, "").gsub(/\{\{server\}\}/, "").gsub(/\{\{host\}\}/, "").gsub(/https?:\/\//, "").gsub('"','\"')
208
+ #remove headers starting by //
209
+ header.gsub!(/^\/\/.+$/,'')
210
+ #remove empty lines
211
+ header.gsub!(/^\s*$\n/,'')
212
+ variables_on_header=header.scan(/{([\w\-]+)}/)
213
+ variables_on_header.uniq!
214
+ if variables_on_header.size>0 and variables_on_header[0].size>0
215
+ variables_on_header[0].each {|v|
216
+ header.gsub!("{{#{v}}}", "{{#{v.gsub("-", "_")}}}")
217
+ v.gsub!("-", "_")
218
+ }
219
+ end
220
+ header.gsub!("{{", '#{$')
221
+ header.gsub!('}}', '}')
222
+ header.gsub!("\n", '", ')
223
+ header.gsub!(/([^:,\s]+):\s+/, '"\1"=>"')
224
+ header.gsub!(/=>([^,"]+)/, '=>"\1"')
225
+ header.gsub!(/,\s*$/, '')
226
+ header+='"' if header.length>0 and header[-1]!='"'
227
+ all_variables_on_headers+=variables_on_header
228
+ all_variables_on_headers.uniq!
229
+ variables_txt=""
230
+ variables_on_path.each {|var|
231
+ variables_txt+="#{var.join}:$#{var.join}, "
232
+ }
233
+ if variables_on_data.size>0 then
234
+ variables_on_data.each {|var|
235
+ if !variables_on_path.include?(var) then
236
+ if env_vars.keys.include?(var.join) then
237
+ variables_txt+="#{var.join.downcase}:$#{var.join.downcase}, "
238
+ else
239
+ variables_txt+="#{var.join.downcase}:'', "
240
+ end
241
+ end
242
+ }
243
+ end
244
+ variables_txt.chop!
245
+ variables_txt.chop!
246
+ method_name=request[:name].gsub(/\W+/, "_")
247
+ method_name.chop! if method_name[-1]=="_"
248
+ method_name=method_name[0, 1].downcase + method_name[1..-1] #to be sure first character is in downcase
249
+ unless request[:description].to_s==""
250
+ request[:description].to_s.lines.each{|desc|
251
+ rest_methods+="\t\t# #{desc}"
252
+ }
253
+ rest_methods+="\n"
254
+ end
255
+ rest_methods+="\t\tdef self.#{method_name}(#{variables_txt})\n\t\t\treturn {\n"
256
+ rest_methods+="\t\t\t\tpath: \"#{path}\",\n"
257
+ rest_methods+="\t\t\t\theaders: {#{header}},\n"
258
+ if data!="" then
259
+ rest_methods+="\t\t\t\tdata: #{data.split("\n").join("\n\t\t\t\t")}"
260
+ end
261
+ rest_methods+="\n\t\t\t}\n\t\tend\n\n"
262
+ if request[:tests]!="" and defined?(parse_postman_test)
263
+ num_test+=1
264
+ #todo: add here preRequestScript or in the parse_postman_test method, decide
265
+ method_to_call= "RESTRequests"
266
+ method_to_call+="::#{module_main_name}" unless module_main_name.to_s()==""
267
+ method_to_call+="::#{folder}" unless folder.to_s()==""
268
+ method_to_call+=".#{method_name}"
269
+ method_to_call="#{request[:method].downcase}(#{method_to_call})"
270
+ rcode = parse_postman_test(request[:tests].to_s, num_test, method_name, method_to_call)
271
+ tests+=rcode
272
+ end
273
+ }
274
+ rest_methods+="\n \tend\n\n" unless folder==''
275
+ }
276
+ rest_methods+=" end" unless module_main_name.to_s()==""
277
+ rest_methods+="\nend"
278
+ header_vars="# Postman variables\n"
279
+ env_vars.each {|key, value|
280
+ header_vars+=" $#{key.gsub("-", "_").downcase}='#{value}'\n"
281
+ }
282
+ header_vars+="\n\nmodule RESTRequests\n"
283
+ header_vars+="\n module #{module_main_name}\n\n" if module_main_name.to_s()!=""
284
+
285
+ rest_methods= header_vars + rest_methods
286
+
287
+ #Postman dynamic variables
288
+ rest_methods.gsub!(/\$randomInt([^a-zA-Z=])/i, 'rand(1001)\1')
289
+ rest_methods.gsub!(/\$timestamp([^a-zA-Z=])/i, 'Time.now.strftime(\'%Y-%m-%dT%H:%M:%S.000Z\')\1')
290
+ rest_methods.gsub!(/\$guid([^a-zA-Z=])/i, 'SecureRandom.uuid\1')
291
+ mock_vars.each {|mvar, mvalue|
292
+ rest_methods.gsub!(/\$#{mvar}([^a-zA-Z=])/i, mvalue+'\1')
293
+ }
294
+ rest_methods.gsub!(/\s+,$/, ",") #to avoid orphan lines with only one comma
295
+ tests+="end" if defined?(parse_postman_test)
296
+ if output_file_path!=""
297
+ File.open(output_file_path, 'w').write(rest_methods)
298
+ puts "** Requests file: #{output_file_path} that contains the code of the requests and the environment variables after importing the Postman file"
299
+ if defined?(parse_postman_test)
300
+ File.open(test_output_file_path, 'w').write(tests)
301
+ puts "** Tests file: #{test_output_file_path} that contains the code of the tests after importing the Postman file"
302
+ end
303
+ end
304
+
305
+ begin
306
+ eval(rest_methods)
307
+ rescue Exception => stack
308
+ warn "* It seems there was a problem importing the postman file #{postman_collection_file_path}"
309
+ warn stack.to_s()
310
+ end
311
+
312
+ end
@@ -0,0 +1,219 @@
1
+
2
+ module ImportPostman
3
+ module Parsers
4
+ module RestClient
5
+ #can be test-unit or minitest
6
+ IP_TEST_FRAMEWORK='minitest' unless defined?(IP_TEST_FRAMEWORK)
7
+
8
+ def parse_postman_test_headers(module_main_name)
9
+ headers="require 'test-unit'\n" if IP_TEST_FRAMEWORK=='test-unit'
10
+ headers="require 'minitest/autorun'\n" if IP_TEST_FRAMEWORK=='minitest'
11
+ headers+="require 'json'\n"
12
+ headers+="require 'nice_hash'\n"
13
+ headers+="require 'rest-client'\n\n"
14
+
15
+ headers+="
16
+ class String
17
+ def json(*keys)
18
+ require 'json'
19
+ return JSON.parse(self, {symbolize_names: true})
20
+ end
21
+ def ==(par)
22
+ if par.kind_of?(Integer) or par.nil? or par.kind_of?(Float) then
23
+ super(par.to_s())
24
+ else
25
+ super(par)
26
+ end
27
+ end
28
+ end\n\n"
29
+ headers+="class Test#{module_main_name} < Test::Unit::TestCase\n\n" if IP_TEST_FRAMEWORK=='test-unit'
30
+ headers+="class Test#{module_main_name} < Minitest::Test\n\n" if IP_TEST_FRAMEWORK=='minitest'
31
+ headers+="i_suck_and_my_tests_are_order_dependent!\n\n" if IP_TEST_FRAMEWORK=='minitest'
32
+ headers+="\tdef setup\n\t\t"
33
+ headers+='@http=RestClient::Resource.new("http://#{$host}")'
34
+ headers+="\n\tend\n"
35
+ return headers
36
+ end
37
+
38
+ def parse_postman_test(js, num_test, test_name, method_to_call)
39
+ rcode_lines=Array.new
40
+ rcode_txt="\tdef test_#{num_test.to_s.rjust(3, "0")}_#{test_name}\n"
41
+ res=method_to_call.scan(/(\w+)\((.+)\)/)
42
+ met=res[0][0]
43
+ req=res[0][1]
44
+ if met=='post' or met=='put'
45
+ method_to_call="#{met} req[:data].to_json, req.headers"
46
+ else
47
+ method_to_call="#{met} req.headers"
48
+ end
49
+
50
+ rcode_txt+="\t\treq=#{req}\n"
51
+ rcode_txt+="\t\tbegin\n"
52
+ rcode_txt+="\t\t\tresponse=@http[req.path].#{method_to_call}\n"
53
+ rcode_txt+="\t\trescue RestClient::ExceptionWithResponse => res\n"
54
+ rcode_txt+="\t\t\tresponse=res.response\n"
55
+ rcode_txt+="\t\tend\n"
56
+
57
+ var_data=""
58
+ blocks=Array.new
59
+ blocks_add=Array.new
60
+ js.split(/$/).each {|line|
61
+
62
+ line_orig=line.dup
63
+ rcode=""
64
+ line.gsub!("===", "==")
65
+ line.gsub!(/;$/, "")
66
+ line.gsub!('\"','"')
67
+ line.gsub!("responseCode.code", "response.code")
68
+ line.gsub!(" : ", ": ")
69
+ #pm.environment.set("coupon_id_dgrd", jsonData.coupons[0].primaryCouponId)
70
+ if line.scan(/pm\.environment\.set\(\"(\w+)\",\s*(.+)\)/).size>0
71
+ rcode=line.gsub!(/pm\.environment\.set\(\"(\w+)\",\s*(.+)\)/, '$\1 = \2')
72
+ end
73
+ line.gsub!(/environment\["(\w+)"\]/, '$\1')
74
+ line.gsub!(/environment\./, '$')
75
+ line.gsub!(/postman.getEnvironmentVariable\(['"](\w+)['"]\)/, '$\1')
76
+ #postman.getResponseHeader('WWW-Authenticate')
77
+ line.gsub!(/postman\.getResponseHeader\(['"]([\w-]+)['"]\)/, 'response.headers["\1"]')
78
+ line.gsub!(/parseInt\(([\w\$\-]+)\)/, '\1.to_i')
79
+ line.gsub!(".indexOf", ".include?")
80
+ line.gsub!(/\.include\?\((\w+)\)==\s*-1\s*/, '.include?(\1)==false')
81
+ line.gsub!(/\.include\?\((\w+)\)\s*==\s*0/, '.include?(\1)==true')
82
+ line.gsub!("responseBody", "response.body")
83
+ line.gsub!(".has(", ".include?(")
84
+ line.gsub!(/(['"\w\s]+) in (\w+)/, '\1.include?(\2)') if line.scan(/for\s*\(/).size==0
85
+
86
+ #typeof jsonData.guaranteedPrizeData[0].gpData== "string"
87
+ if line.scan(/typeof (.+)\s*==\s*"(\w+)"/).size>0
88
+ res=line.scan(/typeof (.+)\s*==\s*"(\w+)"/)
89
+ var=res[0][0]
90
+ type=res[0][1].capitalize
91
+ line.gsub!(/typeof (.+)\s*==\s*"(\w+)"/, "#{var}.kind_of?(#{type})")
92
+ end
93
+
94
+ if blocks[-1]==:if_one_line and line.strip.scan(/\s*{/).size>0 #'if' is a block not a line
95
+ blocks[-1]=:if_block
96
+ end
97
+
98
+ if line.strip=="" or
99
+ (line.strip=="{" and (blocks[-1]==:if_one_line or blocks[-1]==:if_block or blocks[-1]==:for))
100
+ next
101
+ elsif blocks[-1]==:if_one_line and line.scan(/^\s*if\s+/).size==0 #we are in the next line after if
102
+ rcode="#{line.strip}\n\t\tend"
103
+ blocks.pop
104
+ elsif line.scan(/\s*\/\//).size>0
105
+ rcode="# #{line.scan(/\s*\/\/(.+)/).join}"
106
+ elsif blocks[-1]==:comment
107
+ rcode="# #{line.lstrip}"
108
+ if line.scan(/\s*\*\//).size>0
109
+ blocks.pop
110
+ end
111
+ elsif line.scan(/\s*\/\*/).size>0
112
+ rcode="# #{line.scan(/\s*\/\*(.+)/).join}"
113
+ unless line.scan(/\s*\*\//).size>0
114
+ blocks<<:comment
115
+ end
116
+ elsif line.scan(/^\s*try\s*{/).size>0
117
+ blocks<<:try
118
+ rcode="begin"
119
+ elsif line.strip.scan("}").size>0 and blocks[-1]==:try
120
+ blocks.pop
121
+ rcode=""
122
+ elsif line.scan(/^\s*catch\s*\((\w+)\)\s*{/).size>0
123
+ rcode="rescue Exception =>#{line.scan(/^\s*catch\s*\((\w+)\)\s*{/).join}"
124
+ if line.scan(/}\s*$/).size>0 #ends in one line
125
+ rcode+="\n\t\tend\n"
126
+ end
127
+ blocks<<:catch
128
+ elsif line.strip.scan("}").size>0 and blocks[-1]==:try
129
+ blocks.pop
130
+ rcode=""
131
+ elsif line.strip.scan(/else if\s*/).size>0 and rcode_lines.size>0 and rcode_lines[-1].strip=="end"
132
+ rcode_lines.pop
133
+ rcode=line.gsub("else if","elsif").strip.gsub(/\s*\{$/, '')
134
+ blocks<<:if_block
135
+ elsif line.strip.scan(/else\s*\{/).size>0 and rcode_lines.size>0 and rcode_lines[-1].strip=="end"
136
+ rcode_lines.pop
137
+ rcode="else"
138
+ blocks<<:if_block
139
+ elsif line.scan(/^\s*\w+\.push/).size>0
140
+ #arrayOfValuesFromhighestNumber4Comparing.push(highestNumber4Comparing[j][key])
141
+ rcode=line.strip.gsub(/;\s*$/, "")
142
+ elsif line.scan(/^\s*if\s*/).size>0
143
+ #if ( key === numberCount && numberCount4Comparing[k][key] != jsonData.games[i].properties.numberCount)\n"
144
+ if line.scan(/{\s*$/).size==0 #only one like for the if on next line, not a block
145
+ blocks<<:if_one_line
146
+ else
147
+ blocks<<:if_block
148
+ end
149
+ rcode=line.strip.gsub(/\s*\{$/, '')
150
+ elsif line.strip=="}"
151
+ if blocks[-1]==:for
152
+ rcode="#{blocks_add[blocks.size-1]}\t\tend"
153
+ blocks_add[blocks.size-1]=""
154
+ blocks.pop
155
+ else
156
+ rcode="end"
157
+ blocks_add[blocks.size-1]=""
158
+ blocks.pop
159
+ end
160
+ elsif line.scan(/for\s*\(var (\w+)\s+in/).size>0
161
+ #for(var key in highestNumber4Comparing[j])
162
+ var=line.scan(/for\s*\(var (\w+)\s+in\s+([^\)]+)\)/)
163
+ variab=var[0][0]
164
+ compar=var[0][1]
165
+ #for i in 0..jsonData.games.length-1
166
+ rcode="for #{variab} in #{compar}"
167
+ blocks<<:for
168
+ elsif line.scan(/for\s*\(var (\w+\s*=\s*\d+);([^;]+)/).size>0
169
+ #for(var i=0;i<jsonData.games.length;i++){
170
+ var=line.scan(/for\s*\(var (\w+\s*=\s*\d+);([^;]+)/)
171
+ variab=var[0][0]
172
+ compar=var[0][1]
173
+ rcode="#{variab}\n\t\twhile #{compar}\n"
174
+ blocks<<:for
175
+ blocks_add[blocks.size-1]="\t\t#{variab.scan(/(\w+)\s*=/).join}+=1\n"
176
+ elsif line.scan(/\w\s*;\s*\w/).size>0
177
+ #any line with more than one instruction
178
+ rcode="#Line not added: #{line.lstrip}"
179
+ elsif var_data=="" and line.scan(/var\s(\w+)\s*=\s*JSON\.parse\(response.body\)/).size>0
180
+ var_data = line.scan(/var\s(\w+)\s*=\s*JSON\.parse\(response.body\)/).join
181
+ rcode="#{var_data} = response.body.json"
182
+ elsif line.scan(/postman\.setEnvironmentVariable\(/).size>0
183
+ vart=line.scan(/postman\.setEnvironmentVariable\("(\w+)"/).join
184
+ valt=line.scan(/postman\.setEnvironmentVariable\("\w+",\s*(.+)\)$/).join
185
+ rcode="$#{vart} = #{valt}"
186
+ elsif line.scan(/var \w+\s*=/).size>0
187
+ vart=line.scan(/var\s+(\w+)\s*/).join
188
+ valt=line.scan(/var\s+\w+\s*=\s*(.+)$/).join
189
+ valt[-1]="" if valt[-1]=="," #multiple assigment
190
+ rcode="#{vart} = #{valt}"
191
+ elsif line.scan(/^\s*\w+\s*=\s*/).size>0
192
+ vart=line.scan(/^\s*(\w+)\s*/).join
193
+ valt=line.scan(/^\s*\w+\s*=\s*(.+)$/).join
194
+ valt[-1]="" if valt[-1]=="," #multiple assigment
195
+ rcode="#{vart} = #{valt}"
196
+ elsif line.scan(/tests\[/).size>0
197
+ msg=line.scan(/tests\["([^=]*)"\]/).join
198
+ val=line.scan(/tests\["[^=]*"\]\s*=\s*(.+)/).join
199
+ if msg==""
200
+ msg=line.scan(/tests\[(.*)\]\s=\s/).join
201
+ val=line.scan(/tests\[.*\]\s=\s(.+)/).join
202
+ else
203
+ msg="\"#{msg}\""
204
+ end
205
+ rcode="assert(#{val}, #{msg})"
206
+ elsif rcode==""
207
+ rcode="#Line not added: #{line_orig.lstrip}"
208
+ end
209
+ rcode_lines.push("\t\t#{rcode.to_s.lstrip}\n") unless rcode==""
210
+ }
211
+ rcode_txt+=rcode_lines.join
212
+ rcode_txt+="\tend\n\n"
213
+ return rcode_txt
214
+ end
215
+
216
+ end
217
+
218
+ end
219
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: import_postman
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.0
5
+ platform: ruby
6
+ authors:
7
+ - Mario Ruiz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-05-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nice_hash
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.0
33
+ description: This gem imports a postman collection to be used as RequestHash object
34
+ email: marioruizs@gmail.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files:
38
+ - LICENSE
39
+ - README.md
40
+ files:
41
+ - LICENSE
42
+ - README.md
43
+ - lib/import_postman.rb
44
+ - lib/import_postman/parsers/rest_client.rb
45
+ homepage: https://github.com/MarioRuiz/import_postman
46
+ licenses:
47
+ - MIT
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.7.6
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: This gem imports a postman collection to be used as RequestHash object
69
+ test_files: []