excursion 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 +7 -0
- data/lib/excursion/configuration.rb +86 -0
- data/lib/excursion/datasources/datasource.rb +14 -0
- data/lib/excursion/datasources/file.rb +53 -0
- data/lib/excursion/helpers/application_helper.rb +24 -0
- data/lib/excursion/helpers/helper.rb +22 -0
- data/lib/excursion/helpers.rb +7 -0
- data/lib/excursion/pool/application.rb +61 -0
- data/lib/excursion/pool.rb +30 -0
- data/lib/excursion/railtie.rb +17 -0
- data/lib/excursion/version.rb +3 -0
- data/lib/excursion.rb +17 -0
- data/spec/spec_helper.rb +1 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 91ab81cf91d566addc17aa5963965138a1c6592a
|
4
|
+
data.tar.gz: 32aae702c9c69c58bbb4c420e606a50990e51d5f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cb034cdfc374f4266221b176d3cf786981b7af4287446340530933ae097f9e8ba3f13df52b0bd7460a7bf3a1e5af72d241984a2df26c1674fdced47f6b98c376
|
7
|
+
data.tar.gz: eb5cfb2d550eee50c5b26db1ef89a5f188846dd3bebe29d46c89c430c219f3b3d58c16f6ecc10a02c78ac2769e5b8031a6f447b0b33eecca125d14917d4e8996
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Excursion
|
2
|
+
class Configuration
|
3
|
+
DEFAULT_CONFIGURATION_OPTIONS = {
|
4
|
+
# TODO
|
5
|
+
# exclude_pattern: to exclude certain routes from being shared
|
6
|
+
# include_pattern: to only include certain routes
|
7
|
+
default_url_options: {}
|
8
|
+
}
|
9
|
+
|
10
|
+
#attr_reader *DEFAULT_CONFIGURATION_OPTIONS.keys
|
11
|
+
|
12
|
+
#DEFAULT_CONFIGURATION_OPTIONS.keys.each do |key|
|
13
|
+
# define_method "#{key.to_s}=" do |val|
|
14
|
+
# @changed[key] = [send(key), val]
|
15
|
+
# instance_variable_set "@#{key.to_s}", val
|
16
|
+
# end
|
17
|
+
#end
|
18
|
+
|
19
|
+
def method_missing(meth, *args)
|
20
|
+
if meth.to_s.match(/\A(.*)=\Z/)
|
21
|
+
@changed[$1] = [send($1), *args]
|
22
|
+
instance_variable_set "@#{$1.to_s}", *args
|
23
|
+
else
|
24
|
+
instance_variable_get "@#{meth}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns a hash of all the changed keys and values after being reconfigured
|
29
|
+
def changed
|
30
|
+
@changed = {}
|
31
|
+
to_hash.each { |key,val| @changed[key] = [@saved_state[key], val] if @saved_state[key] != val }
|
32
|
+
@changed
|
33
|
+
end
|
34
|
+
|
35
|
+
# Check whether a key was changed after being reconfigured
|
36
|
+
def changed?(key)
|
37
|
+
changed.has_key?(key)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Pass arguments and/or a block to configure the available options
|
41
|
+
def configure(args={}, &block)
|
42
|
+
save_state
|
43
|
+
configure_with_args args
|
44
|
+
configure_with_block &block if block_given?
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
# Accepts arguments which are used to configure available options
|
49
|
+
def configure_with_args(args)
|
50
|
+
args.select { |k,v| DEFAULT_CONFIGURATION_OPTIONS.keys.include?(k) }.each do |key,val|
|
51
|
+
instance_variable_set "@#{key.to_s}", val
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Accepts a block which is used to configure available options
|
56
|
+
def configure_with_block(&block)
|
57
|
+
self.instance_eval(&block) if block_given?
|
58
|
+
end
|
59
|
+
|
60
|
+
# Saves a copy of the current state, to be used later to determine what was changed
|
61
|
+
def save_state
|
62
|
+
@saved_state = clone.to_hash
|
63
|
+
@changed = {}
|
64
|
+
end
|
65
|
+
|
66
|
+
def to_hash
|
67
|
+
h = {}
|
68
|
+
DEFAULT_CONFIGURATION_OPTIONS.keys.each do |key|
|
69
|
+
h[key] = instance_variable_get "@#{key.to_s}"
|
70
|
+
end
|
71
|
+
h
|
72
|
+
end
|
73
|
+
alias_method :to_h, :to_hash
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
def initialize
|
78
|
+
DEFAULT_CONFIGURATION_OPTIONS.each do |key,val|
|
79
|
+
instance_variable_set "@#{key.to_s}", val
|
80
|
+
end
|
81
|
+
save_state
|
82
|
+
super
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'excursion/datasources/datasource'
|
3
|
+
|
4
|
+
module Excursion
|
5
|
+
module Datasources
|
6
|
+
class File < Datasource
|
7
|
+
|
8
|
+
def read(key)
|
9
|
+
read_file[key.to_s]
|
10
|
+
end
|
11
|
+
alias_method :get, :read
|
12
|
+
|
13
|
+
def write(key, value)
|
14
|
+
current = read_file
|
15
|
+
current[key.to_s] = value
|
16
|
+
write_file(current)
|
17
|
+
current[key.to_s]
|
18
|
+
end
|
19
|
+
alias_method :set, :write
|
20
|
+
|
21
|
+
def delete(key)
|
22
|
+
current = read_file
|
23
|
+
deleted = current.delete(key.to_s)
|
24
|
+
write_file(current)
|
25
|
+
deleted
|
26
|
+
end
|
27
|
+
alias_method :unset, :delete
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def initialize(path=nil)
|
32
|
+
path = Excursion.configuration.datasource_file
|
33
|
+
@path = ::File.expand_path(path)
|
34
|
+
rescue
|
35
|
+
raise "Could not initialize the File datasource. Make sure you have properly configured your datasource"
|
36
|
+
end
|
37
|
+
|
38
|
+
def exists?
|
39
|
+
::File.exists(@path)
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_file
|
43
|
+
YAML.load_file(@path) || {}
|
44
|
+
rescue
|
45
|
+
{}
|
46
|
+
end
|
47
|
+
|
48
|
+
def write_file(results)
|
49
|
+
::File.open(@path, 'w') { |f| f.write(results.to_yaml)}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Excursion
|
2
|
+
module Helpers
|
3
|
+
class ApplicationHelper
|
4
|
+
|
5
|
+
def routes
|
6
|
+
@application.routes
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(meth, *args)
|
10
|
+
if meth.to_s.match(/\A(#{routes.collect { |name,route| name }.join("|")})_(url|path)\Z/)
|
11
|
+
ActionDispatch::Routing::RouteSet::NamedRouteCollection::UrlHelper.create(routes.get($1.to_sym), @application.default_url_options).call(Rails.application.routes, args)
|
12
|
+
else
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def initialize(app)
|
20
|
+
@application = app
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
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
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Excursion
|
2
|
+
module Pool
|
3
|
+
class Application
|
4
|
+
attr_reader :name, :default_url_options
|
5
|
+
|
6
|
+
def self.from_cache(cached)
|
7
|
+
new.from_cache(cached)
|
8
|
+
end
|
9
|
+
|
10
|
+
def route(key)
|
11
|
+
routes[key.to_sym]
|
12
|
+
end
|
13
|
+
|
14
|
+
def routes
|
15
|
+
@routes ||= ActionDispatch::Routing::RouteSet::NamedRouteCollection.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def routes=(routes)
|
19
|
+
@routes = ActionDispatch::Routing::RouteSet::NamedRouteCollection.new
|
20
|
+
routes.each do |name, route|
|
21
|
+
@routes.add(name, route)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def set_routes(routes)
|
26
|
+
self.routes = routes
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_cache
|
31
|
+
{name: @name,
|
32
|
+
routes: Hash[routes.map { |name, route| [name.to_sym, route.path.spec.to_s] }],
|
33
|
+
default_url_options: @default_url_options,
|
34
|
+
registered_at: @registered_at
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def routes_from_cache(routes)
|
39
|
+
collection = ActionDispatch::Routing::RouteSet::NamedRouteCollection.new
|
40
|
+
routes.each do |name, path|
|
41
|
+
collection.add(name, ActionDispatch::Journey::Route.new(name, Rails.application, ActionDispatch::Journey::Path::Pattern.new(path), {required_defaults: []}))
|
42
|
+
end
|
43
|
+
collection
|
44
|
+
end
|
45
|
+
|
46
|
+
def from_cache(cached={})
|
47
|
+
@name = cached[:name] # required
|
48
|
+
@routes = routes_from_cache(cached[:routes]) if cached.has_key?(:routes)
|
49
|
+
@default_url_options = cached[:default_url_options]
|
50
|
+
@registered_at = (Time.at(cached[:registered_at]) rescue Time.now)
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
def initialize(config={}, routes={})
|
57
|
+
from_cache(config).set_routes(routes)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'excursion/pool/application'
|
2
|
+
|
3
|
+
module Excursion
|
4
|
+
module Pool
|
5
|
+
@@applications = {}
|
6
|
+
|
7
|
+
def self.application(name)
|
8
|
+
return @@applications[name] if @@applications.has_key?(name)
|
9
|
+
|
10
|
+
app_yaml = datasource.get(name)
|
11
|
+
@@applications[name] = Application.from_cache(app_yaml) unless app_yaml.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.register_application(app)
|
15
|
+
name = app.class.name.underscore.split("/").first
|
16
|
+
config = {name: name, default_url_options: Excursion.configuration.default_url_options}
|
17
|
+
|
18
|
+
@@applications[name] = Application.new(config, app.routes.named_routes)
|
19
|
+
datasource.set(name, @@applications[name].to_cache)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.datasource
|
23
|
+
raise if Excursion.configuration.datasource.nil?
|
24
|
+
require "excursion/datasources/#{Excursion.configuration.datasource.to_s}"
|
25
|
+
@@datasource ||= "Excursion::Datasources::#{Excursion.configuration.datasource.to_s.camelize}".constantize.new
|
26
|
+
rescue
|
27
|
+
raise "Could not initialize your datasource. Make sure you have properly configured it"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Excursion
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
config.after_initialize do |app|
|
4
|
+
app.reload_routes!
|
5
|
+
Excursion::Pool.register_application(app)
|
6
|
+
end
|
7
|
+
|
8
|
+
rake_tasks do
|
9
|
+
namespace :excursion do
|
10
|
+
desc "Register this app and it's routes with the route pool"
|
11
|
+
task :register => :environment do
|
12
|
+
Excursion::Pool.register_application(Rails.application)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/excursion.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'excursion/configuration'
|
2
|
+
|
3
|
+
module Excursion
|
4
|
+
@@configuration = Excursion::Configuration.new
|
5
|
+
|
6
|
+
def self.configure(&block)
|
7
|
+
@@configuration.configure &block
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.configuration
|
11
|
+
@@configuration
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'excursion/pool'
|
16
|
+
require 'excursion/helpers'
|
17
|
+
require 'excursion/railtie'
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# TODO: specs!
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: excursion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mark Rebec
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-06-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec-rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Provides a pool of routes into which applications can dump their host
|
42
|
+
information and routing table. Other applications can then utilize application namespaced
|
43
|
+
helper methods for redirecting, etc. between apps.
|
44
|
+
email:
|
45
|
+
- mark@markrebec.com
|
46
|
+
executables: []
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- lib/excursion/pool.rb
|
51
|
+
- lib/excursion/pool/application.rb
|
52
|
+
- lib/excursion/railtie.rb
|
53
|
+
- lib/excursion/configuration.rb
|
54
|
+
- lib/excursion/datasources/file.rb
|
55
|
+
- lib/excursion/datasources/datasource.rb
|
56
|
+
- lib/excursion/helpers/application_helper.rb
|
57
|
+
- lib/excursion/helpers/helper.rb
|
58
|
+
- lib/excursion/helpers.rb
|
59
|
+
- lib/excursion/version.rb
|
60
|
+
- lib/excursion.rb
|
61
|
+
- spec/spec_helper.rb
|
62
|
+
homepage: http://github.com/markrebec/excursion
|
63
|
+
licenses: []
|
64
|
+
metadata: {}
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options: []
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
requirements: []
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 2.0.0.rc.2
|
82
|
+
signing_key:
|
83
|
+
specification_version: 4
|
84
|
+
summary: Route pooling to share routes between applications
|
85
|
+
test_files:
|
86
|
+
- spec/spec_helper.rb
|
87
|
+
has_rdoc:
|