resourcelogic 0.12.2 → 0.12.3

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.
@@ -7,7 +7,7 @@ The purpose of Resourcelogic is to support a development style I created called
7
7
  == Helpful links
8
8
 
9
9
  * <b>Documentation:</b> http://rdoc.info/projects/binarylogic/resourcelogic
10
- * <b>Bugs / feature suggestions:</b> http://binarylogic.lighthouseapp.com/projects/28581-resourcelogic
10
+ * <b>Issues:</b> http://github.com/binarylogic/resourcelogic/issues
11
11
 
12
12
  == Contextual Development
13
13
 
data/Rakefile CHANGED
@@ -12,6 +12,7 @@ begin
12
12
  gem.rubyforge_project = "resourcelogic"
13
13
  gem.add_dependency "activesupport"
14
14
  end
15
+ Jeweler::RubyforgeTasks.new
15
16
  rescue LoadError
16
17
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
17
18
  end
@@ -36,14 +37,6 @@ rescue LoadError
36
37
  end
37
38
  end
38
39
 
39
- task :default => :test
40
+ task :test => :check_dependencies
40
41
 
41
- begin
42
- require 'rake/contrib/sshpublisher'
43
- namespace :rubyforge do
44
- desc "Release gem to RubyForge"
45
- task :release => ["rubyforge:release:gem"]
46
- end
47
- rescue LoadError
48
- puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
49
- end
42
+ task :default => :test
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 2
3
2
  :major: 0
4
3
  :minor: 12
4
+ :patch: 3
@@ -8,7 +8,6 @@ module Resourcelogic
8
8
  ACTIONS.each do |action|
9
9
  class_scoping_reader action, FAILABLE_ACTIONS.include?(action) ? FailableActionOptions.new : ActionOptions.new
10
10
  end
11
- class_scoping_reader :context, ContextOptions.new
12
11
  add_acts_as_resource_module(Methods)
13
12
  end
14
13
  end
@@ -153,7 +152,7 @@ module Resourcelogic
153
152
  end
154
153
 
155
154
  def load_parent
156
- instance_variable_set "@#{parent_model_name}", parent_object if parent?
155
+ instance_variable_set "@#{parent_model_name}", parent if parent?
157
156
  end
158
157
 
159
158
  # Used internally to load the member object in to an instance variable @#{model_name} (i.e. @post)
@@ -51,6 +51,8 @@ module Resourcelogic
51
51
  end
52
52
 
53
53
  module Config
54
+ # This really isn't needed thanks to the new parent_from_params? method.
55
+ # TODO: review this and remove it if neccessary.
54
56
  def path_alias(alias_name, model_name)
55
57
  current_aliases = path_aliases
56
58
  model_name = model_name.to_sym
@@ -8,9 +8,8 @@ module Resourcelogic # :nodoc:
8
8
  end
9
9
 
10
10
  module ClassMethods
11
- def acts_as_resource(&block)
11
+ def acts_as_resource
12
12
  resourceful(true)
13
- yield self if block_given?
14
13
  acts_as_resource_modules.each { |mod| include mod }
15
14
  init_default_actions
16
15
  end
@@ -43,12 +42,12 @@ module Resourcelogic # :nodoc:
43
42
  end
44
43
  end
45
44
 
46
- # Since this part of Authlogic deals with another class, ActiveRecord, we can't just start including things
47
- # in ActiveRecord itself. A lot of these module includes need to be triggered by the acts_as_authentic method
48
- # call. For example, you don't want to start adding in email validations and what not into a model that has
49
- # nothing to do with Authlogic.
45
+ # Since this part of Resourcelogic deals with another class, ActionController, we can't just start including things
46
+ # in ActionController itself. A lot of these module includes need to be triggered by the acts_as_resource method
47
+ # call. For example, you don't want to start adding in email validations and what not into a controller that has
48
+ # nothing to do with Resourcelogic.
50
49
  #
51
- # That being said, this is your tool for extending Authlogic and "hooking" into the acts_as_authentic call.
50
+ # That being said, this is your tool for extending Resourcelogic and "hooking" into the acts_as_resource call.
52
51
  def add_acts_as_resource_module(mod, action = :append)
