tshield 0.0.1.1

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 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