tshield 0.0.1.1

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
+ SHA1:
3
+ metadata.gz: 1931f4eb396f51ee1d67346b6b777d8b849bc08c
4
+ data.tar.gz: f6dc3dd79275e3d70e7825b45992b997789c48cb
5
+ SHA512:
6
+ metadata.gz: 0e9a71e00555c0b8ba4a05c2c6284d0adf74b4cae34b98a0018430e8f5327be7138b550ba9825874f089d0ca37c4235b4fce6a59f063f15f8a8a98b4ff622edb
7
+ data.tar.gz: cd4e178f54f946aad64fb6dd50e9b9d42223c2ec41aef610cff97609c85812558c1d1f5402232c656bc2e079373c267e76a046582b643fcae27fbb998d651276
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
data/README.md ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'TShield'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ Bundler::GemHelper.install_tasks
18
+
19
+ require 'rspec/core'
20
+ require 'rspec/core/rake_task'
21
+ desc "Run all specs in spec directory (excluding plugin specs)"
22
+ RSpec::Core::RakeTask.new
23
+
24
+ task :default => :spec
25
+
data/bin/tshield ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'tshield'
4
+
5
+ TShield::Server.run!
6
+
data/lib/tshield.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'tshield/server'
2
+
3
+ module TShield
4
+ end
5
+
@@ -0,0 +1,33 @@
1
+ module TShield
2
+ class Configuration
3
+
4
+ attr_accessor :domains
5
+
6
+ def initialize(attributes)
7
+ attributes.each do |key, value|
8
+ send("#{key}=", value)
9
+ end
10
+ end
11
+
12
+ def self.singleton
13
+ @@configuration ||= load_configuration
14
+ end
15
+
16
+ def get_domain_for(path)
17
+ domains.each do |url, paths|
18
+ return url if paths.include?(path)
19
+ end
20
+ nil
21
+ end
22
+
23
+ private
24
+ def self.load_configuration
25
+ config_path = File.join('config', 'tshield.yml')
26
+ file = File.open(config_path)
27
+ configs = YAML::load(file.read)
28
+ Configuration.new(configs)
29
+ end
30
+
31
+ end
32
+ end
33
+
@@ -0,0 +1,29 @@
1
+ module TShield
2
+ class Counter
3
+
4
+ attr_reader :sessions
5
+
6
+ def initialize
7
+ @sessions = {}
8
+ end
9
+
10
+ def add(from, key)
11
+ requests = @sessions.fetch(from, {})
12
+ requests[key] ||= 0
13
+ requests[key] += 1
14
+ @sessions[from] = requests
15
+ end
16
+
17
+ def self.singleton
18
+ @@counter ||= init
19
+ end
20
+
21
+ private
22
+ def self.init
23
+ counter = Counter.new
24
+ counter
25
+ end
26
+
27
+ end
28
+ end
29
+
@@ -0,0 +1,88 @@
1
+ require 'httparty'
2
+ require 'json'
3
+ require 'digest/sha1'
4
+
5
+ require 'tshield/configuration'
6
+ require 'tshield/counter'
7
+ require 'tshield/response'
8
+
9
+ module TShield
10
+
11
+ class Request
12
+
13
+ attr_reader :response
14
+
15
+ def initialize(path, options = {})
16
+ @path = path
17
+ @options = options
18
+ @configuration = TShield::Configuration.singleton
19
+ @counter = TShield::Counter.singleton
20
+ request
21
+ end
22
+
23
+ def request
24
+ @url = "#{@configuration.get_domain_for(@path)}/#{@path}"
25
+
26
+ if exists
27
+ @response = get_current_response
28
+ else
29
+ raw = HTTParty.send("#{method}", @url, @options)
30
+ save(raw)
31
+ @response = TShield::Response.new(raw.body, raw.header)
32
+ end
33
+ end
34
+
35
+ private
36
+ def method
37
+ @options[:method].downcase
38
+ end
39
+
40
+ def save(raw_response)
41
+ content << {body: raw_response.body}
42
+ write(content)
43
+
44
+ content
45
+ end
46
+
47
+ def content
48
+ return @content if @content
49
+ @content = []
50
+ if exists
51
+ @content = JSON.parse(File.open(destiny).read)
52
+ end
53
+ @content
54
+ end
55
+
56
+ def exists
57
+ File.exists?(destiny) && include_current_response?
58
+ end
59
+
60
+ def include_current_response?
61
+ true
62
+ end
63
+
64
+ def get_current_response
65
+ current = content[0]
66
+ TShield::Response.new(current['body'], current['header'])
67
+ end
68
+
69
+ def key
70
+ @key ||= Digest::SHA1.hexdigest "#{@url}|#{method}"
71
+ end
72
+
73
+ def destiny
74
+ destiny_path = File.join('requests')
75
+ Dir.mkdir('requests') unless File.exists?(destiny_path)
76
+ File.join(destiny_path, key)
77
+ end
78
+
79
+ def write(content)
80
+ f = File.open(destiny, 'w')
81
+ f.write(content.to_json)
82
+ f.close
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
@@ -0,0 +1,10 @@
1
+ module TShield
2
+ class Response
3
+ attr_accessor :body, :headers
4
+
5
+ def initialize(body, headers)
6
+ @body = body
7
+ @headers = headers
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+
3
+ require 'sinatra'
4
+
5
+ require 'tshield/request'
6
+
7
+ module TShield
8
+ class Server < Sinatra::Base
9
+
10
+ configure :production, :development do
11
+ enable :logging
12
+ end
13
+
14
+ PATHP = /([a-zA-Z\/\.-]+)/
15
+
16
+ get (PATHP) do
17
+ treat(params, request)
18
+ end
19
+
20
+ post (PATHP) do
21
+ treat(params, request)
22
+ end
23
+
24
+ put (PATHP) do
25
+ treat(params, request)
26
+ end
27
+
28
+ patch (PATHP) do
29
+ treat(params, request)
30
+ end
31
+
32
+ head (PATHP) do
33
+ treat(params, request)
34
+ end
35
+
36
+ private
37
+ def treat(params, request)
38
+
39
+ method = request.request_method
40
+ request_content_type = request.content_type
41
+ path = params.fetch('captures', [])[0]
42
+
43
+ headers = {
44
+ 'Content-Type' => request.content_type
45
+ }
46
+
47
+ options = {
48
+ method: method,
49
+ headers: headers
50
+ }
51
+
52
+ if ['POST', 'PUT', 'PATCH'].include? method
53
+ result = request.body.read.encode('UTF-8', {
54
+ :invalid => :replace,
55
+ :undef => :replace,
56
+ :replace => ''
57
+ })
58
+ options[:body] = result
59
+ end
60
+
61
+ logger.info(
62
+ "method=#{method} path=#{path} content-type=#{request_content_type}")
63
+
64
+ set_content_type content_type
65
+ response = TShield::Request.new(path, options).response
66
+ response.body
67
+ end
68
+
69
+ def set_content_type(request_content_type)
70
+ content_type :json
71
+ end
72
+
73
+ end
74
+ end
75
+
@@ -0,0 +1,15 @@
1
+ module TShield
2
+ class Version
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ PATCH = 1
6
+ PRE = 1
7
+
8
+ class << self
9
+ def to_s
10
+ [MAJOR, MINOR, PATCH, PRE].compact.join('.')
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,18 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'simplecov'
5
+ SimpleCov.start
6
+
7
+ require 'httparty'
8
+ require 'tshield'
9
+
10
+ require 'webmock/rspec'
11
+
12
+ RSpec.configure do |config|
13
+
14
+ config.before(:each) do
15
+ end
16
+
17
+ end
18
+
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe TShield::Configuration do
4
+ before :each do
5
+ allow(File).to(
6
+ receive(:join).and_return('spec/tshield/fixtures/config/tshield.yml'))
7
+ @configuration = TShield::Configuration.singleton
8
+ end
9
+
10
+ describe 'load configurations from yaml' do
11
+ it 'recover domains' do
12
+ expect(@configuration.domains['example.org']).to(
13
+ include('/api/one', '/api/two'))
14
+ end
15
+ end
16
+
17
+ describe 'get_domain_for' do
18
+ it 'return domain for example.org' do
19
+ expect(@configuration.get_domain_for('/api/two')).to eq('example.org')
20
+ end
21
+
22
+ it 'return domain for example.com' do
23
+ expect(@configuration.get_domain_for('/api/three')).to eq('example.com')
24
+ end
25
+
26
+ it 'return nil if domain not found' do
27
+ expect(@configuration.get_domain_for('/api/four')).to be_nil
28
+ end
29
+ end
30
+
31
+ end
32
+
@@ -0,0 +1,7 @@
1
+ domains:
2
+ 'example.org':
3
+ - '/api/one'
4
+ - '/api/two'
5
+ 'example.com':
6
+ - '/api/three'
7
+
data/tshield.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "tshield/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "tshield"
7
+ s.version = TShield::Version
8
+ s.platform = Gem::Platform::RUBY
9
+ s.licenses = ["MIT"]
10
+ s.summary = "Proxy for mocks API responses"
11
+ s.email = "rubin.diego@gmail.com"
12
+ s.homepage = "https://github.com/diegorubin/tshield"
13
+ s.description = "Proxy for mocks API responses"
14
+ s.authors = ['Diego Rubin']
15
+
16
+ s.files = Dir["{app,config,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.md"]
17
+ s.files += %w(Gemfile README.md)
18
+ s.files << "tshield.gemspec"
19
+
20
+ s.executables << 'tshield'
21
+
22
+ s.test_files = Dir["spec/**/*"]
23
+
24
+ s.add_dependency("httparty", "~> 0.14", ">= 0.14.0")
25
+ s.add_dependency("sinatra", "~> 1.4", ">= 1.4.0")
26
+ s.add_dependency("json", "~> 2.0", ">= 2.0")
27
+ s.add_development_dependency("rspec", "~> 3.5", ">= 3.5.0")
28
+ s.add_development_dependency("webmock", "~> 2.1", ">= 2.1.0")
29
+ s.add_development_dependency("simplecov", "~> 0.12", ">= 0.12.0")
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tshield
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Diego Rubin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.14'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.14.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.14'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.14.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: sinatra
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.4'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.4.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.4'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.4.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: json
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '2.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '2.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: rspec
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '3.5'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.5.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.5'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 3.5.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: webmock
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '2.1'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 2.1.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.1'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 2.1.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: simplecov
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.12'
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: 0.12.0
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '0.12'
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 0.12.0
133
+ description: Proxy for mocks API responses
134
+ email: rubin.diego@gmail.com
135
+ executables:
136
+ - tshield
137
+ extensions: []
138
+ extra_rdoc_files: []
139
+ files:
140
+ - Gemfile
141
+ - README.md
142
+ - Rakefile
143
+ - bin/tshield
144
+ - lib/tshield.rb
145
+ - lib/tshield/configuration.rb
146
+ - lib/tshield/counter.rb
147
+ - lib/tshield/request.rb
148
+ - lib/tshield/response.rb
149
+ - lib/tshield/server.rb
150
+ - lib/tshield/version.rb
151
+ - spec/spec_helper.rb
152
+ - spec/tshield/configuration_spec.rb
153
+ - spec/tshield/fixtures/config/tshield.yml
154
+ - tshield.gemspec
155
+ homepage: https://github.com/diegorubin/tshield
156
+ licenses:
157
+ - MIT
158
+ metadata: {}
159
+ post_install_message:
160
+ rdoc_options: []
161
+ require_paths:
162
+ - lib
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ requirements: []
174
+ rubyforge_project:
175
+ rubygems_version: 2.4.8
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: Proxy for mocks API responses
179
+ test_files:
180
+ - spec/spec_helper.rb
181
+ - spec/tshield/configuration_spec.rb
182
+ - spec/tshield/fixtures/config/tshield.yml