poisol 0.1.1 → 0.1.2

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/poisol/domain.rb +13 -11
  3. data/lib/poisol/server.rb +45 -37
  4. data/lib/poisol/stub/request/query_builder.rb +3 -1
  5. data/lib/poisol/stub/request/request_body_builder.rb +89 -87
  6. data/lib/poisol/stub/request/url_builder.rb +15 -12
  7. data/lib/poisol/stub/response/array_response_body.rb +75 -0
  8. data/lib/poisol/stub/response/response_body_builder.rb +49 -116
  9. data/lib/poisol/stub/response/status_builder.rb +2 -0
  10. data/lib/poisol/stub/stub.rb +22 -21
  11. data/lib/poisol/stub/stub_class_builder.rb +24 -23
  12. data/lib/poisol/stub/stub_instance.rb +62 -44
  13. data/lib/poisol/stub/webrick_stub_builder.rb +34 -32
  14. data/lib/poisol/stub_config/stub_config.rb +10 -8
  15. data/lib/poisol/stub_config/stub_config_builder.rb +91 -89
  16. data/lib/poisol/stub_factory.rb +39 -38
  17. data/lib/poisol/stub_mapper/request_matcher.rb +68 -0
  18. data/lib/poisol/stub_mapper/response_mapper.rb +33 -0
  19. data/lib/poisol/stub_mapper/stubs.rb +27 -0
  20. data/spec/functional/key_value/explicit_inclusion_spec.rb +15 -1
  21. data/spec/functional/key_value/implicit_inclusion_spec.rb +1 -1
  22. data/spec/functional/multi_domain_spec.rb +1 -1
  23. data/spec/functional/post_request_spec.rb +1 -2
  24. data/spec/functional/query/query_explicit_spec.rb +1 -1
  25. data/spec/functional/query/query_implicit_spec.rb +1 -1
  26. data/spec/functional/response/array_spec.rb +14 -7
  27. data/spec/functional/response/dumb_response_spec.rb +1 -1
  28. data/spec/functional/response/hash_params_spec.rb +1 -1
  29. data/spec/functional/response/nested_array_spec.rb +2 -2
  30. data/spec/functional/url_spec.rb +1 -1
  31. data/spec/spec_helper.rb +0 -1
  32. metadata +5 -3
  33. data/lib/poisol/response_mapper.rb +0 -31
  34. data/lib/poisol/stubs.rb +0 -74
@@ -2,34 +2,35 @@ require_relative "webrick_stub_builder"
2
2
  require_relative "stub_class_builder"
3
3
  require_relative "stub_instance"
4
4
 
5
- class Stub
6
- include WebrickStubBuilder
7
- include StubInstance
8
- attr_accessor :request,:response
9
- class << self
10
- include StubClassBuilder
11
-
12
- def set_stub_config stub_config
13
- @stub_config = stub_config
14
- define_method("stub_config") do
15
- return stub_config
5
+ module Poisol
6
+ class Stub
7
+ include WebrickStubBuilder
8
+ include StubInstance
9
+ attr_accessor :request,:response
10
+ class << self
11
+ include StubClassBuilder
12
+
13
+ def set_stub_config stub_config
14
+ @stub_config = stub_config
15
+ define_method("stub_config") do
16
+ return stub_config
17
+ end
16
18
  end
17
19
  end
20
+
18
21
  end
19
22
 
20
- end
23
+ class Request
24
+ attr_accessor :url,:query,:body,:path,:type
21
25
 
22
- class Request
23
- attr_accessor :url,:query,:body,:path,:type
26
+ def to_s
27
+ "#{self.type} #{self.url} #{"Query:#{self.query}" if self.query.present?} #{"\nBody: #{self.body}" if self.body.present?} "
28
+ end
24
29
 
25
- def to_s
26
- "#{self.type} #{self.url} #{"Query:#{self.query}" if self.query.present?} #{"\nBody: #{self.body}" if self.body.present?} "
27
30
  end
28
31
 
29
- end
32
+ class Response
33
+ attr_accessor :body,:status,:header
34
+ end
30
35
 
31
- class Response
32
- attr_accessor :body,:status,:header
33
36
  end
