excursion 0.0.1 → 0.0.2
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 +4 -4
- data/lib/excursion/configuration.rb +2 -1
- data/lib/excursion/datasources/file.rb +8 -2
- data/lib/excursion/datasources/memcache.rb +56 -0
- data/lib/excursion/exceptions/datasources.rb +7 -0
- data/lib/excursion/exceptions/memcache.rb +5 -0
- data/lib/excursion/exceptions/pool.rb +3 -0
- data/lib/excursion/exceptions.rb +3 -0
- data/lib/excursion/helpers/application_helper.rb +20 -9
- data/lib/excursion/helpers/url_helper.rb +25 -0
- data/lib/excursion/helpers.rb +26 -2
- data/lib/excursion/pool.rb +8 -3
- data/lib/excursion/version.rb +1 -1
- data/lib/excursion.rb +1 -0
- metadata +7 -2
- data/lib/excursion/helpers/helper.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70d3b67fdc9a21e72d9d1c5571f3a2c3010f45a2
|
4
|
+
data.tar.gz: ebdec9417ed30b61d4eaa1eb966ea406a0ea6821
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 057db352ba02d3f2c41507b88237cb6ab6afb7c7c1b52cc526e6c4d99a117fd3408a1490b8936281c69b0f2d4953bac810d4af339e60d0212dd81792b6d00451
|
7
|
+
data.tar.gz: 3d3b389f2d04646bc130f9c970a34764864979cf7e546dcf8cafade41dcea0c64e2041e26ab9d3a69c4b77754f7cf0b18715c1ecbc28348eb7e3d4ec51688570
|
@@ -4,7 +4,8 @@ module Excursion
|
|
4
4
|
# TODO
|
5
5
|
# exclude_pattern: to exclude certain routes from being shared
|
6
6
|
# include_pattern: to only include certain routes
|
7
|
-
default_url_options: {}
|
7
|
+
default_url_options: {}, # default_url_options used when building routes for this app
|
8
|
+
retry_limit: 3 # retry limit for datasources that user remote servers
|
8
9
|
}
|
9
10
|
|
10
11
|
#attr_reader *DEFAULT_CONFIGURATION_OPTIONS.keys
|
@@ -29,10 +29,13 @@ module Excursion
|
|
29
29
|
protected
|
30
30
|
|
31
31
|
def initialize(path=nil)
|
32
|
-
path
|
32
|
+
path ||= Excursion.configuration.datasource_file
|
33
|
+
raise DatasourceConfigurationError, "You must configure the :file datasource with a datasource_file path" if path.nil?
|
33
34
|
@path = ::File.expand_path(path)
|
35
|
+
rescue DatasourceConfigurationError => e
|
36
|
+
raise e
|
34
37
|
rescue
|
35
|
-
raise "Could not initialize the
|
38
|
+
raise DatasourceConfigurationError, "Could not initialize the :file datasource. Make sure you have properly configured the datasource_file path"
|
36
39
|
end
|
37
40
|
|
38
41
|
def exists?
|
@@ -46,7 +49,10 @@ module Excursion
|
|
46
49
|
end
|
47
50
|
|
48
51
|
def write_file(results)
|
52
|
+
FileUtils.mkpath(::File.dirname(@path))
|
49
53
|
::File.open(@path, 'w') { |f| f.write(results.to_yaml)}
|
54
|
+
rescue
|
55
|
+
raise DatasourceConfigurationError, "Could not write to the excursion route pool file: #{@path}"
|
50
56
|
end
|
51
57
|
end
|
52
58
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'dalli'
|
2
|
+
require 'excursion/datasources/datasource'
|
3
|
+
require 'excursion/exceptions/memcache'
|
4
|
+
|
5
|
+
module Excursion
|
6
|
+
module Datasources
|
7
|
+
class Memcache < Datasource
|
8
|
+
|
9
|
+
def read(key)
|
10
|
+
@client.get(key.to_s)
|
11
|
+
rescue Dalli::RingError => e
|
12
|
+
rescue_from_dalli_ring_error(e) && retry
|
13
|
+
end
|
14
|
+
alias_method :get, :read
|
15
|
+
|
16
|
+
def write(key, value)
|
17
|
+
@client.set(key.to_s, value)
|
18
|
+
rescue Dalli::RingError => e
|
19
|
+
rescue_from_dalli_ring_error(e) && retry
|
20
|
+
end
|
21
|
+
alias_method :set, :write
|
22
|
+
|
23
|
+
def delete(key)
|
24
|
+
@client.delete(key)
|
25
|
+
rescue Dalli::RingError => e
|
26
|
+
rescue_from_dalli_ring_error(e) && retry
|
27
|
+
end
|
28
|
+
alias_method :unset, :delete
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def initialize(server=nil, options={})
|
33
|
+
server ||= Excursion.configuration.memcache_server
|
34
|
+
raise MemcacheConfigurationError, "You must configure the :memcache datasource with a memcache_server" if server.nil?
|
35
|
+
@client = Dalli::Client.new(server, options)
|
36
|
+
end
|
37
|
+
|
38
|
+
# TODO if we're using memcache, and the server goes away, it might be a good idea
|
39
|
+
# to make sure to re-register this app in the pool when it comes back, just in case
|
40
|
+
# the server crashed and the pool is lost.
|
41
|
+
def rescue_from_dalli_ring_error(e)
|
42
|
+
@dalli_retries ||= 0
|
43
|
+
|
44
|
+
if @dalli_retries >= Excursion.configuration.retry_limit
|
45
|
+
retries = @dalli_retries
|
46
|
+
@dalli_retries = 0
|
47
|
+
raise MemcacheServerError, "Excursion memcache server is down! Retried #{retries} times."
|
48
|
+
end
|
49
|
+
|
50
|
+
STDERR.puts "Excursion memcache server has gone away! Retrying..."
|
51
|
+
sleep 1 # give it a chance to come back
|
52
|
+
@dalli_retries += 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,24 +1,35 @@
|
|
1
1
|
module Excursion
|
2
2
|
module Helpers
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module ApplicationHelper
|
4
|
+
|
5
|
+
# Returns an Excursion::Helpers::ApplicationHelper if the app exists in the route pool.
|
6
|
+
#
|
7
|
+
# Raises an exception if the requested app is not in the route pool.
|
8
|
+
def excursion(app_name)
|
9
|
+
raise NotInPool, "Application is not registered in the excursion route pool: '#{app_name}'" unless app_exists?(app_name)
|
10
|
+
|
11
|
+
return Helpers.helper(app_name) unless Helpers.helper(app_name).nil?
|
12
|
+
Helpers.register_helper(UrlHelper.new(excursion_app(app_name)))
|
7
13
|
end
|
8
14
|
|
9
15
|
def method_missing(meth, *args)
|
10
|
-
if meth.to_s
|
11
|
-
|
16
|
+
if app_exists?(meth.to_s)
|
17
|
+
excursion(meth.to_s)
|
12
18
|
else
|
13
19
|
super
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
17
|
-
|
23
|
+
def app_exists?(app_name)
|
24
|
+
!excursion_app(app_name).nil?
|
25
|
+
end
|
18
26
|
|
19
|
-
def
|
20
|
-
|
27
|
+
def excursion_app(app_name)
|
28
|
+
Pool.application(app_name)
|
21
29
|
end
|
22
30
|
end
|
23
31
|
end
|
24
32
|
end
|
33
|
+
|
34
|
+
ActionController::Base.send :include, Excursion::Helpers::ApplicationHelper
|
35
|
+
ActionController::Base.send :helper, Excursion::Helpers::ApplicationHelper
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Excursion
|
2
|
+
module Helpers
|
3
|
+
class UrlHelper
|
4
|
+
attr_reader :application
|
5
|
+
|
6
|
+
def routes
|
7
|
+
@application.routes
|
8
|
+
end
|
9
|
+
|
10
|
+
def method_missing(meth, *args)
|
11
|
+
if meth.to_s.match(/\A(#{routes.collect { |name,route| name }.join("|")})_(url|path)\Z/)
|
12
|
+
ActionDispatch::Routing::RouteSet::NamedRouteCollection::UrlHelper.create(routes.get($1.to_sym), @application.default_url_options).call(Rails.application.routes, args)
|
13
|
+
else
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def initialize(app)
|
21
|
+
@application = app
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/excursion/helpers.rb
CHANGED
@@ -1,7 +1,31 @@
|
|
1
|
+
require 'excursion/helpers/url_helper'
|
1
2
|
require 'excursion/helpers/application_helper'
|
2
|
-
require 'excursion/helpers/helper'
|
3
3
|
|
4
|
-
module
|
4
|
+
module Excursion
|
5
5
|
module Helpers
|
6
|
+
def self.helpers
|
7
|
+
@helpers ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.helper(name)
|
11
|
+
helpers[name]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Helpers register themselves here when they're created so they can be shared
|
15
|
+
# between different instances (like the StaticHelper below and ActionController)
|
16
|
+
def self.register_helper(h)
|
17
|
+
@helpers ||= {}
|
18
|
+
@helpers[h.application.name] = h
|
19
|
+
h
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class StaticHelper
|
24
|
+
include Helpers::ApplicationHelper
|
25
|
+
end
|
26
|
+
|
27
|
+
# Provides quick global access to url helpers with using the StaticHelper
|
28
|
+
def self.url_helpers
|
29
|
+
@url_helpers ||= StaticHelper.new
|
6
30
|
end
|
7
31
|
end
|
data/lib/excursion/pool.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'excursion/pool/application'
|
2
|
+
require 'excursion/exceptions/pool'
|
3
|
+
require 'excursion/exceptions/datasources'
|
2
4
|
|
3
5
|
module Excursion
|
4
6
|
module Pool
|
@@ -20,11 +22,14 @@ module Excursion
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def self.datasource
|
23
|
-
raise if Excursion.configuration.datasource.nil?
|
25
|
+
raise NoDatasourceError, "You must configure excursion with a datasource." if Excursion.configuration.datasource.nil?
|
24
26
|
require "excursion/datasources/#{Excursion.configuration.datasource.to_s}"
|
25
27
|
@@datasource ||= "Excursion::Datasources::#{Excursion.configuration.datasource.to_s.camelize}".constantize.new
|
26
|
-
rescue
|
27
|
-
raise
|
28
|
+
#rescue NoDatasourceError => e
|
29
|
+
#raise e
|
30
|
+
rescue StandardError => e
|
31
|
+
raise e
|
32
|
+
#raise InvalidDatasourceError, "Could not initialize your datasource. Make sure you have properly configured it"
|
28
33
|
end
|
29
34
|
end
|
30
35
|
end
|
data/lib/excursion/version.rb
CHANGED
data/lib/excursion.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: excursion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rebec
|
@@ -48,13 +48,18 @@ extensions: []
|
|
48
48
|
extra_rdoc_files: []
|
49
49
|
files:
|
50
50
|
- lib/excursion/pool.rb
|
51
|
+
- lib/excursion/exceptions/pool.rb
|
52
|
+
- lib/excursion/exceptions/datasources.rb
|
53
|
+
- lib/excursion/exceptions/memcache.rb
|
51
54
|
- lib/excursion/pool/application.rb
|
52
55
|
- lib/excursion/railtie.rb
|
53
56
|
- lib/excursion/configuration.rb
|
54
57
|
- lib/excursion/datasources/file.rb
|
55
58
|
- lib/excursion/datasources/datasource.rb
|
59
|
+
- lib/excursion/datasources/memcache.rb
|
60
|
+
- lib/excursion/helpers/url_helper.rb
|
56
61
|
- lib/excursion/helpers/application_helper.rb
|
57
|
-
- lib/excursion/
|
62
|
+
- lib/excursion/exceptions.rb
|
58
63
|
- lib/excursion/helpers.rb
|
59
64
|
- lib/excursion/version.rb
|
60
65
|
- lib/excursion.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Excursion
|
2
|
-
module Helpers
|
3
|
-
module Helper
|
4
|
-
|
5
|
-
def method_missing(meth, *args)
|
6
|
-
if !(app = Pool.application(meth.to_s)).nil?
|
7
|
-
@application_helpers ||= {}
|
8
|
-
@application_helpers[app.name] ||= ApplicationHelper.new(app)
|
9
|
-
else
|
10
|
-
begin
|
11
|
-
super
|
12
|
-
rescue NoMethodError => e
|
13
|
-
raise "Excursion URL helper method does not exist: #{meth}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
ActionController::Base.send :include, Excursion::Helpers::Helper
|
22
|
-
ActionController::Base.send :helper, Excursion::Helpers::Helper
|