poisol 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/poisol/domain.rb +6 -3
  3. data/lib/poisol/extensions/webmock_extensions.rb +11 -0
  4. data/lib/poisol/stub/request/query_builder.rb +11 -0
  5. data/lib/poisol/stub/request/request_body_builder.rb +12 -0
  6. data/lib/poisol/stub/request/url_builder.rb +17 -0
  7. data/lib/poisol/{template/response_handler.rb → stub/response/response_body_builder.rb} +22 -40
  8. data/lib/poisol/stub/response/status_builder.rb +3 -0
  9. data/lib/poisol/stub/stub.rb +57 -0
  10. data/lib/poisol/stub/stub_class_builder.rb +35 -0
  11. data/lib/poisol/stub/webmock_stub_builder.rb +40 -0
  12. data/lib/poisol/stub_config/stub_config.rb +11 -0
  13. data/lib/poisol/stub_config/stub_config_builder.rb +100 -0
  14. data/lib/poisol/stub_factory.rb +26 -15
  15. data/lib/poisol/utils/file_util.rb +6 -11
  16. data/lib/poisol/utils/logger.rb +25 -0
  17. data/lib/poisol/utils/parse.rb +8 -8
  18. data/lib/poisol.rb +17 -0
  19. data/spec/functional/array_spec.rb +1 -1
  20. data/spec/functional/dumb_response_spec.rb +1 -1
  21. data/spec/functional/get_spec.rb +1 -1
  22. data/spec/functional/key_value/explicit_inclusion_spec.rb +1 -1
  23. data/spec/functional/key_value/implicit_inclusion_spec.rb +1 -1
  24. data/spec/functional/multi_domain_spec.rb +1 -1
  25. data/spec/functional/nested_array_spec.rb +1 -1
  26. data/spec/functional/post_spec.rb +1 -1
  27. data/spec/functional/url_spec.rb +1 -1
  28. data/spec/unit/exception_spec.rb +5 -0
  29. data/spec/unit/stub_spec.rb +6 -0
  30. metadata +18 -9
  31. data/lib/poisol/stub_config.rb +0 -95
  32. data/lib/poisol/template/base_template.rb +0 -29
  33. data/lib/poisol/template/build.rb +0 -29
  34. data/lib/poisol/template/query_handler.rb +0 -11
  35. data/lib/poisol/template/request_handler.rb +0 -14
  36. data/lib/poisol/template/url_handler.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 534d85b7e97186a0fb7bb51365f92dd513431be2
4
- data.tar.gz: ad63697e35dce8bef219598deef37270b0f67afb
3
+ metadata.gz: 8c6cd9d6bddc3b3a855b003566ef8ce6767c1d0c
4
+ data.tar.gz: 39307a21d0f273ef3ea78a70accaf753d14e83c9
5
5
  SHA512:
6
- metadata.gz: 998572b0699167bbc9ed8bacfee2b9e31a44bf61fb018b330094d821af9fd91539a056513130742509fba0ef1a1b19db800b94405b62180fedb153b3a50ec217
7
- data.tar.gz: d6c72a945f02c74fd70098399a3f0ee386a8414a26d04c1edd515ec283a2d9541dcdacc2c379d9dae584413db5de3b3d87d6eea2155521ba5d97c7ab09f7d43e
6
+ metadata.gz: 56c27ca1e388144a37b04de81e9c09bfa372aa3b030b7a3eb76c31b07c02e8a60d860b52ce3d037cd6b8a7a9245e6a685ccf33af8e434b7dca44714c89a84672
7
+ data.tar.gz: f54cdbfbd7fc29eb142bc668ef342da63601541b0235fa3cc5d155f5726e69d012fa3b959f0ba8b088d4545f32804e499a14f66e2ab934adc2f62584c333d56e
data/lib/poisol/domain.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  class Domain
2
- def load domain_config
3
- base_hash = Parse.yaml_file domain_config
2
+ attr_reader :file,:full_url
3
+
4
+ def initialize domain_config_file
5
+ @file = domain_config_file
6
+ base_hash = Parse.yaml_file @file
4
7
  domain = base_hash["domain"]
5
8
  port = base_hash["port"]
6
- "#{domain.chomp('\\')}#{ port.present? ? ":#{port}" : "" }"
9
+ @full_url = "#{domain.chomp('\\')}#{ port.present? ? ":#{port}" : "" }"
7
10
  end
8
11
 
9
12
  end