34
-
35
-
@@ -3,34 +3,35 @@ require_relative "request/request_body_builder"
3
3
  require_relative "request/url_builder"
4
4
  require_relative "response/response_body_builder"
5
5
  require_relative "response/status_builder"
6
+ module Poisol
7
+ module StubClassBuilder
8
+ include RequestBodyBuilder
9
+ include ResponseBodyBuilder
10
+ include UrlBuilder
11
+ include QueryBuilder
6
12
 
7
- module StubClassBuilder
8
- include RequestBodyBuilder
9
- include ResponseBodyBuilder
10
- include UrlBuilder
11
- include QueryBuilder
13
+ def generate_methods_to_alter_sutb
14
+ prepare_request
15
+ prepare_response
16
+ end
12
17
 
13
- def generate_methods_to_alter_sutb
14
- prepare_request
15
- prepare_response
16
- end
18
+ def prepare_request
19
+ prepare_request_url
20
+ prepare_request_query
21
+ prepare_request_body
22
+ end
17
23
 
18
- def prepare_request
19
- prepare_request_url
20
- prepare_request_query
21
- prepare_request_body
22
- end
24
+ def prepare_request_url
25
+ generate_methods_to_alter_path_params
26
+ end
23
27
 
24
- def prepare_request_url
25
- generate_methods_to_alter_path_params
26
- end
28
+ def prepare_request_query
29
+ generate_query_methods if @stub_config.request.query.present?
30
+ end
27
31
 
28
- def prepare_request_query
29
- generate_query_methods if @stub_config.request.query.present?
30
- end
32
+ def prepare_response
33
+ prepare_response_body
34
+ end
31
35
 
32
- def prepare_response
33
- prepare_response_body
34
36
  end
35
-
36
37
  end
@@ -1,55 +1,73 @@
1
- module StubInstance
2
- def initialize
3
- init_request
4
- init_response
5
- end
1
+ module Poisol
2
+ module StubInstance
3
+ def initialize
4
+ init_request
5
+ init_response
6
+ @called_methods = []
7
+ end
6
8
 
7
- def init_request
8
- @request = Request.new
9
- @request.path = stub_config.request.url.deep_dup
10
- @request.query = stub_config.request.query_explicit ? {} : stub_config.request.query.deep_dup
11
- @request.body = stub_config.request.body_explicit ? {} : stub_config.request.body.deep_dup
12
- end
9
+ def init_request
10
+ @request = Request.new
11
+ @request.type = stub_config.request.type
12
+ @request.path = stub_config.request.url.deep_dup
13
+ @request.query = stub_config.request.query_explicit ? {} : stub_config.request.query.deep_dup
14
+ @request.body = stub_config.request.body_explicit ? {} : stub_config.request.body.deep_dup
15
+ end
13
16
 
14
- def init_response
15
- @response = Response.new
16
- if stub_config.response.is_column_array or stub_config.response.is_row_array
17
- @response.body = []
18
- else
19
- @response.body = stub_config.response.body.deep_dup
17
+ def init_response
18
+ @response = Response.new
19
+ if stub_config.response.is_column_array or stub_config.response.is_row_array
20
+ @response.body = [stub_config.response.body.deep_dup]
21
+ else
22
+ @response.body = stub_config.response.body.deep_dup
23
+ end
24
+ @response.status = 200
25
+ @response.header = {'Content-Type' => 'application/json'}
20
26
  end
21
- @response.status = 200
22
- @response.header = {'Content-Type' => 'application/json'}
23
- end
24
27
 
25
- def set_dumb_response response_file
26
- @response.body = Parse.json_file_to_hash(response_file)
27
- @is_response_dumped = true
28
- self
29
- end
28
+ def set_dumb_response response_file
29
+ @response.body = Parse.json_file_to_hash(response_file)
30
+ @is_response_dumped = true
31
+ self
32
+ end
30
33
 
31
- def get_assignment_value actual_field_value,input_value
32
- if actual_field_value.class.to_s == "Hash"
33
- input_value = {} if input_value.blank?
34
- actual_field_value.deep_merge(input_value.stringify_keys)
35
- else
36
- input_value
34
+ def get_assignment_value actual_field_value,input_value
35
+ if actual_field_value.class.to_s == "Hash"
36
+ input_value = {} if input_value.blank?
37
+ actual_field_value.deep_merge(input_value.stringify_keys)
38
+ else
39
+ input_value
40
+ end
37
41
  end
