aviator_session_pool 0.0.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 +15 -0
- data/.gitignore +22 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +13 -0
- data/Gemfile +17 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +97 -0
- data/Rakefile +9 -0
- data/lib/aviator/session_pool.rb +3 -0
- data/lib/aviator/session_pool/session_pool.rb +101 -0
- data/lib/aviator/session_pool/version.rb +5 -0
- data/lib/aviator_session_pool.rb +1 -0
- data/session_pool.gemspec +34 -0
- data/test/aviator/session_pool/session_pool_test.rb +225 -0
- data/test/support/aviator_session_mock.rb +38 -0
- data/test/support/test_base_class.rb +29 -0
- data/test/support/test_reporter.rb +47 -0
- data/test/test_helper.rb +33 -0
- metadata +239 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ODEwZWMwYmIxY2I5ODZkZmU3YTVhMmY3NTEwYmIyYTM4Yjg3OTJhMw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZjUxOTMzYzJhM2M4ZDBlNzIzZTg5MWFhMzlmZTU0ZWQ0YjU5ODA2ZQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NjQ2MDRmMjJjZGU1MTExNTg5ODdiMWYwNGVjMDAxMzlmODc5NDU2NTYwNzI1
|
10
|
+
YTIzNjcyNjliZDUxYWE4MjI1MmQ3ODI1YThlNDY1ZThjMTAyMzU0M2I3MzQ2
|
11
|
+
ZjllYzE2MzEzYjgwYjA5ZmE2MWJjNGFlMTgwZGY2ZjgzNTQ5NjU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDNmMjkyZGNhZjg0ZTZlYWE3MWRlOWUwZmJjMjE2MDg1Mjk3NzI4NmE5MzA1
|
14
|
+
ZmM4Y2E2ZWI3Yzg2ZDBkNjdkY2I1ZDNhM2Y2Y2RjMGMzZGI0ZWQ2NGI2NmVj
|
15
|
+
OTgzY2Q5ZTMyNjVlMGNkZTJkZDk5MjNmZmZlMmY4NmFmMzNmMzk=
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp/*.*
|
18
|
+
!tmp/.gitignore
|
19
|
+
.DS_Store
|
20
|
+
test/environment.yml
|
21
|
+
vcr.log
|
22
|
+
dump.rdb
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
aviator_session_pool
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p448
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in aviator.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
# Putting these gems in the test group so that
|
7
|
+
# we can tell travis-ci not to build any of the
|
8
|
+
# development gems. Makes the build run faster.
|
9
|
+
group :test do
|
10
|
+
gem 'rake'
|
11
|
+
gem 'simplecov', '~> 0.7.0'
|
12
|
+
gem 'coveralls', '~> 0.6.0'
|
13
|
+
gem 'json', '~> 1.7.0'
|
14
|
+
gem 'minitest', '~> 4.7.0'
|
15
|
+
gem 'minitest-reporters', '~> 0.14.20'
|
16
|
+
gem 'vcr', '~> 2.5.0'
|
17
|
+
end
|
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Mark Maglana, Alfonso Dillera
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
# Aviator Session Pool
|
2
|
+
|
3
|
+
Experimental library for managing [Aviator](http://aviator.github.io/www) sessions.
|
4
|
+
|
5
|
+
[](https://travis-ci.org/aviator/session_pool)
|
6
|
+
[](https://coveralls.io/r/aviator/session_pool)
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
require 'aviator'
|
10
|
+
require 'aviator/session_pool'
|
11
|
+
|
12
|
+
Aviator::SessionPool.configure(
|
13
|
+
config_file: 'path/to/aviator.yml',
|
14
|
+
environment: :production,
|
15
|
+
log_file: 'path/to/aviator.log',
|
16
|
+
redis_host: 'localhost',
|
17
|
+
redis_port: 6785
|
18
|
+
)
|
19
|
+
|
20
|
+
|
21
|
+
#==================
|
22
|
+
# LOGIN CONTROLLER
|
23
|
+
#==================
|
24
|
+
|
25
|
+
# Create an unscoped session
|
26
|
+
Aviator::SessionPool.get_or_create(session[:session_id]) do |creds|
|
27
|
+
creds.username = username
|
28
|
+
creds.password = password
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# Moments pass...
|
33
|
+
|
34
|
+
# Now the user is requesting access to a specific project/tenant
|
35
|
+
|
36
|
+
#===============================
|
37
|
+
# IN A CONTROLLER BEFORE_FILTER
|
38
|
+
#===============================
|
39
|
+
|
40
|
+
# Attempt to get the unscoped session which is an indicator that
|
41
|
+
# the user has been previously authenticated.
|
42
|
+
#
|
43
|
+
# When getting a session from the pool, SessionPool calls the
|
44
|
+
# object's validate method. If that method returns false, then
|
45
|
+
# SessionPool will return nil. If there is no session with the
|
46
|
+
# given key, SessionPool will also return nil.
|
47
|
+
unless unscoped = Aviator::SessionPool.get(session[:session_id])
|
48
|
+
# This means the user is not yet authenticated or
|
49
|
+
# her session with OpenStack has expired. Do the ff:
|
50
|
+
# - Log out user
|
51
|
+
# - Redirect user to login page
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
#=====================================
|
56
|
+
# IN ANOTHER CONTROLLER BEFORE_FILTER
|
57
|
+
#=====================================
|
58
|
+
|
59
|
+
# Since user is asking for resources for a specific tenant, let's
|
60
|
+
# get a session scoped to that tenant.
|
61
|
+
Aviator::SessionPool.get_or_create(session[:session_id] + tenant_name.underscore) do |creds|
|
62
|
+
creds.token_id = unscoped[:auth_info][:access][:token][:id]
|
63
|
+
creds.tenant_name = tenant_name
|
64
|
+
end
|
65
|
+
|
66
|
+
# scoped will have to be shared between the controller and
|
67
|
+
# whichever model or object will need to use it.
|
68
|
+
Aviator::SessionPool.set_current(session[:session_id] + tenant_name.underscore)
|
69
|
+
|
70
|
+
|
71
|
+
#=========================
|
72
|
+
# IN SOME MODEL OR OBJECT
|
73
|
+
#=========================
|
74
|
+
|
75
|
+
# Use current session like any other Aviator session. If set_current was not
|
76
|
+
# called prior to this, get_current will raise a CurrentSessionNotDefinedError
|
77
|
+
#
|
78
|
+
# WARNING: Since get_current uses a class instance variable, it will contain
|
79
|
+
# a value between http requests whether set_current was called or not for as long
|
80
|
+
# as it was called at least once.
|
81
|
+
Aviator::SessionPool.get_current.compute_service.request(:list_servers)
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
# Maintaining an admin session
|
86
|
+
|
87
|
+
# Authentication will use credentials in the config file since
|
88
|
+
# a block is not provided in this call.
|
89
|
+
admin = Aviator::SessionPool.get_or_create('admin')
|
90
|
+
|
91
|
+
#=========================
|
92
|
+
# IN SOME MODEL OR OBJECT
|
93
|
+
#=========================
|
94
|
+
|
95
|
+
# Use the admin session
|
96
|
+
Aviator::SessionPool.get_or_create('admin').identity_service.request(:list_tenants, endpoint_type: :admin)
|
97
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'redis'
|
2
|
+
|
3
|
+
module Aviator
|
4
|
+
class SessionPool
|
5
|
+
|
6
|
+
class CurrentSessionNotDefinedError < StandardError
|
7
|
+
def initialize
|
8
|
+
super "Current session is not defined. Make sure to call ::set_current first."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class SessionNotFoundError < StandardError
|
13
|
+
def initialize(key)
|
14
|
+
super "There is no session with key #{ key } in the pool"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
REDIS_KEY_PREFIX = 'aviator.session_dumps'
|
20
|
+
|
21
|
+
class << self
|
22
|
+
|
23
|
+
def []=(key, session)
|
24
|
+
session_key = build_key(key)
|
25
|
+
|
26
|
+
redis.set(session_key, session.dump)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def [](key)
|
31
|
+
session_dump = redis.get(build_key(key))
|
32
|
+
|
33
|
+
return nil unless session_dump
|
34
|
+
|
35
|
+
session = Aviator::Session.load(session_dump)
|
36
|
+
|
37
|
+
session.validate ? session : nil
|
38
|
+
end
|
39
|
+
alias :get :[]
|
40
|
+
|
41
|
+
|
42
|
+
# Not thread safe! BUT good enough for
|
43
|
+
# a single-threaded web application.
|
44
|
+
def configure(options)
|
45
|
+
@configuration = options
|
46
|
+
|
47
|
+
# So that the redis configuration will
|
48
|
+
# be reloaded on the next ::redis call
|
49
|
+
@redis = nil
|
50
|
+
end
|
51
|
+
attr_reader :configuration
|
52
|
+
alias :c :configuration
|
53
|
+
|
54
|
+
|
55
|
+
# WARNING: Since get_current uses a class instance variable, it will contain
|
56
|
+
# a value between http requests whether set_current was called or not for as long
|
57
|
+
# as it was called at least once.
|
58
|
+
def get_current
|
59
|
+
self.get(@current_key) || (raise CurrentSessionNotDefinedError.new)
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def get_or_create(key, &block)
|
64
|
+
# If session is invalid or does not exist, self[] will return nil
|
65
|
+
unless session = self[key]
|
66
|
+
config = configuration.dup
|
67
|
+
[:redis_host, :redis_port].each{|k| config.delete k }
|
68
|
+
session = Aviator::Session.new(config)
|
69
|
+
|
70
|
+
session.authenticate &block
|
71
|
+
|
72
|
+
self[key] = session
|
73
|
+
end
|
74
|
+
|
75
|
+
session
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
# Not thread safe! BUT good enough for
|
80
|
+
# a single-threaded web application.
|
81
|
+
def set_current(key)
|
82
|
+
raise SessionNotFoundError.new(key) unless self.get(key)
|
83
|
+
|
84
|
+
@current_key = key
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def build_key(key)
|
91
|
+
"#{ REDIS_KEY_PREFIX }.#{ key }"
|
92
|
+
end
|
93
|
+
|
94
|
+
def redis
|
95
|
+
@redis ||= Redis.new(host: c[:redis_host], port: c[:redis_port])
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'aviator/session_pool'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'aviator/session_pool/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "aviator_session_pool"
|
8
|
+
spec.version = Aviator::SessionPool::VERSION
|
9
|
+
spec.authors = ["Mark Maglana", "Alfonso Dillera"]
|
10
|
+
spec.email = ["mmaglana@gmail.com", "aj.dillera@gmail.com"]
|
11
|
+
spec.description = %q{ A library for managing multiple Aviator sessions }
|
12
|
+
spec.summary = %q{ A library for managing multiple Aviator sessions }
|
13
|
+
spec.homepage = "http://github.io/aviator/session_pool"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency 'aviator', '>= 0.0.6'
|
22
|
+
spec.add_dependency 'redis', '>= 3.0.4'
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
25
|
+
spec.add_development_dependency "rake"
|
26
|
+
spec.add_development_dependency 'rb-fsevent', '~> 0.9.0'
|
27
|
+
spec.add_development_dependency 'guard', '~> 1.8.0'
|
28
|
+
spec.add_development_dependency 'guard-rake', '~> 0.0.0'
|
29
|
+
spec.add_development_dependency 'guard-minitest', '~> 0.5.0'
|
30
|
+
spec.add_development_dependency 'ruby_gntp', '~> 0.3.0'
|
31
|
+
spec.add_development_dependency 'pry', '~> 0.9.0'
|
32
|
+
spec.add_development_dependency 'yard', '~> 0.8.0'
|
33
|
+
spec.add_development_dependency 'redcarpet', '~> 2.3.0'
|
34
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Aviator::Test
|
4
|
+
|
5
|
+
describe 'aviator/session_pool/session_pool' do
|
6
|
+
|
7
|
+
def default_options
|
8
|
+
{
|
9
|
+
config_file: 'path/to/aviator.yml',
|
10
|
+
environment: :production,
|
11
|
+
log_file: 'path/to/aviator.log',
|
12
|
+
redis_host: 'localhost',
|
13
|
+
redis_port: 6379
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def redis
|
19
|
+
@redis ||= Redis.new(host: default_options[:redis_host], port: default_options[:redis_port])
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def session
|
24
|
+
@session ||= Aviator::Session.new default_options
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def subject
|
29
|
+
Aviator::SessionPool
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
before do
|
34
|
+
redis.flushdb
|
35
|
+
|
36
|
+
# Reload Session mocks each time
|
37
|
+
load 'support/aviator_session_mock.rb'
|
38
|
+
|
39
|
+
subject.configure default_options
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
describe '::[]=' do
|
44
|
+
|
45
|
+
it 'stores the session dump in redis' do
|
46
|
+
key = 'somestring'
|
47
|
+
|
48
|
+
subject[key] = session
|
49
|
+
|
50
|
+
stored = redis.get(subject.send(:build_key, key))
|
51
|
+
|
52
|
+
stored.wont_be_nil
|
53
|
+
stored.must_equal session.dump
|
54
|
+
end
|
55
|
+
|
56
|
+
end # describe '::[]='
|
57
|
+
|
58
|
+
|
59
|
+
describe '::[]' do
|
60
|
+
|
61
|
+
it 'retrieves a previously stored session from redis' do
|
62
|
+
key = 'somestring'
|
63
|
+
|
64
|
+
subject[key] = session
|
65
|
+
|
66
|
+
retrieved = subject[key]
|
67
|
+
|
68
|
+
retrieved.class.must_equal Aviator::Session
|
69
|
+
retrieved.dump.must_equal session.dump
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
it 'returns nil when a stored session is invalid' do
|
74
|
+
key = 'somestring'
|
75
|
+
|
76
|
+
subject[key] = session
|
77
|
+
|
78
|
+
Aviator::Session.class_eval do
|
79
|
+
def validate
|
80
|
+
false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
subject[key].must_be_nil
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
it 'returns nil when the session does not exist' do
|
89
|
+
subject['boguskey'].must_be_nil
|
90
|
+
end
|
91
|
+
|
92
|
+
end # describe '::[]'
|
93
|
+
|
94
|
+
|
95
|
+
describe '::configure' do
|
96
|
+
|
97
|
+
it 'sets the class\'s configuration' do
|
98
|
+
opts = {
|
99
|
+
config_file: 'the quick',
|
100
|
+
environment: 'brown fox',
|
101
|
+
log_file: 'jumps over',
|
102
|
+
redis_host: 'the lazy',
|
103
|
+
redis_port: 'dog'
|
104
|
+
}
|
105
|
+
|
106
|
+
subject.configure opts
|
107
|
+
|
108
|
+
subject.configuration.each{ |key, value| value.must_equal opts[key] }
|
109
|
+
end
|
110
|
+
|
111
|
+
end # describe '::configure'
|
112
|
+
|
113
|
+
|
114
|
+
describe '::get' do
|
115
|
+
|
116
|
+
it 'aliases ::[]' do
|
117
|
+
key = 'somestring'
|
118
|
+
|
119
|
+
subject[key] = session
|
120
|
+
|
121
|
+
subject.get(key).dump.must_equal subject[key].dump
|
122
|
+
end
|
123
|
+
|
124
|
+
end # describe '::get'
|
125
|
+
|
126
|
+
|
127
|
+
describe '::get_or_create' do
|
128
|
+
|
129
|
+
it 'loads a session if the associated session dump exists' do
|
130
|
+
key = 'loadsessionkey'
|
131
|
+
|
132
|
+
subject[key] = session
|
133
|
+
|
134
|
+
subject.get_or_create(key).dump.must_equal session.dump
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
it 'creates a new session if one with the given key does not exist' do
|
139
|
+
key = 'createsessionkey'
|
140
|
+
|
141
|
+
subject.get_or_create(key).wont_be_nil
|
142
|
+
subject.get_or_create(key).class.must_equal session.class
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
it 'creates a new session if one with the given key is invalid' do
|
147
|
+
key = 'invalidsessionkey'
|
148
|
+
|
149
|
+
subject[key] = session
|
150
|
+
|
151
|
+
|
152
|
+
Aviator::Session.class_eval do
|
153
|
+
def validate
|
154
|
+
false
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
subject.get_or_create(key).dump.wont_equal session.dump
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
it 'authenticates newly created sessions' do
|
164
|
+
key = 'authenticatesnewsessionkey'
|
165
|
+
|
166
|
+
session = subject.get_or_create(key)
|
167
|
+
|
168
|
+
session.authenticated?.must_equal true
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
it 'passes on a block to the newly create session if provided' do
|
173
|
+
key = 'passessonblocktosessionkey'
|
174
|
+
|
175
|
+
session = subject.get_or_create(key) do |c|
|
176
|
+
c.username = 'anything'
|
177
|
+
end
|
178
|
+
|
179
|
+
session.block_provided?.must_equal true
|
180
|
+
end
|
181
|
+
|
182
|
+
end # describe '::get_or_create'
|
183
|
+
|
184
|
+
|
185
|
+
describe '::set_current' do
|
186
|
+
|
187
|
+
it 'sets the current session' do
|
188
|
+
key = 'setcurrentsessionkey'
|
189
|
+
|
190
|
+
s = subject.get_or_create(key)
|
191
|
+
|
192
|
+
subject.set_current(key)
|
193
|
+
|
194
|
+
subject.get_current.dump.must_equal s.dump
|
195
|
+
end
|
196
|
+
|
197
|
+
|
198
|
+
it 'raises an error when the key does not exist' do
|
199
|
+
key = 'setcurrentnonexistentsessionkey'
|
200
|
+
|
201
|
+
the_method = lambda do
|
202
|
+
subject.set_current(key)
|
203
|
+
end
|
204
|
+
|
205
|
+
the_method.must_raise Aviator::SessionPool::SessionNotFoundError
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
|
211
|
+
describe '::get_current' do
|
212
|
+
|
213
|
+
it 'raises an error if set_current was no previously called' do
|
214
|
+
the_method = lambda do
|
215
|
+
subject.get_current
|
216
|
+
end
|
217
|
+
|
218
|
+
the_method.must_raise Aviator::SessionPool::CurrentSessionNotDefinedError
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'aviator'
|
2
|
+
|
3
|
+
module Aviator
|
4
|
+
class Session
|
5
|
+
def initialize(opts=nil)
|
6
|
+
@session_dump = opts[:session_dump] || (0...50).map{ ('a'..'z').to_a[rand(26)] }.join
|
7
|
+
@authenticated = opts[:session_dump] ? true : false
|
8
|
+
@block_provided = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def authenticate(&block)
|
12
|
+
@authenticated = true
|
13
|
+
@block_provided = (block ? true : false)
|
14
|
+
end
|
15
|
+
|
16
|
+
def authenticated?
|
17
|
+
@authenticated
|
18
|
+
end
|
19
|
+
|
20
|
+
def block_provided?
|
21
|
+
@block_provided
|
22
|
+
end
|
23
|
+
|
24
|
+
def dump
|
25
|
+
@session_dump
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
def load(session_dump)
|
34
|
+
new(session_dump: session_dump)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Aviator
|
2
|
+
class Test < MiniTest::Spec
|
3
|
+
|
4
|
+
def cassette_name
|
5
|
+
path = self.class.to_s
|
6
|
+
.gsub(/^aviator\//, '')
|
7
|
+
.gsub(/^Aviator::Test::/, '')
|
8
|
+
.gsub(/::#/, '/i_')
|
9
|
+
.gsub(/::::/, '/c_')
|
10
|
+
.gsub(/::/, '/')
|
11
|
+
.underscore
|
12
|
+
|
13
|
+
basename = __name__.gsub(/test_\d+_/, '')
|
14
|
+
|
15
|
+
"#{ path }/#{ basename }"
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
before do
|
20
|
+
# ::VCR.insert_cassette cassette_name
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
after do
|
25
|
+
# ::VCR.eject_cassette
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "minitest/reporters"
|
2
|
+
|
3
|
+
module Aviator
|
4
|
+
class Test
|
5
|
+
|
6
|
+
class SpecReporter < MiniTest::Reporters::SpecReporter
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def pad_test(test)
|
11
|
+
str = test.to_s.gsub(/(test_)/, '').gsub(/_/, ' ')
|
12
|
+
pad("%-#{TEST_SIZE}s" % str, TEST_PADDING)[0..TEST_SIZE]
|
13
|
+
end
|
14
|
+
|
15
|
+
def print_info(e)
|
16
|
+
print " #{e.exception.class.to_s}:\n"
|
17
|
+
e.message.each_line { |line| print_with_info_padding(line) }
|
18
|
+
|
19
|
+
trace = filter_backtrace(e.backtrace)
|
20
|
+
|
21
|
+
# TODO: Use the proper MiniTest way of customizing the filter
|
22
|
+
trace.each { |line| print_with_info_padding(line) unless line =~ /\.rvm|gems|_run_anything/ }
|
23
|
+
end
|
24
|
+
|
25
|
+
def print_suite(suite)
|
26
|
+
puts suite.name.gsub('::#', '#')
|
27
|
+
@suites << suite
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
class ProgressReporter < MiniTest::Reporters::ProgressReporter
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def print_test_with_time(suite, test)
|
37
|
+
total_time = Time.now - (runner.test_start_time || Time.now)
|
38
|
+
suite_name = suite.name.gsub('::#', '#').gsub('::::', '::')
|
39
|
+
test_name = test.to_s.gsub(/test_\d+|_/, ' ').strip
|
40
|
+
print(" %s %s (%.2fs)%s" % [suite_name, test_name, total_time, clr])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
MiniTest::Reporters.use! Aviator::Test::ProgressReporter.new
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Add the gem's lib folder to the load path
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
|
4
|
+
|
5
|
+
# Set-up coverage reporting (local and Coveralls.com)
|
6
|
+
require 'simplecov'
|
7
|
+
require 'coveralls'
|
8
|
+
SimpleCov.command_name 'MiniTest'
|
9
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
10
|
+
SimpleCov::Formatter::HTMLFormatter,
|
11
|
+
Coveralls::SimpleCov::Formatter
|
12
|
+
]
|
13
|
+
SimpleCov.start do
|
14
|
+
add_filter '/test/'
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'minitest/autorun'
|
18
|
+
|
19
|
+
# Do not require these gems when running in the CI
|
20
|
+
unless ENV['CI'] || ENV['TRAVIS']
|
21
|
+
require 'pry'
|
22
|
+
end
|
23
|
+
|
24
|
+
# Clean the tmp dir of log files
|
25
|
+
Dir[Pathname.new(__FILE__).expand_path.join('..', '..', 'tmp', '*.log')].each { |f| File.delete(f) }
|
26
|
+
|
27
|
+
# Load all helpers in test/support
|
28
|
+
Dir[Pathname.new(__FILE__).join('..', 'support', '*.rb')].each do |f|
|
29
|
+
require f
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'aviator'
|
33
|
+
require 'aviator/session_pool'
|
metadata
ADDED
@@ -0,0 +1,239 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aviator_session_pool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark Maglana
|
8
|
+
- Alfonso Dillera
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: aviator
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.0.6
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ! '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.0.6
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: redis
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 3.0.4
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 3.0.4
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.3'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.3'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rb-fsevent
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.9.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ~>
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 0.9.0
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: guard
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ~>
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.8.0
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ~>
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 1.8.0
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: guard-rake
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ~>
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.0.0
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ~>
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 0.0.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: guard-minitest
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 0.5.0
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.5.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: ruby_gntp
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ~>
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.3.0
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ~>
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.3.0
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: pry
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ~>
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 0.9.0
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ~>
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: 0.9.0
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: yard
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ~>
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: 0.8.0
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ~>
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 0.8.0
|
168
|
+
- !ruby/object:Gem::Dependency
|
169
|
+
name: redcarpet
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ~>
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: 2.3.0
|
175
|
+
type: :development
|
176
|
+
prerelease: false
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ~>
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: 2.3.0
|
182
|
+
description: ! ' A library for managing multiple Aviator sessions '
|
183
|
+
email:
|
184
|
+
- mmaglana@gmail.com
|
185
|
+
- aj.dillera@gmail.com
|
186
|
+
executables: []
|
187
|
+
extensions: []
|
188
|
+
extra_rdoc_files: []
|
189
|
+
files:
|
190
|
+
- .gitignore
|
191
|
+
- .ruby-gemset
|
192
|
+
- .ruby-version
|
193
|
+
- .travis.yml
|
194
|
+
- Gemfile
|
195
|
+
- Guardfile
|
196
|
+
- LICENSE.txt
|
197
|
+
- README.md
|
198
|
+
- Rakefile
|
199
|
+
- lib/aviator/session_pool.rb
|
200
|
+
- lib/aviator/session_pool/session_pool.rb
|
201
|
+
- lib/aviator/session_pool/version.rb
|
202
|
+
- lib/aviator_session_pool.rb
|
203
|
+
- session_pool.gemspec
|
204
|
+
- test/aviator/session_pool/session_pool_test.rb
|
205
|
+
- test/support/aviator_session_mock.rb
|
206
|
+
- test/support/test_base_class.rb
|
207
|
+
- test/support/test_reporter.rb
|
208
|
+
- test/test_helper.rb
|
209
|
+
homepage: http://github.io/aviator/session_pool
|
210
|
+
licenses:
|
211
|
+
- MIT
|
212
|
+
metadata: {}
|
213
|
+
post_install_message:
|
214
|
+
rdoc_options: []
|
215
|
+
require_paths:
|
216
|
+
- lib
|
217
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
222
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
+
requirements:
|
224
|
+
- - ! '>='
|
225
|
+
- !ruby/object:Gem::Version
|
226
|
+
version: '0'
|
227
|
+
requirements: []
|
228
|
+
rubyforge_project:
|
229
|
+
rubygems_version: 2.1.0
|
230
|
+
signing_key:
|
231
|
+
specification_version: 4
|
232
|
+
summary: A library for managing multiple Aviator sessions
|
233
|
+
test_files:
|
234
|
+
- test/aviator/session_pool/session_pool_test.rb
|
235
|
+
- test/support/aviator_session_mock.rb
|
236
|
+
- test/support/test_base_class.rb
|
237
|
+
- test/support/test_reporter.rb
|
238
|
+
- test/test_helper.rb
|
239
|
+
has_rdoc:
|