@@ -0,0 +1,11 @@
1
+ module WebMock
2
+ class NetConnectNotAllowedError
3
+ alias real_init initialize
4
+ def initialize(*args)
5
+ exception = real_init *args
6
+ request = args[0]
7
+ PoisolLog.error "**************Failed************\n#{request.method}:#{request.uri}\n#{request.body if request.body.present?}"
8
+ exception
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module QueryBuilder
2
+ def generate_query_methods
3
+ query = @stub_config.request.query
4
+ query.each do |field|
5
+ define_method("for_#{field[0]}") do |*value|
6
+ @request.query[field[0]] = value[0]
7
+ self
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module RequestBodyBuilder
2
+ def generate_request_methods
3
+ request_body = @stub_config.request.body.deep_dup
4
+ request_body.each do |field|
5
+ field_name = field[0]
6
+ define_method("by_#{field[0].underscore}") do |*value|
7
+ @request.body[field_name] = value[0]
8
+ self
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module UrlBuilder
2
+ def generate_methods_to_alter_path_params
3
+ url = @stub_config.request.url
4
+ url.scan(/{(.+?)}/).each do |path_params|
5
+ path_param = path_params[0]
6
+ param_name = path_param.split("|")[0]
7
+ param_default_value = path_param.split("|")[1]
8
+ method_name = "for_#{param_name.underscore}"
9
+ define_method(method_name) do |*input_value|
10
+ input_value = input_value[0]
11
+ @request.url.sub!("{#{path_param}}","{#{param_name}|#{input_value}}") unless input_value.blank?
12
+ self
13
+ end
14
+ end
15
+ end
16
+
17
+ end
@@ -1,8 +1,8 @@
1
- module ClassTemplate
1
+ module ResponseBodyBuilder
2
2
 
3
3
  def prepare_response
4
- return if @config.response.body.blank?
5
- if @config.response.is_column_array or @config.response.is_row_array
4
+ return if @stub_config.response.body.blank?
5
+ if @stub_config.response.is_column_array or @stub_config.response.is_row_array
6
6
  generate_methods_to_alter_response_array
7
7
  else
8
8
  generate_methods_to_alter_response_object
@@ -10,41 +10,39 @@ module ClassTemplate
10
10
  end
11
11
 
12
12
  def generate_methods_to_alter_response_array
13
- @response_body_object = @config.response.body
14
- @response_body = []
13
+ @response_array_item = @stub_config.response.body
15
14
  generate_method_to_append_response_array
16
15
  generate_method_to_alter_response_array_object
17
16
  end
18
17
 
19
18
  def generate_method_to_alter_response_array_object
20
- @response_body_object.each do |field|
19
+ @response_array_item.each do |field|
21
20
  field_name = field[0]
22
21
  actual_field_value = field[1]
23
22
  is_array = (actual_field_value.class.to_s == "Array")
24
23
  actual_field_value = actual_field_value[0] if is_array
25
- @response_body.last[field_name] = [] if is_array
26
24
  method_name = is_array ? ("with_#{field_name.classify.underscore}") : ("with_#{field_name.underscore}")
27
- define_singleton_method(method_name) do |*input_value|
25
+ define_method(method_name) do |*input_value|
28
26
  input_value = input_value[0]
29
27
  assignment_value = get_assignment_value actual_field_value,input_value
30
- @response_body.last[field_name] = is_array ? (@response_body.last[field_name] << assignment_value) : assignment_value
28
+ @response.body.last[field_name] = is_array ? (@response.body.last[field_name] << assignment_value) : assignment_value
31
29
  self
32
30
  end
33
31
  end
34
32
  end
35
33
 
36
34
  def generate_method_to_append_response_array
37
- object_name = self.class.to_s.classify.underscore
38
- method_name = "has_#{object_name}"
39
- define_singleton_method(method_name) do
40
- @response_body << @response_body_object.deep_dup
35
+ class_name = self.name.classify.underscore
36
+ method_name = "has_#{class_name}"
37
+ define_method(method_name) do
38
+ @response.body << stub_config.response.body.deep_dup
41
39
  self
42
40
  end
43
41
  end
44
42
 
45
43
  def generate_methods_to_alter_response_object
46
- @response_body = @config.response.body.clone
47
- @response_body.each do |field|
44
+ response_body = @stub_config.response.body.clone
45
+ response_body.each do |field|
48
46
  field_name = field[0]
49
47
  actual_field_value = field[1]
50
48
  is_array = (actual_field_value.class.to_s == "Array")
@@ -57,56 +55,40 @@ module ClassTemplate
57
55
  end
58
56
  end
59
57
 
60
- def set_dumb_response response_file
61
- @response_body = Parse.json_file_to_hash(response_file)
62
- @config.response.is_column_array = false
63
- @config.response.is_row_array = false
64
- self
65
- end
66
-
67
58
  def generate_method_to_alter_response_field_array field_name,actual_field_values