38
- end
39
42
 
40
- def has input_hash
41
- @response.body.deep_merge! input_hash.camelize_keys
42
- self
43
- end
43
+ def by input_hash
44
+ @request.body.deep_merge! input_hash
45
+ self
46
+ end
44
47
 
45
- def for input_hash
46
- @request.query.deep_merge! input_hash.camelize_keys
47
- self
48
- end
48
+ def has input_hash
49
+ @response.body.deep_merge! input_hash.camelize_keys
50
+ self
51
+ end
49
52
 
50
- def status input
51
- @response.status = input
52
- self
53
- end
53
+ def is_empty
54
+ @response.body = stub_config.response.is_column_array or stub_config.response.is_row_array ? [] : {}
55
+ self
56
+ end
57
+
58
+ def for input_hash
59
+ @request.query.deep_merge! input_hash.camelize_keys
60
+ self
61
+ end
62
+
63
+ def status input
64
+ @response.status = input
65
+ self
66
+ end
54
67
 
68
+ def remove_array_field_calls
69
+ method_of_array_fileds_of_array = self.methods.select{|method_name|method_name.to_s.start_with?"with_"}
70
+ @called_methods = @called_methods - method_of_array_fileds_of_array
71
+ end
72
+ end
55
73
  end
@@ -1,40 +1,42 @@
1
- module WebrickStubBuilder
2
- def build
3
- build_url
4
- build_query
5
- build_request_body
6
- build_response_body
7
- Stubs.add self
8
- self
9
- end
1
+ module Poisol
2
+ module WebrickStubBuilder
3
+ def build
4
+ build_url
5
+ build_query
6
+ build_request_body
7
+ build_response_body
8
+ Stubs.add self
9
+ self
10
+ end
10
11
 
11
- private
12
- def build_url
13
- remove_path_param_name_from_url
14
- @request.url = "#{stub_config.request.domain}/#{@request.path}"
15
- end
12
+ private
13
+ def build_url
14
+ remove_path_param_name_from_url
15
+ @request.url = "#{stub_config.request.domain}/#{@request.path}"
16
+ end
16
17
 
17
- def build_query
18
- return if @request.query.blank?
19
- @request.query = @request.query.to_query
20
- end
18
+ def build_query
19
+ return if @request.query.blank?
20
+ @request.query = @request.query.to_query
21
+ end
21
22
 
22
- def build_request_body
23
- return if @request.body.blank?
24
- @request.body = Parse.hash_to_concatenated_key_value(@request.body) if stub_config.request.is_body_key_value
25
- end
23
+ def build_request_body
24
+ return if @request.body.blank?
25
+ @request.body = Parse.hash_to_concatenated_key_value(@request.body) if stub_config.request.is_body_key_value
26
+ end
26
27
 
27
- def build_response_body
28
- @response.body = Parse.hash_array_to_column_hash(@response.body) if stub_config.response.is_column_array and !@is_response_dumped.present?
29
- end
28
+ def build_response_body
29
+ @response.body = Parse.hash_array_to_column_hash(@response.body) if stub_config.response.is_column_array and !@is_response_dumped.present?
30
+ end
30
31
 
31
- def remove_path_param_name_from_url
32
- @request.path.scan(/{(.+?)}/).each do |path_params|
33
- path_param = path_params[0]
34
- param_name = path_param.split("|")[0]
35
- param_value = path_param.split("|")[1]
36
- @request.path.sub!("{#{path_param}}",param_value)
32
+ def remove_path_param_name_from_url
33
+ @request.path.scan(/{(.+?)}/).each do |path_params|
34
+ path_param = path_params[0]
35
+ param_name = path_param.split("|")[0]
36
+ param_value = path_param.split("|")[1]
37
+ @request.path.sub!("{#{path_param}}",param_value)
38
+ end
37
39
  end
38
- end
39
40
 
41
+ end
40
42
  end
