tshield 0.13.5.0 → 0.15.0.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: ab5c5057fe81ae295f572912c6955ce0ea0bd9be6b42fb515a7832fe3451459a
4
- data.tar.gz: 9c785dc23adb245fdfcc416698c551f7a45eaa32b5892a2cabea708f16fa2859
3
+ metadata.gz: 3675ad22a08350950eadbc2000d89be8dbcf44acc9a4487d1b8c3a59bae3dcd1
4
+ data.tar.gz: c15c0f0d52cf43de37744efcc418932c83db271ba38a50b4ce72df7cd708e65b
5
5
  SHA512:
6
- metadata.gz: 58fd33ddf9e466af5882e6522612b2b0fa05c95f728578fe50b014dca0777357bf5ccfa17605a86309c5742cb828dd2e52eb9bb2839096f594e1e75fef80e81b
7
- data.tar.gz: f085f1dcc7a3d861da1b28a0d07f3338f03dd5b27cdd234c283cecf0bce8a0dc66f26193755ea8f5b442cbf4953fb2bd4ce295f90257b76121ac7fdbcbdd38b0
6
+ metadata.gz: 0b9b08892d5f9843a5cc2fd2db34a0d160126104a83a83ad1d9f4b041b83d9acd5d773ea8645539f16dbf046d85fb54ee2a0a92b963f87f954b88a3ca9656f39
7
+ data.tar.gz: 6300ebfca1c90b7e11a19d2facc3e5cc855db320ffe352b49326a6e20d9f73f401d3e6c4a1f6f3f2c6ba5a01a7c8a2426c1108ce20a2009d6be05c8c484ae9be
data/README.md CHANGED
@@ -3,8 +3,6 @@ TShield
3
3
 