68
59
  actual_field_value = actual_field_values[0]
69
60
  method_name = "has_#{field_name.classify.underscore}"
70
- define_singleton_method(method_name) do |*input_value|
61
+ define_method(method_name) do |*input_value|
71
62
  input_value = input_value[0]
72
63
  assignment_value = get_assignment_value actual_field_value,input_value
73
- @response_body[field_name] = [assignment_value]
64
+ @response.body[field_name] = [assignment_value]
74
65
  self
75
66
  end
76
67
 
77
68
  method_name = "has_another_#{field_name.classify.underscore}"
78
- define_singleton_method(method_name) do |*input_value|
69
+ define_method(method_name) do |*input_value|
79
70
  input_value = input_value[0]
80
71
  assignment_value = get_assignment_value actual_field_value,input_value
81
- @response_body[field_name] = @response_body[field_name] << assignment_value
72
+ @response.body[field_name] = @response.body[field_name] << assignment_value
82
73
  self
83
74
  end
84
75
 
85
76
  method_name = "has_no_#{field_name.classify.underscore}"
86
- define_singleton_method(method_name) do
87
- @response_body[field_name] = []
77
+ define_method(method_name) do
78
+ @response.body[field_name] = []
88
79
  self
89
80
  end
90
81
  end
91
82
 
92
83
  def generate_method_to_alter_response_field field_name,actual_field_value
93
84
  method_name = "has_#{field_name.underscore}"
94
- self.class.send(:define_method, method_name) do |*input_value|
85
+ define_method(method_name) do |*input_value|
95
86
  input_value = input_value[0]
96
87
  assignment_value = get_assignment_value actual_field_value,input_value
97
- @response_body[field_name] = assignment_value
88
+ @response.body[field_name] = assignment_value
98
89
  self
99
90
  end
100
91
  end
101
92
 
102
93
 