@@ -1,11 +1,13 @@
1
- class StubConfig
2
- attr_accessor :response,:request,:is_inline,:file
3
- end
1
+ module Poisol
2
+ class StubConfig
3
+ attr_accessor :response,:request,:is_inline,:file
4
+ end
4
5
 
5
- class RequestConfig
6
- attr_accessor :domain,:url,:type,:query,:body,:is_body_key_value,:body_explicit,:query_explicit,:is_column_array,:is_row_array
7
- end
6
+ class RequestConfig
7
+ attr_accessor :domain,:url,:type,:query,:body,:is_body_key_value,:body_explicit,:query_explicit,:is_column_array,:is_row_array
8
+ end
8
9
 
9
- class ResponseConfig
10
- attr_accessor :body,:is_column_array,:is_row_array
10
+ class ResponseConfig
11
+ attr_accessor :body,:is_column_array,:is_row_array
12
+ end
11
13
  end
@@ -1,112 +1,114 @@
1
- class StubConfigBuilder
1
+ module Poisol
2
+ class StubConfigBuilder
2
3
 
3
- def initialize
4
- @stub_config = StubConfig.new
5
- @stub_config.request = RequestConfig.new
6
- @stub_config.response = ResponseConfig.new
7
- end
4
+ def initialize
5
+ @stub_config = StubConfig.new
6
+ @stub_config.request = RequestConfig.new
7
+ @stub_config.response = ResponseConfig.new
8
+ end
8
9
 
9
- def with_file file_name
10
- @stub_config.file = file_name
11
- self
12
- end
10
+ def with_file file_name
11
+ @stub_config.file = file_name
12
+ self
13
+ end
13
14
 
14
- def with_domain domain
15
- @stub_config.request.domain = domain
16
- self
17
- end
15
+ def with_domain domain
16
+ @stub_config.request.domain = domain
17
+ self
18
+ end
18
19
 
19
- def is_inline
20
- @stub_config.is_inline = true
21
- self
22
- end
20
+ def is_inline
21
+ @stub_config.is_inline = true
22
+ self
23
+ end
23
24
 
24
- def is_exploded
25
- @stub_config.is_inline = false
26
- self
27
- end
25
+ def is_exploded
26
+ @stub_config.is_inline = false
27
+ self
28
+ end
28
29
 
29
- def build
30
- @raw_config_hash = Parse.yaml_file @stub_config.file
31
- build_request
32
- build_response
33
- return @stub_config
34
- end
30
+ def build
31
+ @raw_config_hash = Parse.yaml_file @stub_config.file
32
+ build_request
33
+ build_response
34
+ return @stub_config
35
+ end
35
36
 
36
- private
37
- def build_request
38
- load_url
39
- @stub_config.request.type = @raw_config_hash["request"]["type"].intern
40
- load_query
41
- load_request_body
42
- end
43
-
44
- def load_request_body
45
- load_request_body_filed_implicit_option
46
- @stub_config.is_inline ? load_inline_request_body : load_exploaded_request_body
47
- end
37
+ private
38
+ def build_request
39
+ load_url
40
+ @stub_config.request.type = @raw_config_hash["request"]["type"].downcase
41
+ load_query
42
+ load_request_body
43
+ end
48
44
 
45
+ def load_request_body
46
+ load_request_body_filed_implicit_option
47
+ @stub_config.is_inline ? load_inline_request_body : load_exploaded_request_body
48
+ end
49
49
 
50
- def load_query
51
- @stub_config.request.query = @raw_config_hash["request"]["query"]
52
- query_explicit = @raw_config_hash["request"]["query_explicit"]
53
- @stub_config.request.query_explicit = query_explicit.blank? ? false : query_explicit
54
- end
55
50
 
51
+ def load_query
52
+ @stub_config.request.query = @raw_config_hash["request"]["query"]
53
+ query_explicit = @raw_config_hash["request"]["query_explicit"]
54
+ @stub_config.request.query_explicit = query_explicit.blank? ? false : query_explicit
55
+ end
56
56
 
57
- def load_url
58
- url = @raw_config_hash["request"]["url"]
59
- url.strip!
60
- url.sub!("/","") if url[0].eql? "/"
61
- @stub_config.request.url = url
62
- end
63
57
 