4
4
  [![Build Status](https://travis-ci.org/diegorubin/tshield.svg)](https://travis-ci.org/diegorubin/tshield)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/diegorubin/tshield/badge.svg?branch=master)](https://coveralls.io/github/diegorubin/tshield?branch=master)
6
- [![SourceLevel](https://app.sourcelevel.io/github/diegorubin/-/tshield.svg)](https://app.sourcelevel.io/github/diegorubin/-/tshield)
7
- [![Join the chat at https://gitter.im/diegorubin/tshield](https://badges.gitter.im/diegorubin/tshield.svg)](https://gitter.im/diegorubin/tshield?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
8
6
  [![Gem Version](https://badge.fury.io/rb/tshield.svg)](https://badge.fury.io/rb/tshield)
9
7
  ![TShield Publish](https://github.com/diegorubin/tshield/workflows/TShield%20Publish/badge.svg)
10
8
 
data/config/tshield.yml CHANGED
@@ -1,16 +1,16 @@
1
1
  ---
2
2
  grpc:
3
3
  port: 5678
4
- proto_dir: 'proto'
4
+ proto_dir: "proto"
5
5
  services:
6
- 'helloworld_services_pb':
7
- module: 'Helloworld::Greeter'
8
- hostname: '0.0.0.0:50051'
6
+ "helloworld_services_pb":
7
+ module: "Helloworld::Greeter"
8
+ hostname: "0.0.0.0:50051"
9
9
  request:
10
10
  timeout: 10
11
11
  domains:
12
- 'http://localhost:9090':
13
- name: 'components'
12
+ "http://localhost:9090":
13
+ name: "components"
14
14
  skip_query_params:
15
15
  - b
16
16
  paths:
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'yaml'
4
4
 
5
+ require 'tshield/errors'
5
6
  require 'tshield/after_filter'
6
7
  require 'tshield/before_filter'
7
8
  require 'tshield/options'
@@ -29,10 +30,7 @@ module TShield
29
30
  # generated directory
30
31
  #
31
32
  attr_reader :request
32
- attr_reader :domains
33
- attr_reader :tcp_servers
34
- attr_reader :session_path
35
- attr_reader :windows_compatibility
33
+ attr_reader :domains, :tcp_servers, :session_path, :windows_compatibility
36
34
 
37
35
  def initialize(attributes)
38
36
  attributes.each { |key, value| instance_variable_set("@#{key}", value) }
@@ -62,7 +60,7 @@ module TShield
62
60
  result = self.class.get_url_for_domain_by_path(path, config)
63
61
  return url if result
64
62
  end
65
- nil
63
+ raise ConfigurationNotFoundError.new("Domain not found for path #{path}")
66
64
  end
67
65
 
68
66
  def windows_compatibility?
@@ -92,8 +90,12 @@ module TShield
92
90
  end
93
91
 
94
92
  def get_filters(domain)
95
- (domains[domain]['filters'] || [])
96
- .collect { |filter| Class.const_get(filter) }
93
+ begin
94
+ (domains[domain]['filters'] || [])
95
+ .collect { |filter| Class.const_get(filter) }
96
+ rescue
97
+ puts "Error loading filters for domain #{domain}"
98
+ end
97
99
  end
98
100
 
99
101
  def get_excluded_headers(domain)
@@ -106,6 +108,7 @@ module TShield
106
108
 
107
109
  def send_header_content_type(domain)
108
110
  return domains[domain]['send_header_content_type'] != false if domains[domain]
111
+
109
112
  true
110
113
  end
111
114
 
@@ -140,6 +143,5 @@ module TShield
140
143
  def get_delay(domain, path)
141
144
  ((domains[domain] || {})['delay'] || {})[path] || 0
142
145
  end
143
-
144
146
  end
145
147
  end
@@ -57,8 +57,6 @@ module TShield
57
57
  ip: request.ip
58
58
  }
59
59
 
60
- treat_headers_by_domain(options, path)
61
-
62
60
  if %w[POST PUT PATCH].include? method
63
61
  result = request.body.read.encode('UTF-8',
64
62
  invalid: :replace,
@@ -67,13 +65,21 @@ module TShield
67
65
  options[:body] = result
68
66
  end
69
67
  api_response = TShield::RequestMatching.new(path, options.clone).match_request
70
-
71
68
  unless api_response
72
- add_headers(options, path)
73
-
74
- api_response ||= TShield::RequestVCR.new(path, options.clone).vcr_response
75
- api_response.headers.reject! do |key, _v|
76
- configuration.get_excluded_headers(domain(path)).include?(key)
69
+ begin
70
+ treat_headers_by_domain(options, path)
71
+ add_headers(options, path)
72
+
73
+ api_response ||= TShield::RequestVCR.new(path, options.clone).vcr_response
74
+ api_response.headers.reject! do |key, _v|
75
+ configuration.get_excluded_headers(domain(path)).include?(key)
76
+ end
77
+ rescue ConfigurationNotFoundError => e
78
+ logger.error("Error on recover configuration for #{path}")
79
+
80
+ status 500
81
+ body({tshield: e }.to_json)
82
+ return
77
83
  end
78
84
  end
79
85
 
@@ -110,11 +116,14 @@ module TShield
110
116
  end
111
117
 
112
118
  def delay(path)
113
- delay_in_seconds = configuration.get_delay(domain(path), path) || 0
114
- logger.info("Response with delay of #{delay_in_seconds} seconds")
115
- sleep delay_in_seconds
119
+ begin
120
+ delay_in_seconds = configuration.get_delay(domain(path), path) || 0
121
+ logger.info("Response with delay of #{delay_in_seconds} seconds")
122
+ sleep delay_in_seconds
123
+ rescue ConfigurationNotFoundError
124
+ logger.debug('No delay configured')
125
+ end
116
126
  end
117
-
118
127
  end
119
128
  end
120
129
  end
@@ -2,3 +2,7 @@
2
2
 
3
3
  class AppendSessionWithoutMainSessionError < RuntimeError
4
4
  end
5
+
6
+ class ConfigurationNotFoundError < RuntimeError
7
+ end
8
+
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TShield
4
+ # Increment counter for sessions requests
5
+ class GrpcCounter
6
+ def initialize
7
+ @requests = {}
8
+ end
9
+
10
+ def add(hexdigest)
11
+ count = @requests.fetch(hexdigest, 0)
12
+ count += 1
13
+ @requests[hexdigest] = count
14
+ end
15
+
16
+ def current(hexdigest)
17
+ @requests.fetch(hexdigest, 0)
18
+ end
19
+
20
+ def to_json(options = {})
21
+ @requests.to_json(options)
22
+ end
23
+ end
24
+ end
@@ -5,79 +5,127 @@ require 'tshield/sessions'
5
5
 
6
6
  module TShield
7
7
  module Grpc
8
+ # Grpc vcr module
8
9
  module VCR
10
+ # Path file to save Grpc request/response
11
+ class FilePath
12
+ attr_reader :path, :count
13
+
14
+ def initialize(path, count)
15
+ @path = path
16
+ @count = count
17
+ end
18
+ end
19
+
9
20
  def initialize
10
21
  @configuration = TShield::Configuration.singleton
11
22
  end
23
+
12
24
  def handler_in_vcr_mode(method_name, request, parameters, options)
13
25
  parameters.peer =~ /ipv6:\[(.+?)\]|ipv4:(.+?):/
14
26
  peer = Regexp.last_match(1) || Regexp.last_match(2)
15
27
 
16
28
  TShield.logger.info("request from #{parameters.peer}")
17
29
  @session = TShield::Sessions.current(peer)
30
+ @digest = hexdigest(request)
31
+ counter = @session ? request_count.current(@digest) : 0
18
32
 
19
33
  TShield.logger.info("grpc using session #{@session || 'default'}")
20
34
  module_name = options['module']
21
35
 
22
- path = create_destiny(module_name, method_name, request)
23
- save_request(path, request)
24
- response = saved_response(path)
25
- if response
26
- TShield.logger.info("returning saved response for request #{request.to_json} saved into #{hexdigest(request)}")
27
- return response
36
+ path = create_destiny(module_name, method_name)
37
+ @file_path = FilePath.new(path, counter)
38
+ save_request(request)
39
+ response = {}
40
+ saved_error
41
+ begin
42
+ response = saved_response
43
+ if response
44
+ TShield.logger.info("returning saved response for request #{request.to_json} saved into #{@digest}")
45
+ request_count.add(@digest) if @session
46
+ return response
47
+ end
48
+
49
+ response = send_request(request, module_name, options, method_name)
50
+ save_response(response)
51
+ rescue GRPC::BadStatus => e
52
+ save_error({ code: e.code, details: e.details })
53
+ raise e
28
54
  end
55
+ request_count.add(@digest) if @session
56
+ response
57
+ end
29
58
 
59
+ def send_request(request, module_name, options, method_name)
30
60
  TShield.logger.info("calling server to get response for #{request.to_json}")
31
61
  client_class = Object.const_get("#{module_name}::Stub")
32
62
  client_instance = client_class.new(options['hostname'], :this_channel_is_insecure)
33
- response = client_instance.send(method_name, request)
34
- save_response(path, response)
35
- response
63
+ client_instance.send(method_name, request)
64
+ end
65
+
66
+ def request_count
67
+ @session[:grpc_counter]
36
68
  end
37
69
 
38
70
  def encode_colon(value)
39
- value.gsub(':','%3a')
71
+ value.gsub(':', '%3a')
40
72
  end
41
73
 
42
- def saved_response(path)
43
- response_file = File.join(path, 'response')
74
+ def saved_response
75
+ response_file = File.join(@file_path.path, "#{@file_path.count}.response")
44
76
  return false unless File.exist? response_file
45
77
 
46
78
  content = JSON.parse File.open(response_file).read
47
- response_class = File.open(File.join(path, 'response_class')).read.strip
79
+ response_class = File.open(File.join(@file_path.path, "#{@file_path.count}.response_class")).read.strip
48
80
  Kernel.const_get(response_class).new(content)
49
81
  end
50
82
 
51
- def save_request(path, request)
52
- file = File.open(File.join(path, 'original_request'), 'w')
83
+ def saved_error
84
+ error_file = File.join(@file_path.path, "#{@file_path.count}.error")
85
+ return false unless File.exist? error_file
86
+
87
+ request_count.add(@digest) if @session
88
+ content = JSON.parse File.open(error_file).read
89
+ grpc_error = GRPC::BadStatus.new(content['code'], content['details'])
90
+ raise grpc_error
91
+ end
92
+
93
+ def save_request(request)
94
+ file = File.open(File.join(@file_path.path, "#{@file_path.count}.original_request"), 'w')
53
95
  file.puts request.to_json
54
96
  file.close
55
97
  end
56
98
 
57
- def save_response(path, response)
58
- file = File.open(File.join(path, 'response'), 'w')
99
+ def save_error(error)
100
+ file = File.open(File.join(@file_path.path, "#{@file_path.count}.error"), 'w')
101
+ file.puts error.to_json
102
+ file.close
103
+ request_count.add(@digest) if @session
104
+ end
105
+
106
+ def save_response(response)
107
+ file = File.open(File.join(@file_path.path, "#{@file_path.count}.response"), 'w')
59
108
  file.puts response.to_json
60
109
  file.close
61
110
 
62
- response_class = File.open(File.join(path, 'response_class'), 'w')
111
+ response_class = File.open(File.join(@file_path.path, "#{@file_path.count}.response_class"), 'w')
63
112
  response_class.puts response.class.to_s
64
113
  response_class.close
65
114
  end
66
115
 
67
- def complete_path(module_name, method_name, request)
116
+ def complete_path(module_name, method_name)
68
117
  @session_name = (@session || {})[:name]
69
118
  module_name = @configuration.windows_compatibility? ? encode_colon(module_name) : module_name
70
- path = ['requests', 'grpc', @session_name, module_name, method_name.to_s, hexdigest(request)].compact
71
- path
119
+ ['requests', @session_name, module_name, method_name.to_s, @digest].compact
72
120
  end
73
121
 
74
- def create_destiny(module_name, method_name, request)
122
+ def create_destiny(module_name, method_name)
75
123
  current_path = []
76
124
 
77
- path = complete_path(module_name, method_name, request)
125
+ path = complete_path(module_name, method_name)
78
126
  TShield.logger.info("using path #{path}")
79
- path.each do |path|
80
- current_path << path
127
+ path.each do |inner_path|
128
+ current_path << inner_path
81
129
  destiny = File.join current_path
82
130
  Dir.mkdir destiny unless File.exist? destiny
83
131
  end
data/lib/tshield/grpc.rb CHANGED
@@ -4,7 +4,6 @@ require 'grpc'
4
4
 
5
5
  require 'tshield/configuration'
6
6
  require 'tshield/grpc/vcr'
7
-
8
7
  module TShield
9
8
  module Grpc
10
9
  module RequestHandler
@@ -14,6 +13,7 @@ module TShield
14
13
  handler_in_vcr_mode(method_name, request, parameters, options)
15
14
  end
16
15
  end
16
+
17
17
  def self.run!
18
18
  @configuration = TShield::Configuration.singleton.grpc
19
19
 
@@ -41,6 +41,7 @@ module TShield
41
41
  handlers = []
42
42
  number_of_handlers = 0
43
43
  services.each do |file, options|
44
+
44
45
  require file
45
46
 
46
47
  base = Object.const_get("#{options['module']}::Service")
@@ -55,8 +56,7 @@ module TShield
55
56
  def self.build_handler(base, descriptions, number_of_handlers, options)
56
57
  handler = Class.new(base) do
57
58
  class << self
58
- attr_writer :options
59
- attr_reader :options
59
+ attr_accessor :options
60
60
  end
61
61
  descriptions.each do |service_name, description|
62
62
  puts description
@@ -5,6 +5,6 @@ require 'logger'
5
5
  # Logger instance for application
6
6
  module TShield
7
7
  def self.logger
8
- @logger ||= Logger.new(STDOUT)
8
+ @logger ||= Logger.new($stdout)
9
9
  end
10
10
  end
@@ -79,7 +79,6 @@ module TShield
79
79
  end
80
80
 
81
81
  def apply_set_cookie_header_values(raw_response, headers = {})
82
-
83
82
  headers_clone = headers.clone
84
83
 
85
84
  field = raw_response.get_fields('Set-Cookie')
@@ -98,6 +97,7 @@ module TShield
98
97
 
99
98
  raw_response.headers.each do |k, v|
100
99
  next if k == 'set-cookie'
100
+
101
101
  headers[k] = v unless configuration.not_save_headers(domain).include? k
102
102
  end
103
103
 
@@ -156,9 +156,10 @@ module TShield
156
156
  end
157
157
 
158
158
  def encode_for_windows_dir(directory)
159
- replace = [['<','%3c'],['>','%3e'],[':','%3a'],['"','%22'],['?','%3f'],[' ','%20'],['*','%2a'],['/','%2f']]
159
+ replace = [['<', '%3c'], ['>', '%3e'], [':', '%3a'], ['"', '%22'], ['?', '%3f'], [' ', '%20'], ['*', '%2a'],
160
+ ['/', '%2f']]
160
161
  replace.each do |value|
161
- directory = directory.gsub(value.first,value.last)
162
+ directory = directory.gsub(value.first, value.last)
162
163
  end
163
164
  directory
164
165
  end
@@ -171,7 +172,7 @@ module TShield
171
172
  else
172
173
  directory = url.gsub(%r{/}, '-').gsub(/^-/, '')
173
174
  end
174
- configuration.windows_compatibility? ? encode_for_windows_dir(directory) : directory
175
+ configuration.windows_compatibility? ? encode_for_windows_dir(directory) : directory
175
176
  end
176
177
  end
177
178
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'tshield/logger'
4
4
  require 'tshield/counter'
5
+ require 'tshield/grpc/grpc_counter'
5
6
  require 'tshield/errors'
6
7
 
7
8
  module TShield
@@ -14,6 +15,7 @@ module TShield
14
15
  sessions[normalize_ip(ip)] = {
15
16
  name: name,
16
17
  counter: TShield::Counter.new,
18
+ grpc_counter: TShield::GrpcCounter.new,
17
19
  secondary_sessions: []
18
20
  }
19
21
  end
@@ -4,8 +4,8 @@ module TShield
4
4
  # Control version of gem
5
5
  class Version
6
6
  MAJOR = 0
7
- MINOR = 13
8
- PATCH = 5
7
+ MINOR = 15
8
+ PATCH = 0
9
9
  PRE = 0
10
10
 
11
11
  class << self
@@ -61,13 +61,13 @@ describe TShield::Configuration do
61
61
  end
62
62
 
63
63
  it 'return nil if domain not found' do
64
- expect(@configuration.get_domain_for('/api/four')).to be_nil
64
+ expect{@configuration.get_domain_for('/api/four')}.to raise_error(ConfigurationNotFoundError)
65
65
  end
66
66
  end
67
67
 
68
68
  describe 'SO compatibility' do
69
69
  it 'should be compatible with windows when configuration is true' do
70
- allow(YAML).to receive(:safe_load).and_return({:windows_compatibility => true })
70
+ allow(YAML).to receive(:safe_load).and_return({ windows_compatibility: true })
71
71
  TShield::Configuration.clear
72
72
  @configuration = TShield::Configuration.singleton
73
73
 
@@ -75,7 +75,7 @@ describe TShield::Configuration do
75
75
  end
76
76
 
77
77
  it 'should be compatible with Unix when configuration is false' do
78
- allow(YAML).to receive(:safe_load).and_return({:windows_compatibility => false })
78
+ allow(YAML).to receive(:safe_load).and_return({ windows_compatibility: false })
79
79
  TShield::Configuration.clear
80
80
  @configuration = TShield::Configuration.singleton
81
81
 
@@ -89,7 +89,6 @@ describe TShield::Configuration do
89
89
 
90
90
  expect(@configuration.windows_compatibility?).to eq(false)
91
91
  end
92
-
93
92
  end
94
93
  end
95
94
  context 'on config not exist' do
@@ -47,6 +47,7 @@ describe TShield::Controllers::Requests do
47
47
  allow(matched_response).to receive(:headers).and_return({})
48
48
  allow(matched_response).to receive(:body).and_return('')
49
49
  allow(@mock_logger).to receive(:info)
50
+ allow(@mock_logger).to receive(:debug)
50
51
 
51
52
  expect(TShield::Controllers::Helpers::SessionHelpers)
52
53
  .to receive(:current_session_call).with(request, '/?a=b', 'GET')
@@ -73,7 +74,6 @@ describe TShield::Controllers::Requests do
73
74
  allow(@configuration).to receive(:get_domain_for).and_return('example.org')
74
75
  allow(@configuration).to receive(:get_delay).and_return(0)
75
76
 
76
-
77
77
  allow(TShield::Options).to receive_message_chain(:instance, :break?)
78
78
  @mock_logger = double
79
79
  @controller = MockController.new(@mock_logger)
@@ -100,15 +100,15 @@ describe TShield::Controllers::Requests do
100
100
  allow(matched_response).to receive(:body).and_return('')
101
101
  allow(@mock_logger).to receive(:info)
102
102
 
103
- expect(TShield::RequestVCR).to receive(:new).with("/",{
104
- call: 0,
105
- headers: {},
106
- ip: "0.0.0.0",
107
- method: "GET",
108
- raw_query: "a=b",
109
- secondary_sessions: nil,
110
- session: nil
111
- })
103
+ expect(TShield::RequestVCR).to receive(:new).with('/', {
104
+ call: 0,
105
+ headers: {},
106
+ ip: '0.0.0.0',
107
+ method: 'GET',
108
+ raw_query: 'a=b',
109
+ secondary_sessions: nil,
110
+ session: nil
111
+ })
112
112
  @controller.treat(params, request, nil)
113
113
  end
114
114
  end
@@ -135,16 +135,15 @@ describe TShield::Controllers::Requests do
135
135
  allow(matched_response).to receive(:body).and_return('')
136
136
  allow(@mock_logger).to receive(:info)
137
137
 
138
- expect(TShield::RequestVCR).to receive(:new).with("/",{
139
- call: 0,
140
- headers: {'Content-Type' => 'application/json'},
141
- ip: "0.0.0.0",
142
- method: "GET",
143
- raw_query: "a=b",
144
- secondary_sessions: nil,
145
- session: nil
146
- })
147
-
138
+ expect(TShield::RequestVCR).to receive(:new).with('/', {
139
+ call: 0,
140
+ headers: { 'Content-Type' => 'application/json' },
141
+ ip: '0.0.0.0',
142
+ method: 'GET',
143
+ raw_query: 'a=b',
144
+ secondary_sessions: nil,
145
+ session: nil
146
+ })
148
147
 
149
148
  @controller.treat(params, request, nil)
150
149
  end
@@ -107,9 +107,9 @@ describe TShield::RequestVCR do
107
107
 
108
108
  it 'should create response directory in windows standard' do
109
109
  allow(@configuration).to receive(:domains).and_return(
110
- 'example.org' => {
111
- 'skip_query_params' => []
112
- }
110
+ 'example.org' => {
111
+ 'skip_query_params' => []
112
+ }
113
113
  )
114
114
 
115
115
  allow(@configuration).to receive(:windows_compatibility?).and_return(true)
@@ -118,28 +118,28 @@ describe TShield::RequestVCR do
118
118
  file_double = double
119
119
 
120
120
  allow(File).to receive(:join)
121
- .with('./requests/example.org', '%3fparam=value')
122
- .and_return('./requests/example.org/%3fparam=value')
121
+ .with('./requests/example.org', '%3fparam=value')
122
+ .and_return('./requests/example.org/%3fparam=value')
123
123
  allow(File).to receive(:join)
124
- .with('./requests/example.org/%3fparam=value', 'get')
125
- .and_return('./requests/example.org/%3fparam=value/get')
124
+ .with('./requests/example.org/%3fparam=value', 'get')
125
+ .and_return('./requests/example.org/%3fparam=value/get')
126
126
  allow(File).to receive(:join)
127
- .with('./requests/example.org/%3fparam=value/get', '0')
128
- .and_return('./requests/example.org/%3fparam=value/get/0')
127
+ .with('./requests/example.org/%3fparam=value/get', '0')
128
+ .and_return('./requests/example.org/%3fparam=value/get/0')
129
129
 
130
130
  allow(file_double).to receive(:read).and_return('{}')
131
131
 
132
132
  expect(File).to receive('open')
133
- .with('./requests/example.org/%3fparam=value/get/0.content', 'w')
134
- .and_return(file_double)
133
+ .with('./requests/example.org/%3fparam=value/get/0.content', 'w')
134
+ .and_return(file_double)
135
135
 
136
136
  expect(File).to receive('open')
137
- .with('./requests/example.org/%3fparam=value/get/0.json', 'w')
138
- .and_return(file_double)
137
+ .with('./requests/example.org/%3fparam=value/get/0.json', 'w')
138
+ .and_return(file_double)
139
139
 
140
140
  expect(file_double).to receive(:write).ordered.with('this is the body')
141
141
  expect(file_double).to receive(:write)
142
- .with("{\n \"status\": 200,\n \"headers\": {\n }\n}")
142
+ .with("{\n \"status\": 200,\n \"headers\": {\n }\n}")
143
143
  expect(file_double).to receive(:close)
144
144
  expect(file_double).to receive(:close)
145
145
 
@@ -148,7 +148,6 @@ describe TShield::RequestVCR do
148
148
  method: 'GET',
149
149
  call: 0
150
150
  end
151
-
152
151
  end
153
152
  end
154
153
 
@@ -161,7 +160,7 @@ describe TShield::RequestVCR do
161
160
  'this is the body'
162
161
  end
163
162
 
164
- def get_fields(field = "")
163
+ def get_fields(_field = '')
165
164
  []
166
165
  end
167
166
 
@@ -172,22 +171,19 @@ describe TShield::RequestVCR do
172
171
 
173
172
  class RawResponseCookiesMultipleValues
174
173
  def headers
175
- {'Set-Cookie' => ['FirstCookie=An Value', 'SecondCookie=An Value']}
174
+ { 'Set-Cookie' => ['FirstCookie=An Value', 'SecondCookie=An Value'] }
176
175
  end
177
176
 
178
177
  def body
179
178
  'this is the body'
180
179
  end
181
180
 
182
- def get_fields(field = "")
183
- self.headers[filed] unless self.headers.key?(field)
181
+ def get_fields(field = '')
182
+ headers[filed] unless headers.key?(field)
184
183
  end
185
184
 
186
185
  def code
187
186
  200
188
187
  end
189
188
  end
190
-
191
189
  end
192
-
193
-
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tshield
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.5.0
4
+ version: 0.15.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Diego Rubin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-06-03 00:00:00.000000000 Z
12
+ date: 2023-10-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: grpc
@@ -415,6 +415,7 @@ files:
415
415
  - lib/tshield/errors.rb
416
416
  - lib/tshield/extensions/string_extensions.rb
417
417
  - lib/tshield/grpc.rb
418
+ - lib/tshield/grpc/grpc_counter.rb
418
419
  - lib/tshield/grpc/vcr.rb
419
420
  - lib/tshield/logger.rb
420
421
  - lib/tshield/matching/filters.rb
@@ -467,19 +468,19 @@ signing_key:
467
468
  specification_version: 4
468
469
  summary: Proxy for mocks API responses
469
470
  test_files:
471
+ - spec/spec_helper.rb
472
+ - spec/tshield/configuration_spec.rb
473
+ - spec/tshield/request_matching_spec.rb
474
+ - spec/tshield/sessions_spec.rb
470
475
  - spec/tshield/controllers/requests_spec.rb
476
+ - spec/tshield/request_vcr_spec.rb
477
+ - spec/tshield/grpc_spec.rb
478
+ - spec/tshield/options_spec.rb
471
479
  - spec/tshield/after_filter_spec.rb
472
- - spec/tshield/configuration_spec.rb
473
- - spec/tshield/fixtures/proto/test_services_pb.rb
474
480
  - spec/tshield/fixtures/config/tshield-without-grpc.yml
475
- - spec/tshield/fixtures/config/tshield-with-send-content-type-header_as_false.yml
476
481
  - spec/tshield/fixtures/config/tshield.yml
482
+ - spec/tshield/fixtures/config/tshield-with-send-content-type-header_as_false.yml
477
483
  - spec/tshield/fixtures/config/tshield-with-send-content-type-header.yml
478
484
  - spec/tshield/fixtures/matching/example.json
485
+ - spec/tshield/fixtures/proto/test_services_pb.rb
479
486
  - spec/tshield/fixtures/filters/example_filter.rb
480
- - spec/tshield/request_vcr_spec.rb
481
- - spec/tshield/sessions_spec.rb
482
- - spec/tshield/grpc_spec.rb
483
- - spec/tshield/options_spec.rb
484
- - spec/tshield/request_matching_spec.rb
485
- - spec/spec_helper.rb