103
- def get_assignment_value actual_field_value,input_value
104
- if actual_field_value.class.to_s == "Hash"
105
- input_value = {} if input_value.blank?
106
- actual_field_value.deep_merge(input_value)
107
- else
108
- input_value
109
- end
110
- end
111
-
112
- end
94
+ end
@@ -0,0 +1,3 @@
1
+ module StatusBuilder
2
+
3
+ end
@@ -0,0 +1,57 @@
1
+ require_relative "webmock_stub_builder"
2
+ require_relative "stub_class_builder"
3
+
4
+ class Stub
5
+ include WebMockStubBuilder
6
+ attr_accessor :request,:response
7
+ class << self
8
+ include StubClassBuilder
9
+
10
+ def set_stub_config stub_config
11
+ @stub_config = stub_config
12
+ define_method("stub_config") do
13
+ return stub_config
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize
19
+ @request = Request.new
20
+ @response = Response.new
21
+ @request.url = stub_config.request.url.deep_dup
22
+ @request.query = stub_config.request.query.deep_dup
23
+ @request.body = stub_config.request.body.deep_dup
24
+ @request.body = {} if stub_config.request.include_explicit_only
25
+ if stub_config.response.is_column_array or stub_config.response.is_row_array
26
+ @response.body = []
27
+ else
28
+ @response.body = stub_config.response.body.deep_dup
29
+ end
30
+ end
31
+
32
+ def set_dumb_response response_file
33
+ @response.body = Parse.json_file_to_hash(response_file)
34
+ @is_response_dumped = true
35
+ self
36
+ end
37
+
38
+ def get_assignment_value actual_field_value,input_value
39
+ if actual_field_value.class.to_s == "Hash"
40
+ input_value = {} if input_value.blank?
41
+ actual_field_value.deep_merge(input_value)
42
+ else
43
+ input_value
44
+ end
45
+ end
46
+
47
+ end
48
+
49
+ class Request
50
+ attr_accessor :url,:query,:body
51
+ end
52
+
53
+ class Response
54
+ attr_accessor :body,:status
55
+ end
56
+
57
+
@@ -0,0 +1,35 @@
1
+ require_relative "request/query_builder"
2
+ require_relative "request/request_body_builder"
3
+ require_relative "request/url_builder"
4
+ require_relative "response/response_body_builder"
5
+ require_relative "response/status_builder"
6
+
7
+ module StubClassBuilder
8
+ include RequestBodyBuilder
9
+ include ResponseBodyBuilder
10
+ include UrlBuilder
11
+ include QueryBuilder
12
+
13
+ def generate_methods_to_alter_sutb
14
+ prepare_request
15
+ prepare_response
16
+ end
17
+
18
+ def prepare_request
19
+ prepare_request_url
20
+ prepare_request_query
21
+ prepare_request_body
22
+ end
23
+
24
+ def prepare_request_url
25
+ generate_methods_to_alter_path_params
26
+ end
27
+
28
+ def prepare_request_query
29
+ generate_query_methods if @stub_config.request.query.present?
30
+ end
31
+
32
+ def prepare_request_body
33
+ generate_request_methods if @stub_config.request.body.present?
34
+ end
35
+ end
@@ -0,0 +1,40 @@
1
+ module WebMockStubBuilder
2
+ def build
3
+ build_url
4
+ build_query
5
+ build_request_body
6
+ build_response_body
7
+ return @webmock_stub
8
+ end
9
+
10
+ private
11
+ def build_url
12
+ remove_path_param_name_from_url
13
+ @webmock_stub = stub_request(stub_config.request.type, "http://#{stub_config.request.domain}/#{@request.url}")
14
+ end
15
+
16
+ def build_query
17
+ @webmock_stub.with(:query => @request.query) unless @request.query.eql? ""
18
+ end
19
+
20
+ def build_request_body
21
+ return if @request.body.blank?
22
+ @request.body = Parse.hash_to_concatenated_key_value(@request.body) if stub_config.request.is_body_key_value
23
+ @webmock_stub.with(:body => @request.body)
24
+ end
25
+
26
+ def build_response_body
27
+ @response.body = Parse.hash_array_to_column_hash(@response.body) if stub_config.response.is_column_array and !@is_response_dumped.present?
28
+ @webmock_stub.to_return(:status => 200, :body => @response.body.to_json, :headers => {'Content-Type' => 'application/json'})
29
+ end
30
+
31
+ def remove_path_param_name_from_url
32
+ @request.url.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.url.sub!("{#{path_param}}",param_value)
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,11 @@
1
+ class StubConfig
2
+ attr_accessor :response,:request,:is_inline,:file
3
+ end
4
+
5
+ class RequestConfig
6
+ attr_accessor :domain,:url,:type,:query,:body,:is_body_key_value,:include_explicit_only
7
+ end
8
+
9
+ class ResponseConfig
10
+ attr_accessor :body,:is_column_array,:is_row_array
11
+ end
@@ -0,0 +1,100 @@
1
+ class StubConfigBuilder
2
+
3
+ def initialize
4
+ @stub_config = StubConfig.new
5
+ @stub_config.request = RequestConfig.new
6
+ @stub_config.response = ResponseConfig.new
7
+ end
8
+
9
+ def with_file file_name
10
+ @stub_config.file = file_name
11
+ self
12
+ end
13
+
14
+ def with_domain domain
15
+ @stub_config.request.domain = domain
16
+ self
17
+ end
18
+
19
+ def is_inline
20
+ @stub_config.is_inline = true
21
+ self
22
+ end
23
+
24
+ def is_exploded
25
+ @stub_config.is_inline = false
26
+ self
27
+ end
28
+
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
35
+
36
+ private
37
+ def build_request
38
+ load_url
39
+ @stub_config.request.type = @raw_config_hash["request"]["type"].intern
40
+ @stub_config.request.query = @raw_config_hash["request"]["query"]
41
+ load_request_body_filed_implicit_option
42
+ @stub_config.is_inline ? load_inline_request_body : load_exploaded_request_body
43
+ end
44
+
45
+ def load_url
46
+ url = @raw_config_hash["request"]["url"]
47
+ url.strip!
48
+ url.sub!("/","") if url[0].eql? "/"
49
+ @stub_config.request.url = url
50
+ end
51
+
52
+ def load_request_body_filed_implicit_option
53
+ include_explicit_only = @raw_config_hash["request"]["include_explicit_only"]
54
+ @stub_config.request.include_explicit_only = include_explicit_only.blank? ? false : include_explicit_only
55
+ end
56
+
57
+
58
+ def build_response
59
+ @stub_config.is_inline ? load_inline_response_body : load_exploaded_response_body
60
+ load_resonse_array_type
61
+ end
62
+
63
+ def load_resonse_array_type
64
+ return if @raw_config_hash["response"].blank?
65
+ array_type = @raw_config_hash["response"]["array_type"]
66
+ return if array_type.blank?
67
+ @stub_config.response.is_column_array = true if array_type.eql? "column"
68
+ @stub_config.response.is_row_array = true if array_type.eql? "row"
69
+ end
70
+
71
+
72
+ def load_inline_response_body
73
+ raw_body = @raw_config_hash["response"]["body"]
74
+ return if raw_body.blank?
75
+ @stub_config.response.body = Parse.json_to_hash raw_body
76
+ end
77
+
78
+ def load_inline_request_body
79
+ raw_body = @raw_config_hash["request"]["body"]
80
+ return if raw_body.blank?
81
+ if raw_body.class.name == "String"
82
+ @stub_config.request.body = Parse.json_to_hash raw_body
83
+ else
84
+ @stub_config.request.is_body_key_value = true
85
+ @stub_config.request.body = raw_body
86
+ end
87
+ end
88
+
89
+ def load_exploaded_request_body
90
+ request_file = "#{File.dirname @stub_config.file}/request.json"
91
+ return unless File.exists? request_file
92
+ @stub_config.request.body = Parse.json_file_to_hash(request_file)
93
+ end
94
+
95
+ def load_exploaded_response_body
96
+ response_file = "#{File.dirname @stub_config.file}/response.json"
97
+ return unless File.exists? response_file
98
+ @stub_config.response.body = Parse.json_file_to_hash(response_file)
99
+ end
100
+ end
@@ -1,36 +1,47 @@
1
+ require_relative "stub/stub"
2
+
1
3
  class StubFactory