64
- def load_request_body_filed_implicit_option
65
- body_explicit = @raw_config_hash["request"]["body_explicit"]
66
- @stub_config.request.body_explicit = body_explicit.blank? ? false : body_explicit
67
- end
58
+ def load_url
59
+ url = @raw_config_hash["request"]["url"]
60
+ url.strip!
61
+ url.sub!("/","") if url[0].eql? "/"
62
+ @stub_config.request.url = url
63
+ end
68
64
 
65
+ def load_request_body_filed_implicit_option
66
+ body_explicit = @raw_config_hash["request"]["body_explicit"]
67
+ @stub_config.request.body_explicit = body_explicit.blank? ? false : body_explicit
68
+ end
69
69
 
70
- def build_response
71
- @stub_config.is_inline ? load_inline_response_body : load_exploaded_response_body
72
- load_resonse_array_type
73
- end
74
70
 
75
- def load_resonse_array_type
76
- return if @raw_config_hash["response"].blank?
77
- array_type = @raw_config_hash["response"]["array_type"]
78
- return if array_type.blank?
79
- @stub_config.response.is_column_array = true if array_type.eql? "column"
80
- @stub_config.response.is_row_array = true if array_type.eql? "row"
81
- end
71
+ def build_response
72
+ @stub_config.is_inline ? load_inline_response_body : load_exploaded_response_body
73
+ load_resonse_array_type
74
+ end
82
75
 
76
+ def load_resonse_array_type
77
+ return if @raw_config_hash["response"].blank?
78
+ array_type = @raw_config_hash["response"]["array_type"]
79
+ return if array_type.blank?
80
+ @stub_config.response.is_column_array = true if array_type.eql? "column"
81
+ @stub_config.response.is_row_array = true if array_type.eql? "row"
82
+ end
83
83
 
84
- def load_inline_response_body
85
- raw_body = @raw_config_hash["response"]["body"]
86
- return if raw_body.blank?
87
- @stub_config.response.body = Parse.json_to_hash raw_body
88
- end
89
84
 
90
- def load_inline_request_body
91
- raw_body = @raw_config_hash["request"]["body"]
92
- return if raw_body.blank?
93
- if raw_body.class.name == "String"
94
- @stub_config.request.body = Parse.json_to_hash raw_body
95
- else
96
- @stub_config.request.is_body_key_value = true
97
- @stub_config.request.body = raw_body
85
+ def load_inline_response_body
86
+ raw_body = @raw_config_hash["response"]["body"]
87
+ return if raw_body.blank?
88
+ @stub_config.response.body = Parse.json_to_hash raw_body
98
89
  end
99
- end
100
90
 
101
- def load_exploaded_request_body
102
- request_file = "#{File.dirname @stub_config.file}/request.json"
103
- return unless File.exists? request_file
104
- @stub_config.request.body = Parse.json_file_to_hash(request_file)
105
- end
91
+ def load_inline_request_body
92
+ raw_body = @raw_config_hash["request"]["body"]
93
+ return if raw_body.blank?
94
+ if raw_body.class.name == "String"
95
+ @stub_config.request.body = Parse.json_to_hash raw_body
96
+ else
97
+ @stub_config.request.is_body_key_value = true
98
+ @stub_config.request.body = raw_body
99
+ end
100
+ end
101
+
102
+ def load_exploaded_request_body
103
+ request_file = "#{File.dirname @stub_config.file}/request.json"
104
+ return unless File.exists? request_file
105
+ @stub_config.request.body = Parse.json_file_to_hash(request_file)
106
+ end
106
107
 
107
- def load_exploaded_response_body
108
- response_file = "#{File.dirname @stub_config.file}/response.json"
109
- return unless File.exists? response_file
110
- @stub_config.response.body = Parse.json_file_to_hash(response_file)
108
+ def load_exploaded_response_body
109
+ response_file = "#{File.dirname @stub_config.file}/response.json"
110
+ return unless File.exists? response_file
111
+ @stub_config.response.body = Parse.json_file_to_hash(response_file)
112
+ end
111
113
  end
112
114
  end
@@ -1,51 +1,52 @@
1
1
  require_relative "stub/stub"
