phenomenal_rails 1.1.0 → 1.2.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.
- data/lib/phenomenal_rails/context.rb +1 -1
- data/lib/phenomenal_rails/engine.rb +20 -13
- data/lib/phenomenal_rails/loader.rb +60 -0
- data/lib/phenomenal_rails/middleware.rb +20 -22
- data/lib/phenomenal_rails/path_set.rb +2 -2
- data/lib/phenomenal_rails/resolver.rb +10 -4
- data/lib/phenomenal_rails/version.rb +1 -1
- data/lib/phenomenal_rails.rb +8 -43
- data/spec/dummy/app/views/pages/home.html.haml +3 -2
- data/spec/dummy/app/views/shared/_partial4.html.haml +1 -0
- data/spec/dummy/{phenomenal → app_phenomenal}/persistent_feature/persistent_feature.rb +2 -0
- data/spec/dummy/app_phenomenal/persistent_feature/views/shared/_partial3.html.haml +1 -0
- data/spec/dummy/app_phenomenal/test_feature/test_feature.rb +1 -0
- data/spec/dummy/app_phenomenal/test_feature/views/shared/_partial4.html.haml +1 -0
- data/spec/dummy/config/application.rb +0 -2
- data/spec/dummy/log/development.log +156 -7055
- metadata +25 -24
- data/spec/dummy/db/production.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/production.log +0 -1348
- data/spec/dummy/phenomenal/persistent_feature/controllers/application_controller.rb +0 -6
- /data/spec/dummy/{app → app_phenomenal/persistent_feature}/controllers/application_controller.rb +0 -0
- /data/spec/dummy/{phenomenal → app_phenomenal}/persistent_feature/models/model.rb +0 -0
- /data/spec/dummy/{phenomenal → app_phenomenal}/persistent_feature/test_context/test_context.rb +0 -0
- /data/spec/dummy/{phenomenal → app_phenomenal}/persistent_feature/test_context/views/shared/_partial1.html.haml +0 -0
- /data/spec/dummy/{phenomenal → app_phenomenal}/persistent_feature/test_context/views/shared/_partial2.html.haml +0 -0
@@ -11,7 +11,7 @@ class Phenomenal::Context
|
|
11
11
|
def to_path
|
12
12
|
if name
|
13
13
|
name.to_s.underscore
|
14
|
-
elsif self==manager.
|
14
|
+
elsif self==manager.default_feature
|
15
15
|
nil
|
16
16
|
elsif manager.combined_contexts[self]
|
17
17
|
manager.combined_contexts[self].flatten.join("/").underscore
|
@@ -1,13 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
class PhenomenalRails::Engine < Rails::Engine
|
2
|
+
isolate_namespace PhenomenalRails
|
3
|
+
config.app_middleware.use(PhenomenalRails::Middleware)
|
4
|
+
|
5
|
+
config.before_configuration do
|
6
|
+
Rails.configuration.autoload_paths += PhenomenalRails::Loader.autoload_paths(File.expand_path(PhenomenalRails::PATH,Rails.root))
|
7
|
+
end
|
8
|
+
|
9
|
+
config.to_prepare do
|
10
|
+
PhenomenalRails::Loader.prepare(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
config.after_initialize do
|
14
|
+
ActionController::Base.prepend_view_path(PhenomenalRails::Resolver.instance)
|
15
|
+
end
|
16
|
+
|
17
|
+
ActionDispatch::Callbacks.before do |*args|
|
18
|
+
PhenomenalRails::Loader.prepare
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class PhenomenalRails::Loader
|
2
|
+
class << self
|
3
|
+
def autoload_paths(path,paths=[])
|
4
|
+
scan_dir(path) do |filepath, entry|
|
5
|
+
if File.directory?(filepath)
|
6
|
+
if (filepath.match(/.*\/controllers/) ||
|
7
|
+
filepath.match(/.*\/models/) ||
|
8
|
+
filepath.match(/.*\/helpers/))
|
9
|
+
paths.push(filepath)
|
10
|
+
end
|
11
|
+
autoload_paths(filepath,paths)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
paths
|
15
|
+
end
|
16
|
+
|
17
|
+
def prepare(loading=false)
|
18
|
+
phen_defined_contexts.reverse.each do |context|
|
19
|
+
if !context.forgotten && (!context.persistent || !Rails.configuration.cache_classes)
|
20
|
+
while phen_context_active?(context) do
|
21
|
+
phen_deactivate_context(context)
|
22
|
+
end
|
23
|
+
if !Rails.configuration.cache_classes
|
24
|
+
phen_forget_context(context)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if !Rails.configuration.cache_classes || loading
|
30
|
+
load_files(File.expand_path(PhenomenalRails::PATH,Rails.root))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def scan_dir(path, &block)
|
36
|
+
if Dir.exist? path
|
37
|
+
Dir.entries(path).each do |entry|
|
38
|
+
if entry!="." && entry !=".."
|
39
|
+
filepath=File.join(path,entry)
|
40
|
+
yield(filepath, entry)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def load_files(path)
|
47
|
+
scan_dir(path) do |filepath, entry|
|
48
|
+
if File.file?(filepath) && entry.match(/.*\.rb/)
|
49
|
+
load filepath
|
50
|
+
elsif File.directory?(filepath)
|
51
|
+
if !(filepath.match(/.*\/controllers/) ||
|
52
|
+
filepath.match(/.*\/models/) ||
|
53
|
+
filepath.match(/.*\/helpers/))
|
54
|
+
load_files(filepath)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,26 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
1
|
+
class PhenomenalRails::Middleware
|
2
|
+
def initialize(app)
|
3
|
+
@app=app
|
4
|
+
@activation_conditions=Array.new
|
5
|
+
Phenomenal::Feature.middleware=self
|
6
|
+
end
|
7
|
+
|
8
|
+
def add_condition(feature,&block)
|
9
|
+
@activation_conditions.push([feature,block])
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
12
|
+
def call(env)
|
13
|
+
before_call(env)
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def before_call(env)
|
18
|
+
@activation_conditions.each do |feature_block|
|
19
|
+
feature,block = feature_block
|
20
|
+
if feature.active?
|
21
|
+
block.call(env)
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
ActionView::LookupContext.register_detail(:feature) {[]} #-> add the details to the options hash
|
2
2
|
module ActionView
|
3
3
|
class PathSet
|
4
4
|
def find(*args)
|
@@ -18,7 +18,7 @@ module ActionView
|
|
18
18
|
def find_all_inactive(path, prefixes = [], *args)
|
19
19
|
prefixes = [prefixes] if String === prefixes
|
20
20
|
prefixes.each do |prefix|
|
21
|
-
templates = paths.find{|p| p.is_a?
|
21
|
+
templates = paths.find{|p| p.is_a?PhenomenalRails::Resolver}.find_all_inactive(path, prefix, *args)
|
22
22
|
return templates unless templates.empty?
|
23
23
|
end
|
24
24
|
[]
|
@@ -1,20 +1,26 @@
|
|
1
|
-
class
|
1
|
+
class PhenomenalRails::Resolver < ActionView::OptimizedFileSystemResolver
|
2
2
|
include Singleton
|
3
3
|
|
4
4
|
def find_all(name, prefix=nil, partial=false, details={}, key=nil, locals=[])
|
5
|
-
contexts = phen_defined_contexts.find_all
|
5
|
+
contexts = phen_defined_contexts.find_all do |c|
|
6
|
+
c.active? &&
|
7
|
+
(details[:feature].empty? ? true : c==feature(*details[:feature]))
|
8
|
+
end
|
6
9
|
contexts.sort!{|a,b| Phenomenal::Manager.instance.conflict_policy(a,b)}
|
7
10
|
find_all_contexts(name,contexts, prefix, partial, details, key, locals)
|
8
11
|
end
|
9
12
|
|
10
13
|
def find_all_inactive(name, prefix=nil, partial=false, details={}, key=nil, locals=[])
|
11
|
-
contexts = phen_defined_contexts.find_all
|
14
|
+
contexts = phen_defined_contexts.find_all do |c|
|
15
|
+
!c.active? &&
|
16
|
+
(details[:feature].empty? ? true : c==feature(*details[:feature]))
|
17
|
+
end
|
12
18
|
find_all_contexts(name,contexts, prefix, partial, details, key, locals)
|
13
19
|
end
|
14
20
|
|
15
21
|
private
|
16
22
|
def initialize()
|
17
|
-
super(
|
23
|
+
super(PhenomenalRails::PATH)
|
18
24
|
@cached={}
|
19
25
|
end
|
20
26
|
|
data/lib/phenomenal_rails.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
+
|
1
2
|
require "phenomenal"
|
3
|
+
require "phenomenal_rails/loader"
|
2
4
|
require "phenomenal_rails/context"
|
3
5
|
require "phenomenal_rails/feature"
|
4
6
|
require "phenomenal_rails/middleware"
|
@@ -7,48 +9,11 @@ require "singleton"
|
|
7
9
|
require "phenomenal_rails/resolver"
|
8
10
|
require "phenomenal_rails/path_set"
|
9
11
|
|
10
|
-
# Set default
|
11
|
-
|
12
|
+
# Set default feature as persistent
|
13
|
+
phen_default_feature.persistent=true
|
14
|
+
|
12
15
|
|
13
|
-
module PhenomenalRails
|
14
|
-
|
15
|
-
|
16
|
-
Dir.entries(path).each do |entry|
|
17
|
-
if entry!="." && entry !=".."
|
18
|
-
filepath=File.join(path,entry)
|
19
|
-
if File.file?(filepath) && entry.match(/.*\.rb/)
|
20
|
-
if !Rails.configuration.cache_classes &&
|
21
|
-
(path.match(/.*\/controllers/) ||
|
22
|
-
path.match(/.*\/models/) ||
|
23
|
-
path.match(/.*\/helpers/))
|
24
|
-
begin
|
25
|
-
entry.gsub(/.rb/,"").camelize.constantize
|
26
|
-
rescue
|
27
|
-
end
|
28
|
-
end
|
29
|
-
load filepath
|
30
|
-
elsif File.directory?(filepath)
|
31
|
-
load_dir(filepath)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
ActionDispatch::Callbacks.before do
|
39
|
-
phen_defined_contexts.reverse.each do |context|
|
40
|
-
if !context.forgotten && (!context.persistent || !Rails.configuration.cache_classes)
|
41
|
-
while phen_context_active?(context) do
|
42
|
-
phen_deactivate_context(context)
|
43
|
-
end
|
44
|
-
# Fix problem without page caching
|
45
|
-
if !Rails.configuration.cache_classes
|
46
|
-
phen_forget_context(context)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
if !Rails.configuration.cache_classes
|
51
|
-
PhenomenalRails.load_dir("#{Rails.root}/phenomenal")
|
52
|
-
end
|
53
|
-
end
|
16
|
+
module PhenomenalRails
|
17
|
+
# Phenomenal application folder
|
18
|
+
PATH = "app_phenomenal"
|
54
19
|
end
|
@@ -19,12 +19,13 @@
|
|
19
19
|
%td=context.active?
|
20
20
|
|
21
21
|
%br
|
22
|
-
=render "shared/partial1"
|
22
|
+
=render :partial=>"shared/partial1"
|
23
23
|
%br
|
24
24
|
=render "shared/partial2"
|
25
25
|
%br
|
26
|
+
=render :partial=>"shared/partial3",:feature=>[:PersistentFeature]
|
26
27
|
%br
|
27
|
-
|
28
|
+
=render :partial=>"shared/partial4"
|
28
29
|
= ActionController::Base.view_paths.paths
|
29
30
|
%br
|
30
31
|
%br
|
@@ -0,0 +1 @@
|
|
1
|
+
PARIAL 4 base
|
@@ -3,8 +3,10 @@ feature :PersistentFeature do
|
|
3
3
|
activation_condition do |env|
|
4
4
|
if Rack::Request.new(env).params["activated"]
|
5
5
|
activate_context :TestContext
|
6
|
+
activate_context :TestFeature
|
6
7
|
else
|
7
8
|
deactivate_context :TestContext
|
9
|
+
deactivate_context :TestFeature
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Persistent feature only partial
|
@@ -0,0 +1 @@
|
|
1
|
+
feature :TestFeature
|
@@ -0,0 +1 @@
|
|
1
|
+
PARTIAL 4 TEST FEATURE
|
@@ -14,8 +14,6 @@ module Dummy
|
|
14
14
|
|
15
15
|
# Custom directories with classes and modules you want to be autoloadable.
|
16
16
|
# config.autoload_paths += %W(#{config.root}/extras)
|
17
|
-
config.autoload_paths += %W(#{config.root}/app/contexts )
|
18
|
-
|
19
17
|
|
20
18
|
# Only load the plugins named here, in the order given (default is alphabetical).
|
21
19
|
# :all can be used as a placeholder for all plugins not explicitly named.
|