2
4
  def build folder
3
- folder.chomp! '/'
4
- domain_config = Dir["#{folder}/domain.yml"].first
5
- explolded_configs = Dir["#{folder}/**/config.yml"]
6
- inline_configs = Dir["#{folder}/**/*.yml"] - ( (explolded_configs.nil?) ? [] : explolded_configs) - [domain_config]
7
- @domain = Domain.new.load domain_config
8
- generate_exploded_config explolded_configs unless explolded_configs.nil?
9
- generate_inline_config inline_configs unless inline_configs.nil?
5
+ @folder = folder.chomp '/'
6
+ load_domain
7
+ load_stub_configs
10
8
  end
11
9
 
12
10
  private
13
11
 
12
+ def load_domain
13
+ domain_config_file = Dir["#{@folder}/domain.yml"].first
14
+ @domain = Domain.new domain_config_file
15
+ end
16
+
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
+
14
24
 
15
25
  def generate_exploded_config explolded_configs
16
26
  explolded_configs.each do |config_file|
17
- dynamic_name = FileUtil.titilze_parent_dir config_file
18
- config = StubConfig.new.is_exploded.with_file(config_file).with_domain(@domain).build
27
+ dynamic_name = (FileName.get_dir_name config_file).camelize
28
+ config = StubConfigBuilder.new.is_exploded.with_file(config_file).with_domain(@domain.full_url).build
19
29
  create_class dynamic_name,config
20
30
  end
21
31
  end
22
32
 
23
33
  def generate_inline_config inline_configs
24
34
  inline_configs.each do |config_file|
25
- dynamic_name = FileUtil.titilze_file_name config_file
26
- config = StubConfig.new.is_inline.with_file(config_file).with_domain(@domain).build
27
- create_class dynamic_name,config
35
+ dynamic_name = (FileName.get_file_name config_file).camelize
36
+ stub_config = StubConfigBuilder.new.is_inline.with_file(config_file).with_domain(@domain.full_url).build
37
+ create_class dynamic_name,stub_config
28
38
  end
29
39
  end
30
40
 
31
- def create_class class_name,config
32
- ConfigMap.add class_name => config
33
- Object.const_set class_name,Class.new {include ClassTemplate}
41
+ def create_class class_name,stub_config
42
+ dynamic_stub_class = Object.const_set class_name,Class.new(Stub)
43
+ dynamic_stub_class.set_stub_config stub_config
44
+ dynamic_stub_class.generate_methods_to_alter_sutb
34
45
  end
35
46
 
36
47
  end
@@ -1,17 +1,12 @@
1
- class FileUtil
1
+ module FileName
2
+ extend self
2
3
 
3
- def self.titilze_parent_dir file_name
4
- titilize File.basename(File.dirname file_name)
4
+ def get_dir_name file_name
5
+ File.basename(File.dirname file_name)
5
6
  end
6
7
 
7
- def self.titilze_file_name file_name
8
- titilize ((File.basename file_name).chomp ".yml")
9
- end
10
-
11
- private
12
-
13
- def self.titilize input
14
- (input).capitalize.split('_').reduce{|c,a| c+a.capitalize}
8
+ def get_file_name file_name
9
+ ((File.basename file_name).chomp ".yml")
15
10
  end
16
11
 
17
12
  end
