resourcelogic 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -8,14 +8,18 @@ lib/resourcelogic.rb
8
8
  lib/resourcelogic/accessors.rb
9
9
  lib/resourcelogic/action_options.rb
10
10
  lib/resourcelogic/actions.rb
11
+ lib/resourcelogic/aliases.rb
11
12
  lib/resourcelogic/base.rb
12
13
  lib/resourcelogic/child.rb
13
14
  lib/resourcelogic/context.rb
15
+ lib/resourcelogic/context_options.rb
14
16
  lib/resourcelogic/failable_action_options.rb
15
17
  lib/resourcelogic/parent.rb
16
18
  lib/resourcelogic/response_collector.rb
19
+ lib/resourcelogic/scope.rb
17
20
  lib/resourcelogic/self.rb
18
21
  lib/resourcelogic/sibling.rb
19
22
  lib/resourcelogic/singleton.rb
23
+ lib/resourcelogic/sub_views.rb
20
24
  lib/resourcelogic/urligence.rb
21
25
  lib/resourcelogic/version.rb
@@ -0,0 +1,134 @@
1
+ module Resourcelogic
2
+ # This module let's you define various aliases for your controller. For example,
3
+ # lets say you have the following routes:
4
+ #
5
+ # /account/addresses => UsersController
6
+ # /admin/users/5/addresses => UsersController
7
+ #
8
+ # Here is how your AddressesController would look:
9
+ #
10
+ # class AddressesController < ResourceController
11
+ # belongs_to :user
12
+ # end
13
+ #
14
+ # The problem is that sometimes the parent object is called user, sometimes its
15
+ # called account. So the solution is to do:
16
+ #
17
+ # class ResourceController < ApplicationController
18
+ # route_alias :account, :user
19
+ # end
20
+ #
21
+ # Now ResourceLogic knows that when it see account in the URL it will know the grab
22
+ # the User model.
23
+ #
24
+ # Now I know an alternative could be to do somethig like:
25
+ #
26
+ # belongs_to :user, :alias => :account
27
+ #
28
+ # The above presents a problem. Take the following URL:
29
+ #
30
+ # /productos/1/pictures/4/comments
31
+ #
32
+ # In order for Resourcelogic to do its magic relative URLs, it needs to know what
33
+ # model "productos" should be using. Which should be the Product model, yet we
34
+ # can't define that in the CommentsController because it's 2 levels above, and we
35
+ # only specify the parent.
36
+ #
37
+ # Now a lot of people say you should never nest more than 2 levels deep, and this
38
+ # is absolutely true 95% of the time. But what if I want to link back to the parent
39
+ # object from the comments controller and preserve it's context? In order to do
40
+ # this I have to go 3 levels deep, because maybe context for the PicturesController
41
+ # is really important / required. The only way to preserve context is with the URL.
42
+ #
43
+ # Sorry for rambling, this documentation is really more of an internal note for me
44
+ # and to hopefully clarify why I took this approach.
45
+ module Aliases
46
+ def self.included(klass)
47
+ klass.class_eval do
48
+ extend Config
49
+ include InstanceMethods
50
+ end
51
+ end
52
+
53
+ module Config
54
+ def path_alias(alias_name, model_name)
55
+ current_aliases = path_aliases
56
+ model_name = model_name.to_sym
57
+ current_aliases[model_name] ||= []
58
+ current_aliases[model_name] << alias_name.to_sym
59
+ write_inheritable_attribute(:path_aliases, current_aliases)
60
+ end
61
+
62
+ def path_aliases
63
+ read_inheritable_attribute(:path_aliases) || {}
64
+ end
65
+
66
+ def route_alias(alias_name, model_name)
67
+ current_aliases = route_aliases
68
+ model_name = model_name.to_sym
69
+ current_aliases[model_name] ||= []
70
+ current_aliases[model_name] << alias_name.to_sym
71
+ write_inheritable_attribute(:route_aliases, current_aliases)
72
+ end
73
+
74
+ def route_aliases
75
+ read_inheritable_attribute(:route_aliases) || {}
76
+ end
77
+ end
78
+
79
+ module InstanceMethods
80
+ private
81
+ def model_name_from_route_alias(alias_name)
82
+ route_aliases.each do |model_name, aliases|
83
+ return model_name if aliases.include?(alias_name.to_sym)
84
+ end
85
+ nil
86
+ end
87
+
88
+ def route_aliases
89
+ self.class.route_aliases
90
+ end
91
+
92
+ def model_name_from_path_alias(alias_name)
93
+ path_aliases.each do |model_name, aliases|
94
+ return model_name if aliases.include?(alias_name.to_sym)
95
+ end
96
+ nil
97
+ end
98
+
99
+ def path_aliases
100
+ self.class.path_aliases
101
+ end
102
+
103
+ def possible_model_names(model_name)
104
+ [model_name] + (route_aliases[model_name] || []) + (path_aliases[model_name] || [])
105
+ end
106
+
107
+ # The point of this method is to determine what the part of a url is really referring to.
108
+ # For example, let's say you did this:
109
+ #
110
+ # map.resources :users, :as => :accounts
111
+ #
112
+ # Resource logic looks at the request.path. It's going to see "accounts" in the urls. How
113
+ # is it to know that by "accounts" you are referring to the "users" resource. That's the
114
+ # point of this method, to say "hey, accounts is mapped to users".
115
+ def model_name_from_path_part(part)
116
+ part = part.to_s.singularize
117
+ model_name_from_route_alias(part) || model_name_from_path_alias(part) || part.to_sym
118
+ end
119
+
120
+ # The point of this method is to determine the name used in the route method. For example,
121
+ # let's say you did this:
122
+ #
123
+ # map.resources :accounts, :controller => "users"
124
+ #
125
+ # You would want to use "account" in your path and url helper, not "user".
126
+ def route_name_from_path_part(part)
127
+ part = part.to_s.singularize
128
+ model_name = model_name_from_path_alias(part)
129
+ return model_name if model_name
130
+ part.to_sym
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,5 @@
1
+ module Resourcelogic
2
+ class ContextOptions
3
+ extend Resourcelogic::Accessors
4
+ end
5
+ end
@@ -0,0 +1,36 @@
1
+ module Resourcelogic
2
+ module Scope
3
+ def self.included(klass)
4
+ klass.class_eval do
5
+ add_acts_as_resource_module(Methods)
6
+ end
7
+ end
8
+
9
+ module Methods
10
+ def self.included(klass)
11
+ klass.class_eval do
12
+ attr_accessor :scoping, :scoping_parent
13
+ end
14
+ end
15
+
16
+ private
17
+ def scope
18
+ return @scope if defined?(@scope)
19
+
20
+ if parent?
21
+ @scope = parent_object.send(parent_scope_name)
22
+ else
23
+ @scope = model
24
+ end
25
+ end
26
+
27
+ def parent_scope
28
+ parent_model
29
+ end
30
+
31
+ def parent_scope_name
32
+ @parent_scope_name ||= model_name.to_s.pluralize
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,98 @@
1
+ # Nested and Polymorphic Resource Helpers
2
+ #
3
+ module Resourcelogic
4
+ module SubViews
5
+ def self.included(klass)
6
+ klass.class_eval do
7
+ extend Config
8
+ add_acts_as_resource_module(Methods)
9
+ end
10
+ end
11
+
12
+ module Config
13
+ def namespace_views_by_context(value = nil)
14
+ rw_config(:namespace_views_by_context, value)
15
+ end
16
+
17
+ def namespace_views_by_context?
18
+ !namespace_views_by_context.blank?
19
+ end
20
+
21
+ def namespace_views_by_route_alias(value = nil)
22
+ rw_config(:namespace_views_by_route_alias, value)
23
+ end
24
+
25
+ def namespace_views_by_route_alias?
26
+ !namespace_views_by_route_alias.blank?
27
+ end
28
+ end
29
+
30
+ module Methods
31
+ def self.included(klass)
32
+ klass.helper_method :namespace_views_by_route_alias, :namespace_views_by_route_alias?,
33
+ :namespace_views_by_context, :namespace_views_by_context?, :sub_template_name
34
+ end
35
+
36
+ private
37
+ def namespace_views_by_context?
38
+ self.class.namespace_views_by_context?
39
+ end
40
+
41
+ def namespace_views_by_context
42
+ self.class.namespace_views_by_context
43
+ end
44
+
45
+ def namespace_views_by_route_alias?
46
+ self.class.namespace_views_by_route_alias? && route_name != model_name
47
+ end
48
+
49
+ def namespace_views_by_route_alias
50
+ self.class.namespace_views_by_route_alias
51
+ end
52
+
53
+ def sub_template_name(name)
54
+ path_parts = [controller_name]
55
+
56
+ if namespace_views_by_context?
57
+ context_folder_name = namespace_views_by_context.is_a?(Hash) && namespace_views_by_context.key?(context) ?
58
+ namespace_views_by_context[context] : context
59
+ path_parts << (context_folder_name || "root")
60
+ end
61
+
62
+ if namespace_views_by_route_alias?
63
+ route_alias_folder_name = namespace_views_by_route_alias.is_a?(Hash) && namespace_views_by_route_alias.key?(route_name) ?
64
+ namespace_views_by_route_alias[route_name] : route_name
65
+ path_parts << (route_alias_folder_name).to_s.pluralize
66
+ end
67
+
68
+ path_parts << name
69
+ path_parts.join("/")
70
+ end
71
+
72
+ def default_template_name(action_name = self.action_name)
73
+ if namespace_views_by_context? || namespace_views_by_route_alias?
74
+ sub_template_name(action_name)
75
+ else
76
+ super
77
+ end
78
+ end
79
+ end
80
+
81
+ module Partials
82
+ def _pick_partial_template(partial_path)
83
+ if respond_to?(:namespace_views_by_context?) && respond_to?(:namespace_views_by_route_alias?) &&
84
+ (namespace_views_by_context? || namespace_views_by_route_alias?) && !partial_path.include?("/")
85
+ partial_path = sub_template_name(partial_path)
86
+ end
87
+ super
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+
94
+ module ActionView
95
+ class Base
96
+ include Resourcelogic::SubViews::Partials
97
+ end
98
+ end
@@ -40,7 +40,7 @@ module Resourcelogic # :nodoc:
40
40
  end