53
52
  modules = acts_as_resource_modules
54
53
  case action
@@ -61,7 +60,7 @@ module Resourcelogic # :nodoc:
61
60
  write_inheritable_attribute(:acts_as_resource_modules, modules)
62
61
  end
63
62
 
64
- # This is the same as add_acts_as_authentic_module, except that it removes the module from the list.
63
+ # This is the same as add_acts_as_resource_module, except that it removes the module from the list.
65
64
  def remove_acts_as_resource_module(mod)
66
65
  write_inheritable_attribute(:acts_as_resource_modules, acts_as_resource_modules - [mod])
67
66
  acts_as_resource_modules
@@ -46,11 +46,6 @@ module Resourcelogic
46
46
  base_parts.pop if base_parts.last.is_a?(Hash)
47
47
  base_parts
48
48
  end
49
-
50
- #def current_object_to_use(url_params)
51
- # result = (url_params.key?("#{model_name}_id".to_sym) && url_params["#{model_name}_id".to_sym]) || (id? && object)
52
- # result ? result : nil
53
- #end
54
49
  end
55
50
  end
56
51
  end
@@ -1,5 +1,7 @@
1
1
  module Resourcelogic
2
2
  module Parent
3
+ class RequiredParentError < StandardError; end
4
+
3
5
  def self.included(klass)
4
6
  klass.class_eval do
5
7
  extend Config
@@ -7,46 +9,44 @@ module Resourcelogic
7
9
  add_acts_as_resource_module(Reflection)
8
10
  end
9
11
  end
10
-
12
+
11
13
  module Config
12
- def belongs_to(name = nil, options = {})
14
+ def belongs_to(*args)
15
+ options = args.extract_options!
13
16
  @belongs_to ||= {}
14
- if name.nil?
15
- @belongs_to
16
- else
17
- @belongs_to[name.to_sym] = options
18
- end
17
+ args.each { |name| @belongs_to[name.to_sym] = options }
18
+ @belongs_to
19
19
  end
20
-
20
+
21
21
  def require_parent(value = nil)
22
22
  rw_config(:require_parent, value, false)
23
23
  end
24
24
  end
25
-
25
+
26
26
  module Urls
27
27
  private
28
28
  def parent_url_parts(action = nil, url_params = {})
29
29
  [action] + contexts_url_parts + [url_params]
30
30
  end
31
-
31
+
32
32
  def parent_collection_url_parts(*args)
33
33
  parent_url_parts(*args)
34
34
  end
35
35
  end
36
-
36
+
37
37
  module Reflection
38
38
  def self.included(klass)
39
39
  klass.class_eval do
40
- helper_method :parent?, :parent_model_name, :parent_object
40
+ helper_method :parent?, :parent_model_name, :parent
41
41
  before_filter :require_parent
42
42
  end
43
43
  end
44
-
44
+
45
45
  private
46
46
  def belongs_to
47
47
  self.class.belongs_to
48
48
  end
49
-
49
+
50
50
  def parent_path_name
51
51
  return @parent_path_name if defined?(@parent_path_name)
52
52
  path_parts = request.path.split("/")
@@ -58,7 +58,7 @@ module Resourcelogic
58
58
  end
59
59
  @parent_path_name = nil
60
60
  end
61
-
61
+
62
62
  def parent_route_name
63
63
  return @parent_route_name if defined?(@parent_route_name)
64
64
  path_parts = request.path.split("/")
@@ -70,19 +70,19 @@ module Resourcelogic
70
70
  end
71
71
  @parent_route_name = parent_model_name
72
72
  end
73
-
73
+
74
74
  # Returns the type of the current parent
75
75
  #
76
76
  def parent_model_name
77
77
  return @parent_model_name if defined?(@parent_model_name)
78
- parent_from_path?
78
+ parent_from_path? || parent_from_params?
79
79
  @parent_model_name
80
80
  end
81
-
81
+
82
82
  def parent_model