@@ -0,0 +1,25 @@
1
+ class PoisolLog
2
+ class << self
3
+
4
+ def logger
5
+ FileUtils.mkdir_p "log" unless File.exists?("log")
6
+ @poisol_logger ||= Logger.new("log/poisol_stub.log")
7
+ @poisol_logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
8
+ @poisol_logger.level = Logger::INFO
9
+ @poisol_logger
10
+ end
11
+
12
+ def error message
13
+ logger.error "#{message}\n"
14
+ end
15
+
16
+ def info message
17
+ logger.info "#{message}\n"
18
+ end
19
+
20
+ def warn message
21
+ logger.warn "#{message}\n"
22
+ end
23
+
24
+ end
25
+ end
@@ -1,18 +1,19 @@
1
- class Parse
1
+ module Parse
2
+ extend self
2
3
 
3
- def self.json_file_to_hash file_name
4
+ def json_file_to_hash file_name
4
5
  JSON.parse File.read(file_name)
5
6
  end
6
7
 
7
- def self.yaml_file file_name
8
+ def yaml_file file_name
8
9
  YAML.load_file(file_name)
9
10
  end
10
11
 
11
- def self.json_to_hash json
12
+ def json_to_hash json
12
13
  JSON.parse json
13
14
  end
14
15
 
15
- def self.hash_array_to_column_hash hash_array
16
+ def hash_array_to_column_hash hash_array
16
17
  return [] if hash_array.blank?
17
18
  column_hash = Hash.new
18
19
  hash_array[0].each_key { |key| column_hash.merge!(key=>[])}
@@ -22,13 +23,12 @@ class Parse
22
23
  column_hash
23
24
  end
24
25
 
25
- def self.hash_to_concatenated_key_value hash
26
+ def hash_to_concatenated_key_value hash
26
27
  concatenated_body = ""
27
28
  hash.each do |key,value|
28
- concatenated_body = concatenated_body + "#{key}=#{value}&"
29
+ concatenated_body = concatenated_body + "#{key}=#{value}&"
29
30
  end
30
31
  concatenated_body.chomp('&')
31
32
  end
32
33
 
33
34
  end
34
-
data/lib/poisol.rb CHANGED
@@ -1,2 +1,19 @@
1
1
  require 'active_support/all'
2
+
2
3
  Dir["#{File.dirname(__FILE__)}/poisol/**/*.rb"].each { |f| require(f) }
4
+
5
+ module Poisol
6
+ extend self
7
+
8
+ def load folder
9
+ StubFactory.new.build folder
10
+ end
11
+
12
+ def log_all_calls to_domain
13
+ WebMock.after_request(:real_requests_only => false) do |req_signature, response|
14
+ if req_signature.to_s.include? to_domain
15
+ PoisolLog.info "========================\nRequest\n#{req_signature.uri}\n#{req_signature.body}\nResponse:#{response.status[0]}\n#{JSON.pretty_generate(JSON.parse(response.body)) if response.status.present?}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#array" do
1
+ describe Stub, "#array" do
2
2
 
3
3
  it "empty column array" do
4
4
  Columns.new.build
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#dumb response" do
1
+ describe Stub, "#dumb response" do
2
2
 
3
3
  it "column array" do
4
4
  Columns.new.set_dumb_response("spec/data/main/user/response.json").build
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#get_books" do
1
+ describe Stub, "#get_books" do
2
2
 
3
3
  it "dynamic response" do
4
4
  Book.new.has_category({"age_group"=>"11", "publisher"=>{"name"=>"oxford"}}).build()
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#key_value" do
1
+ describe Stub, "#key_value" do
2
2
 
3
3
  it "partial dynamic request" do
4
4
  Explicit.new.by_name("ram").build()
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#key_value" do
1
+ describe Stub, "#key_value" do
2
2
 
3
3
  it "default request" do
4
4
  KeyValue.new.build()
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#multi domain" do
1
+ describe Stub, "#multi domain" do
2
2
 
3
3
  it "support multi domain" do
4
4
  First.new.build
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#nested array" do
1
+ describe Stub, "#nested array" do
2
2
 
3
3
  it "empty" do
4
4
  NestedArray.new.has_no_role.build()
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#post_user" do
1
+ describe Stub, "#post_user" do
2
2
 
3
3
  it "default request and response" do
4
4
  User.new.build()
@@ -1,4 +1,4 @@
1
- describe ClassTemplate, "#url" do
1
+ describe Stub, "#url" do
2
2
 
3
3
  it "default" do
4
4
  Url.new.build()