41
41
 
42
42
  MAJOR = 0
43
- MINOR = 10
43
+ MINOR = 11
44
44
  TINY = 0
45
45
 
46
46
  # The current version as a Version instance
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resourcelogic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Johnson of Binary Logic
@@ -53,15 +53,19 @@ files:
53
53
  - lib/resourcelogic/accessors.rb
54
54
  - lib/resourcelogic/action_options.rb
55
55
  - lib/resourcelogic/actions.rb
56
+ - lib/resourcelogic/aliases.rb
56
57
  - lib/resourcelogic/base.rb
57
58
  - lib/resourcelogic/child.rb
58
59
  - lib/resourcelogic/context.rb
60
+ - lib/resourcelogic/context_options.rb
59
61
  - lib/resourcelogic/failable_action_options.rb
60
62
  - lib/resourcelogic/parent.rb
61
63
  - lib/resourcelogic/response_collector.rb
64
+ - lib/resourcelogic/scope.rb
62
65
  - lib/resourcelogic/self.rb
63
66
  - lib/resourcelogic/sibling.rb
64
67
  - lib/resourcelogic/singleton.rb
68
+ - lib/resourcelogic/sub_views.rb
65
69
  - lib/resourcelogic/urligence.rb
66
70
  - lib/resourcelogic/version.rb
67
71
  has_rdoc: true