83
83
  @parent_model ||= parent_model_name.to_s.camelize.constantize
84
84
  end
85
-
85
+
86
86
  # Returns the type of the current parent extracted form a request path
87
87
  #
88
88
  def parent_from_path?
@@ -99,44 +99,58 @@ module Resourcelogic
99
99
  end
100
100
  @parent_from_path = false
101
101
  end
102
-
102
+
103
+ # Returns the type of the current parent extracted form the request parameters
104
+ #
105
+ def parent_from_params?
106
+ return @parent_from_params if defined?(@parent_from_params)
107
+ belongs_to.each do |model_name, options|
108
+ if params["#{model_name}_id".to_sym]
109
+ @parent_model_name = model_name
110
+ return @parent_from_params = true
111
+ end
112
+ end
113
+ @parent_from_params = false
114
+ end
115
+
103
116
  # Returns true/false based on whether or not a parent is present.
104
117
  #
105
118
  def parent?
106
119
  !parent_model_name.nil?
107
120
  end
108
-
121
+
109
122
  # Returns true/false based on whether or not a parent is a singleton.
110
123
  #
111
124
  def parent_singleton?
112
125
  parent? && parent_id.nil?
113
126
  end
114
-
127
+
115
128
  # Returns the current parent param, if there is a parent. (i.e. params[:post_id])
116
129
  def parent_id
117
130
  params["#{parent_route_name}_id".to_sym]
118
131
  end
119
-
132
+
120
133
  # Returns the current parent object if a parent object is present.
121
134
  #
122
- def parent_object(reload = false)
123
- return @parent_object if !reload && defined?(@parent_object)
135
+ def parent(reload = false)
136
+ return @parent if !reload && defined?(@parent)
124
137
  if parent?
125
138
  if parent_singleton? && respond_to?("current_#{parent_model_name}", true)
126
- @parent_object = send("current_#{parent_model_name}")
139
+ @parent = send("current_#{parent_model_name}")
127
140
  elsif parent_singleton? && parent_scope.respond_to?(parent_model_name)
128
- @parent_object = parent_scope.send(parent_model_name, reload)
141
+ @parent = parent_scope.send(parent_model_name, reload)
129
142
  else
130
- @parent_object = parent_scope.find(parent_id)
143
+ @parent = parent_scope.find(parent_id)
131
144
  end
132
145
  else
133
- @parent_object = nil
146
+ @parent = nil
134
147
  end
135
148
  end
136
-
149
+
137
150
  def require_parent
138
- raise StandardError.new("A parent is required to access this resource and no parent was found") if !parent? && self.class.require_parent == true
151
+ raise RequiredParentError.new("A parent is required to access this resource and no parent was found") if !parent? && self.class.require_parent == true
139
152
  end
140
153
  end
141
154
  end
142
- end
155
+ end
156
+
@@ -18,7 +18,7 @@ module Resourcelogic
18
18
  return @scope if defined?(@scope)
19
19
 
20
20
  if parent?
21
- @scope = parent_object.send(parent_scope_name)
21
+ @scope = parent.send(parent_scope_name)
22
22
  else
23
23
  @scope = model
24
24
  end
@@ -109,7 +109,7 @@ module Resourcelogic
109
109
 
110
110
  # The current paremter than contains the object identifier.
111
111
  def id # :doc:
112
- params[:id]
112
+ params[:id]
113
113
  end
114
114
 
115
115
  def id?
@@ -15,8 +15,8 @@ module Resourcelogic
15
15
  if singleton?
16
16
  if !parent? && respond_to?("current_#{model_name}", true)
17
17
  @object = send("current_#{model_name}")
18
- elsif parent? && parent_object.send(model_name)
19
- @object = parent_object.send(model_name)
18
+ elsif parent? && parent.send(model_name)
19
+ @object = parent.send(model_name)
20
20
  else
21
21
  super
22
22
  end
@@ -35,7 +35,7 @@ module Resourcelogic
35
35
 
36
36
  def scope
37
37
  if singleton? && parent?