2
+ module Poisol
3
+ class StubFactory
4
+ def build folder
5
+ @folder = folder.chomp '/'
6
+ load_domain
7
+ load_stub_configs
8
+ end
2
9
 
3
- class StubFactory
4
- def build folder
5
- @folder = folder.chomp '/'
6
- load_domain
7
- load_stub_configs
8
- end
10
+ private
9
11
 
10
- private
12
+ def load_domain
13
+ domain_config_file = Dir["#{@folder}/domain.yml"].first
14
+ @domain = Domain.new domain_config_file
15
+ end
11
16
 
12
- def load_domain
13
- domain_config_file = Dir["#{@folder}/domain.yml"].first
14
- @domain = Domain.new domain_config_file
15
- end
17
+ def load_stub_configs
18
+ explolded_configs = Dir["#{@folder}/**/config.yml"]
19
+ inline_configs = Dir["#{@folder}/**/*.yml"] - ( (explolded_configs.nil?) ? [] : explolded_configs) - [@domain.file]
20
+ generate_exploded_config explolded_configs unless explolded_configs.nil?
21
+ generate_inline_config inline_configs unless inline_configs.nil?
22
+ end
16
23
 
17
- def load_stub_configs
18
- explolded_configs = Dir["#{@folder}/**/config.yml"]
19
- inline_configs = Dir["#{@folder}/**/*.yml"] - ( (explolded_configs.nil?) ? [] : explolded_configs) - [@domain.file]
20
- generate_exploded_config explolded_configs unless explolded_configs.nil?
21
- generate_inline_config inline_configs unless inline_configs.nil?
22
- end
23
24
 
25
+ def generate_exploded_config explolded_configs
26
+ explolded_configs.each do |config_file|
27
+ PoisolLog.info "Processing #{config_file}"
28
+ dynamic_name = (FileName.get_dir_name config_file).camelize
29
+ config = StubConfigBuilder.new.is_exploded.with_file(config_file).with_domain(@domain.full_url).build
30
+ create_class dynamic_name,config
31
+ end
32
+ end
24
33
 
25
- def generate_exploded_config explolded_configs
26
- explolded_configs.each do |config_file|
27
- PoisolLog.info "Processing #{config_file}"
28
- dynamic_name = (FileName.get_dir_name config_file).camelize
29
- config = StubConfigBuilder.new.is_exploded.with_file(config_file).with_domain(@domain.full_url).build
30
- create_class dynamic_name,config
34
+ def generate_inline_config inline_configs
35
+ inline_configs.each do |config_file|
36
+ PoisolLog.debug "Processing #{config_file}"
37
+ dynamic_name = (FileName.get_file_name config_file).camelize
38
+ stub_config = StubConfigBuilder.new.is_inline.with_file(config_file).with_domain(@domain.full_url).build
39
+ create_class dynamic_name,stub_config
40
+ end
31
41
  end
32
- end
33
42
 
34
- def generate_inline_config inline_configs
35
- inline_configs.each do |config_file|
36
- PoisolLog.debug "Processing #{config_file}"
37
- dynamic_name = (FileName.get_file_name config_file).camelize
38
- stub_config = StubConfigBuilder.new.is_inline.with_file(config_file).with_domain(@domain.full_url).build
39
- create_class dynamic_name,stub_config
43
+ def create_class class_name,stub_config
44
+ dynamic_stub_class = Object.const_set class_name,Class.new(Stub)
45
+ dynamic_stub_class.set_stub_config stub_config
46
+ dynamic_stub_class.generate_methods_to_alter_sutb
47
+ PoisolLog.info "Generated #{class_name}"
48
+ PoisolLog.debug "with methods #{dynamic_stub_class.instance_methods - Object.methods}"
40
49
  end
41
- end
42
50
 
43
- def create_class class_name,stub_config
44
- dynamic_stub_class = Object.const_set class_name,Class.new(Stub)
45
- dynamic_stub_class.set_stub_config stub_config
46
- dynamic_stub_class.generate_methods_to_alter_sutb
47
- PoisolLog.info "Generated #{class_name}"
48
- PoisolLog.debug "with methods #{dynamic_stub_class.instance_methods - Object.methods}"
49
51
  end
50
-
51
52
  end