@@ -0,0 +1,5 @@
1
+ describe PoisolLog, "log" do
2
+ it "default" do
3
+ WebMock::NetConnectNotAllowedError.new WebMock::RequestSignature.new :get,"http://localhost:89675/blabl",{:body => "hi"}
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ #describe Stub, "#dynamic class" do
2
+
3
+ #it "url" do
4
+
5
+
6
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poisol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Deepak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-04 00:00:00.000000000 Z
11
+ date: 2014-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -132,15 +132,20 @@ files:
132
132
  - lib/poisol.rb
133
133
  - lib/poisol/config_map.rb
134
134
  - lib/poisol/domain.rb
135
- - lib/poisol/stub_config.rb
135
+ - lib/poisol/extensions/webmock_extensions.rb
136
+ - lib/poisol/stub/request/query_builder.rb
137
+ - lib/poisol/stub/request/request_body_builder.rb
138
+ - lib/poisol/stub/request/url_builder.rb
139
+ - lib/poisol/stub/response/response_body_builder.rb
140
+ - lib/poisol/stub/response/status_builder.rb
141
+ - lib/poisol/stub/stub.rb
142
+ - lib/poisol/stub/stub_class_builder.rb
143
+ - lib/poisol/stub/webmock_stub_builder.rb
144
+ - lib/poisol/stub_config/stub_config.rb
145
+ - lib/poisol/stub_config/stub_config_builder.rb
136
146
  - lib/poisol/stub_factory.rb
137
- - lib/poisol/template/base_template.rb
138
- - lib/poisol/template/build.rb
139
- - lib/poisol/template/query_handler.rb
140
- - lib/poisol/template/request_handler.rb
141
- - lib/poisol/template/response_handler.rb
142
- - lib/poisol/template/url_handler.rb
143
147
  - lib/poisol/utils/file_util.rb
148
+ - lib/poisol/utils/logger.rb
144
149
  - lib/poisol/utils/parse.rb
145
150
  - spec/data/domain/first/domain.yml
146
151
  - spec/data/domain/first/first.yml
@@ -167,6 +172,8 @@ files:
167
172
  - spec/functional/post_spec.rb
168
173
  - spec/functional/url_spec.rb
169
174
  - spec/spec_helper.rb
175
+ - spec/unit/exception_spec.rb
176
+ - spec/unit/stub_spec.rb
170
177
  homepage: https://github.com/paramadeep/poisol
171
178
  licenses:
172
179
  - MIT
@@ -207,6 +214,8 @@ test_files:
207
214
  - spec/data/main/key_value/explicit.yml
208
215
  - spec/data/main/key_value/key_value.yml
209
216
  - spec/data/main/book.yml
217
+ - spec/unit/exception_spec.rb
218
+ - spec/unit/stub_spec.rb
210
219
  - spec/spec_helper.rb
211
220
  - spec/functional/multi_domain_spec.rb
212
221
  - spec/functional/array_spec.rb