38
- parent_object
38
+ parent
39
39
  else
40
40
  super
41
41
  end
@@ -1,7 +1,7 @@
1
1
  module Resourcelogic
2
2
  module Urligence
3
3
  def self.included(klass)
4
- klass.helper_method :smart_url, :smart_path, :hash_for_smart_url, :hash_for_smart_path, :method_missing
4
+ klass.helper_method :smart_url, :smart_path, :method_missing
5
5
  end
6
6
 
7
7
  def smart_url(*url_parts)
@@ -18,35 +18,12 @@ module Resourcelogic
18
18
  urligence(*url_parts)
19
19
  end
20
20
 
21
- def hash_for_smart_url(*url_parts)
22
- urligence(*url_parts.unshift(:hash_for).push(:url).push({:type => :hash}))
23
- end
24
-
25
- def hash_for_smart_path(*url_parts)
26
- urligence(*url_parts.unshift(:hash_for).push(:path).push({:type => :hash}))
27
- end
28
-
29
21
  private
30
22
  def urligence(*url_parts)
31
23
  url_parts = cleanup_url_parts(url_parts)
32
24
  method_name_fragments = extract_method_name_fragments(url_parts)
33
25
  method_arguments = extract_method_arguments(url_parts)
34
-
35
- if url_parts.first != :hash_for
36
- send method_name_fragments.join("_"), *method_arguments
37
- else
38
- url_params = method_arguments.extract_options!
39
- params = {}
40
- method_arguments.each_with_index do |obj, i|
41
- key = i == (method_arguments.size - 1) ?
42
- :id :
43
- (obj.is_a?(Array) ? "#{obj.first}_id".to_sym : "#{obj.class.name.underscore}_id".to_sym)
44
- params.merge!((obj.is_a?(Array)) ? {key => obj[1].to_param} : {key => obj.to_param})
45
- end
46
-
47
- params.merge!(url_params)
48
- send method_name_fragments.join("_"), params
49
- end
26
+ send method_name_fragments.join("_"), *method_arguments
50
27
  end
51
28
 
52
29
  # The point of this method is to replace any object if a url param is passed. For example:
@@ -81,22 +58,32 @@ module Resourcelogic
81
58
  # It's not an array, just copy it over
82
59
  new_url_parts << object
83
60
  else
84
- # Let's try to
85
61
  klass = object.first.to_s.camelize.constantize rescue nil
86
- #klass_name = klass ? klass.name.underscore : nil
87
62
  params_key = "#{object.first}_id".to_sym
63
+
88
64
  obj = if url_params.key?(params_key)
89
- (!klass && url_params[params_key]) || (url_params[params_key] && klass.find(url_params.delete(params_key)))
65
+ if !klass
66
+ url_params[params_key]
67
+ elsif url_params[params_key]
68
+ klass.find(url_params.delete(params_key)
69
+ end
90
70
  else
91
71
  object[1]
92
72
  end
73
+
93
74
  new_url_parts << [object.first, obj]
94
- #new_url_parts << (obj.nil? ? object.first.to_s.pluralize.to_sym : [object.first, obj])
95
75
  end
96
76
  end
97
77
  new_url_parts
98
78
  end
99
79
 
80
+ # Extracts the parts from the url_parts that make up the method name
81
+ #
82
+ # [:admin, [:user, user_object], :path]
83
+ #
84
+ # to:
85
+ #
86
+ # [:admin, :user, :path]
100
87
  def extract_method_name_fragments(url_parts)
101
88
  fragments = url_parts.collect do |obj|
102
89
  if obj.is_a?(Symbol)
@@ -110,10 +97,29 @@ module Resourcelogic
110
97
  fragments.compact
111
98
  end
112
99
 
100
+ # Extracts the parts from url_parts that make up the method arguments
101
+ #
102
+ # [:admin, [:user, user_object], :path]
103
+ #
104
+ # to:
105
+ #
106
+ # [user_object]
113
107
  def extract_method_arguments(url_parts)
114
108
  url_parts.flatten.select { |obj| !obj.is_a?(Symbol) }
115
109
  end
116
110
 
111
+ # Dynamically generate url methods for better flexibility. This allows us to not only call the standard urls:
112
+ #
113
+ # edit_object_path
114
+ # object_path
115
+ #
116
+ # but also be able to call custom method paths:
117
+ #
118
+ # select_object_path
119
+ #
120
+ # Where select is a method added yourself:
121
+ #
122
+ # map.resources :users, :member => {:select => :any}
117
123
  def method_missing(method, *args, &block)
118
124
  if method.to_s =~ /^((.*)_)?(child_collection|parent_collection|sibling|sibling_collection)_(path|url)$/ || method.to_s =~ /^((.*)_)?(child|collection|object|parent)_(path|url)$/
119
125
  action = $2.blank? ? nil : $2.to_sym
@@ -1,12 +1,15 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{resourcelogic}
5
- s.version = "0.12.2"
8
+ s.version = "0.12.3"
6
9
 
7
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
11
  s.authors = ["Ben Johnson of Binary Logic"]
9
- s.date = %q{2009-07-16}
12
+ s.date = %q{2009-08-12}
10
13
  s.email = %q{bjohnson@binarylogic.com}
11
14
  s.extra_rdoc_files = [
12
15
  "LICENSE",
@@ -14,7 +17,6 @@ Gem::Specification.new do |s|
14
17
  ]
15
18
  s.files = [
16
19
  ".gitignore",
17
- "CHANGELOG.rdoc",
18
20
  "LICENSE",
19
21
  "README.rdoc",
20
22
  "Rakefile",
@@ -28,7 +30,6 @@ Gem::Specification.new do |s|
28
30
  "lib/resourcelogic/base.rb",
29
31
  "lib/resourcelogic/child.rb",
30
32
  "lib/resourcelogic/context.rb",
31
- "lib/resourcelogic/context_options.rb",
32
33
  "lib/resourcelogic/failable_action_options.rb",
33
34
  "lib/resourcelogic/parent.rb",
34
35
  "lib/resourcelogic/response_collector.rb",
@@ -44,7 +45,7 @@ Gem::Specification.new do |s|
44
45
  s.rdoc_options = ["--charset=UTF-8"]
45
46
  s.require_paths = ["lib"]
46
47
  s.rubyforge_project = %q{resourcelogic}
47
- s.rubygems_version = %q{1.3.4}
48
+ s.rubygems_version = %q{1.3.5}
48
49
  s.summary = %q{Removes the need to namespace controllers by adding context and relative url functions among other things.}
49
50
 
50
51
  if s.respond_to? :specification_version then
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.12.2
4
+ version: 0.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Johnson of Binary Logic
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-16 00:00:00 -04:00
12
+ date: 2009-08-12 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,6 @@ extra_rdoc_files:
33
33
  - README.rdoc
34
34
  files:
35
35
  - .gitignore
36
- - CHANGELOG.rdoc
37
36
  - LICENSE
38
37
  - README.rdoc
39
38
  - Rakefile
@@ -47,7 +46,6 @@ files:
47
46
  - lib/resourcelogic/base.rb
48
47
  - lib/resourcelogic/child.rb
49
48
  - lib/resourcelogic/context.rb
50
- - lib/resourcelogic/context_options.rb
51
49
  - lib/resourcelogic/failable_action_options.rb
52
50
  - lib/resourcelogic/parent.rb
53
51
  - lib/resourcelogic/response_collector.rb
@@ -82,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
80
  requirements: []
83
81
 
84
82
  rubyforge_project: resourcelogic
85
- rubygems_version: 1.3.4
83
+ rubygems_version: 1.3.5
86
84
  signing_key:
87
85
  specification_version: 3
88
86
  summary: Removes the need to namespace controllers by adding context and relative url functions among other things.
@@ -1,3 +0,0 @@
1
- == 0.0.9
2
-
3
- * Initial release, beta.
@@ -1,5 +0,0 @@
1
- module Resourcelogic
2
- class ContextOptions
3
- extend Resourcelogic::Accessors
4
- end
5
- end