@@ -1,95 +0,0 @@
1
- class StubConfig
2
- attr_reader :response,:request
3
-
4
- def with_file file_name
5
- @config_yml_file = file_name
6
- @config_yml = Parse.yaml_file file_name
7
- self
8
- end
9
-
10
- def with_domain domain
11
- @domain = domain
12
- self
13
- end
14
-
15
- def is_inline
16
- @is_inline = true
17
- self
18
- end
19
-
20
- def is_exploded
21
- @is_inline = false
22
- self
23
- end
24
-
25
- def build
26
- build_request
27
- build_response
28
- self
29
- end
30
-
31
- private
32
- def build_request
33
- @request = Request.new
34
- @request.domain=@domain.clone
35
- @request.url = @config_yml["request"]["url"]
36
- @request.type = @config_yml["request"]["type"].intern
37
- @request.query = @config_yml["request"]["query"]
38
- include_explicit_only = @config_yml["request"]["include_explicit_only"]
39
- @request.include_explicit_only = include_explicit_only.blank? ? false : include_explicit_only
40
- @request.body = @is_inline? get_inline_request_body : get_exploaded_request_body
41
- end
42
-
43
- def build_response
44
- @response = Response.new
45
- response.body = @is_inline? get_inline_response_body : get_exploaded_response_body
46
- handle_resonse_array_type
47
- end
48
-
49
- def handle_resonse_array_type
50
- return if @config_yml["response"].blank?
51
- array_type = @config_yml["response"]["array_type"]
52
- return if array_type.blank?
53
- @response.is_column_array = true if array_type.eql? "column"
54
- @response.is_row_array = true if array_type.eql? "row"
55
- end
56
-
57
-
58
- def get_inline_response_body
59
- body = @config_yml["response"]["body"]
60
- return (body.nil?) ? "": (Parse.json_to_hash body)
61
- end
62
-
63
- def get_inline_request_body
64
- body = @config_yml["request"]["body"]
65
- if body.nil?
66
- return ""
67
- elsif body.class.name == "String"
68
- return Parse.json_to_hash body
69
- else
70
- @request.is_body_key_value = true
71
- return body
72
- end
73
- end
74
-
75
- def get_exploaded_request_body
76
- request_file = "#{File.dirname @config_yml_file}/request.json"
77
- return (File.exists? request_file) ? Parse.json_file_to_hash(request_file) : ""
78
- end
79
-
80
- def get_exploaded_response_body
81
- response_file = "#{File.dirname @config_yml_file}/response.json"
82
- return (File.exists? response_file)? Parse.json_file_to_hash(response_file) : ""
83
- end
84
-
85
- end
86
-
87
-
88
- class Request
89
- attr_accessor :domain,:url,:type,:query,:body,:is_body_key_value,:include_explicit_only
90
- end
91
-
92
- class Response
93
- attr_accessor :body,:is_column_array,:is_row_array
94
- end
95
-
@@ -1,29 +0,0 @@
1
- module ClassTemplate
2
- attr_accessor :response_body
3
-
4
- def initialize
5
- @config = ConfigMap.file self.class.name
6
- prepare_request
7
- prepare_response
8
- end
9
-
10
- def prepare_request
11
- prepare_request_url
12
- prepare_request_query
13
- prepare_request_body
14
- end
15
-
16
- def prepare_request_url
17
- generate_methods_to_alter_path_params
18
- @type = @config.request.type
19
- end
20
-
21
- def prepare_request_query
22
- generate_query_methods if @config.request.query.present?
23
- end
24
-
25
- def prepare_request_body
26
- generate_request_methods if @config.request.body.present?
27
- end
28
-
29
- end
@@ -1,29 +0,0 @@
1
- module ClassTemplate
2
- def build
3
- build_url
4
- build_query
5
- build_request_body
6
- build_response_body
7
- end
8
-
9
- def build_url
10
- remove_path_param_name_from_url
11
- @stub = stub_request(@type, "http://#{@config.request.domain}/#{@url}")
12
- end
13
-
14
- def build_query
15
- @stub.with(:query => @query) unless @query.eql? ""
16
- end
17
-
18
- def build_request_body
19
- return if @request_body.blank?
20
- @request_body = Parse.hash_to_concatenated_key_value(@request_body) if @config.request.is_body_key_value
21
- @stub.with(:body => @request_body)
22
- end
23
-
24
- def build_response_body
25
- @response_body = Parse.hash_array_to_column_hash(@response_body) if @config.response.is_column_array
26
- @stub.to_return(:status => 200, :body => @response_body.to_json, :headers => {'Content-Type' => 'application/json'})
27
- end
28
- end
29
-
@@ -1,11 +0,0 @@
1
- module ClassTemplate
2
- def generate_query_methods
3
- @query = @config.request.query
4
- @query.each do |field|
5
- define_singleton_method("for_#{field[0]}") do |*value|
6
- @query[field[0]] = value[0]
7
- self
8
- end
9
- end
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- module ClassTemplate
2
- def generate_request_methods
3
- @request_body = @config.request.body.deep_dup
4
- return if @request_body.nil?
5
- @request_body.each do |field|
6
- field_name = field[0]
7
- define_singleton_method("by_#{field[0].underscore}") do |*value|
8
- @request_body[field_name] = value[0]
9
- self
10
- end
11
- end
12
- @request_body = {} if @config.request.include_explicit_only
13
- end
14
- end
@@ -1,27 +0,0 @@
1
- module ClassTemplate
2
- def generate_methods_to_alter_path_params
3
- @url = @config.request.url.clone
4
- @url.strip!
5
- @url.sub!("/","") if @url[0].eql? "/"
6
- @url.scan(/{(.+?)}/).each do |path_params|
7
- path_param = path_params[0]
8
- param_name = path_param.split("|")[0]
9
- param_default_value = path_param.split("|")[1]
10
- method_name = "for_#{param_name.underscore}"
11
- define_singleton_method(method_name) do |*input_value|
12
- input_value = input_value[0]
13
- @url = @url.sub("{#{path_param}}","{#{param_name}|#{input_value}}") unless input_value.blank?
14
- self
15
- end
16
- end
17
- end
18
-
19
- def remove_path_param_name_from_url
20
- @url.scan(/{(.+?)}/).each do |path_params|
21
- path_param = path_params[0]
22
- param_name = path_param.split("|")[0]
23
- param_value = path_param.split("|")[1]
24
- @url.sub!("{#{path_param}}",param_value)
25
- end
26
- end
27
- end