motr-cargo 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.
data/Rakefile CHANGED
@@ -6,8 +6,6 @@ rescue LoadError
6
6
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
7
  end
8
8
 
9
- require 'bundler'
10
- Bundler.setup
11
9
  Bundler::GemHelper.install_tasks
12
10
 
13
11
 
@@ -23,7 +21,7 @@ Rake::TestTask.new(:test) do |t|
23
21
  t.verbose = false
24
22
  end
25
23
 
26
- task :default => :test
24
+ #task :default => :test
27
25
 
28
26
  Rake::RDocTask.new(:rdoc) do |rdoc|
29
27
  rdoc.rdoc_dir = 'rdoc'
@@ -0,0 +1,12 @@
1
+ class Motr::CargoContextsController < ApplicationController
2
+
3
+ include Motr::Cargo::Delivery::Helpers
4
+
5
+ before_filter :authenticate_for_cargo!
6
+ respond_to :js, :json
7
+
8
+ def index
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,8 @@
1
+ class Motr::CargoController < ApplicationController
2
+
3
+ def self.inherited(base)
4
+ super
5
+ base.send(:delivers_cargo)
6
+ end
7
+
8
+ end
data/lib/motr-cargo.rb CHANGED
@@ -1,19 +1,20 @@
1
1
  require 'motr'
2
- require 'motr/modding'
2
+ require 'motr/modding'
3
+ require 'motr/cargo/package'
4
+ require 'motr/cargo/context'
5
+ require 'motr/cargo/delivery'
3
6
 
4
7
  module Motr
5
8
  module Cargo
6
- VERSION = '0.0.1'
7
-
8
- module Package
9
- autoload :Mongoid, 'motr/cargo/package/mongoid'
10
- end
11
-
12
- module Context
13
- autoload :Mongoid, 'motr/cargo/context/mongoid'
14
- end
9
+ VERSION = '0.0.2'
10
+ end
15
11
 
12
+ module Controller
13
+ autoload :CargoHelpers, 'motr/controller/cargo_helpers'
16
14
  end
17
15
  end
18
16
 
19
- Motr.add_mod(:cargo, :autoload => true)
17
+ Motr.add_mod(:cargo, :autoload => true)
18
+ Motr.apply_helpers(Motr::Controller::CargoHelpers)
19
+
20
+ require 'motr/rails/cargo_routing'
@@ -0,0 +1,72 @@
1
+ module Motr
2
+ module Cargo
3
+ ##
4
+ # Defines base functionality for contexts
5
+ # When applied a package will accept_nested_attributes_for :context_name, and each context
6
+ # will ensure that, when created, it sets its position to the end of the context list.
7
+ #
8
+ module Context
9
+
10
+ autoload :Mongoid, 'motr/cargo/context/mongoid'
11
+
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ class_attribute(:cargo_packages, :instance_writer => false) unless self.respond_to?(:cargo_packages)
16
+ self.cargo_packages ||= []
17
+
18
+ mod_opts = cargo_mod_options
19
+ cname = self.name.to_s.pluralize.underscore
20
+ orm_const = self.motr_orm_type.to_s.classify
21
+ packs = [mod_opts[:for]].flatten.compact
22
+
23
+ create_mod_attribute!(:name, String)
24
+ create_mod_attribute!(:body, String)
25
+ create_mod_attribute!(:meta, Hash)
26
+
27
+ raise Motr::Errors::InvalidOptions.new("Missing :for option when defining a Motr::Cargo context") if packs.empty?
28
+ include Motr::Cargo::Context.const_get(orm_const)
29
+
30
+ packs.each do |cargo|
31
+ send :cargo_context_belongs_to, :"#{cargo}"
32
+ cargo_class = cargo.to_s.classify.constantize
33
+ cargo_class.class_eval do
34
+
35
+ ## Ensure the package module has been initialized
36
+ self.send(:modded_with, :cargo) unless self.motr_mods.include?(:cargo)
37
+ self.cargo_contexts << cname
38
+
39
+ ## Packages shuold always accept nested contexts
40
+ send :accepts_nested_attributes_for, :"#{cname}", :allow_delete => true
41
+ send :cargo_context_has_many, :"#{cname}"
42
+
43
+ end
44
+
45
+ end
46
+
47
+ self.cargo_packages |= packs
48
+ before_create :ensure_context_position_value
49
+
50
+ end
51
+
52
+ ##
53
+ # Ensure new contexts are added to the end of the context list.
54
+ #
55
+ def ensure_context_position_value
56
+ return true unless self.position.nil?
57
+ self.position = _parent.send(:"#{self.class.name.pluralize.underscore}").count + 1
58
+ end
59
+
60
+ ##
61
+ # Defines a name to represent the context. When the name attribute is set, it is used, if not
62
+ # the class name is used.
63
+ #
64
+ def context_name
65
+ (self.name.blank? ? self.class.name : self.name)
66
+ end
67
+
68
+ end
69
+
70
+ end
71
+ end
72
+
@@ -1,33 +1,13 @@
1
1
  module Motr
2
2
  module Cargo::Context
3
-
4
- module Mongoid
3
+ # @private
4
+ module Mongoid #:nodoc:
5
5
  extend ActiveSupport::Concern
6
6
 
7
- included do
8
- mod_opts = cargo_mod_options
9
-
10
- field :name, :type => String
11
- field :body, :type => String
12
- field :meta, :type => Hash
13
-
14
- cname = self.name.to_s.pluralize.underscore
15
- packs = [mod_opts[:for]].flatten.compact
16
- if packs.empty?
17
- raise Motr::Errors::InvalidOptions.new("Missing :for option when defining a Motr::Cargo context")
18
- end
19
- # Define relationships on each cargo object
20
- #
21
- packs.flatten.compact.each do |cargo|
22
- send(:embedded_in, :"#{cargo.to_s}")
23
- cargo.to_s.classify.constantize.class_eval do
24
- send(:embeds_many, :"#{cname}")
25
- end
26
- end
27
-
7
+ included do
28
8
  end
29
9
 
30
- end
10
+ end # end mod
31
11
 
32
12
  end
33
13
  end
@@ -0,0 +1,28 @@
1
+ module Motr
2
+ module Cargo
3
+ module Delivery
4
+ extend ActiveSupport::Concern
5
+
6
+ autoload :Helpers, 'motr/cargo/delivery/helpers'
7
+ autoload :Templating, 'motr/cargo/delivery/templating'
8
+ autoload :Actions, 'motr/cargo/delivery/actions'
9
+
10
+ included do
11
+ include Motr::Cargo::Delivery::Templating
12
+ include Motr::Cargo::Delivery::Helpers
13
+ include Motr::Cargo::Delivery::Actions
14
+ before_filter :authenticate_for_cargo!, :except => [:index, :show]
15
+ respond_to :html if self.mimes_for_respond_to.empty?
16
+ end
17
+
18
+ ##
19
+ # Actions for creating/updating/deleting content are more than likely protected.
20
+ # Overriding this method allows authentication checking to be performed.
21
+ #
22
+ def authenticate_for_cargo!
23
+ true
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ module Motr::Cargo
2
+ module Delivery
3
+
4
+ module Actions
5
+
6
+ def index
7
+ resource = scope_class.all
8
+ set_instance_var(resource)
9
+ respond_with(get_instance_var)
10
+ end
11
+
12
+ def show
13
+
14
+ end
15
+
16
+ def new
17
+
18
+ end
19
+
20
+ def create
21
+
22
+ end
23
+
24
+ def edit
25
+
26
+ end
27
+
28
+ def update
29
+
30
+ end
31
+
32
+ def destroy
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,57 @@
1
+ module Motr::Cargo
2
+ module Delivery
3
+ # @private
4
+ module Helpers #:nodoc:
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ helper_method :cargo_context_path, :cargo_contexts_path, :cargo_context_url, :cargo_contexts_url,
9
+ :edit_cargo_context_path, :edit_cargo_context_url, :scope_name, :scope_class
10
+ end
11
+
12
+ def cargo_context_path(pack, context, options = {})
13
+ motr_cargo_context_path(pack.class.name.to_s, pack.id, context.id, options)
14
+ end
15
+
16
+ def cargo_context_url(pack, context, options = {})
17
+ motr_cargo_context_url(pack.class.name.to_s, pack.id, context.id, options)
18
+ end
19
+
20
+ def cargo_contexts_path(pack, options = {})
21
+ motr_cargo_contexts_path(pack.scope_type, pack.id, options)
22
+ end
23
+
24
+ def cargo_contexts_url(pack, options = {})
25
+ motr_cargo_contexts_url(pack.scope_type, pack.id, options)
26
+ end
27
+
28
+ def edit_cargo_context_path(pack, context, options = {})
29
+ edit_motr_cargo_context_path(pack.class.name.to_s, pack.id, context.id, options)
30
+ end
31
+
32
+ def edit_cargo_context_url(pack, context, options = {})
33
+ edit_motr_cargo_context_url(pack.class.name.to_s, pack.id, context.id, options)
34
+ end
35
+
36
+ def scope_name
37
+ (action_name.to_s === 'index' ? scope_class.to_s.pluralize : scope_class.to_s).underscore
38
+ end
39
+
40
+ def scope_class
41
+ (params[:scope_name] || self.class.to_s.split("::").first.gsub(/controller/i, '').singularize).constantize
42
+ end
43
+
44
+ private
45
+
46
+ def get_instance_var
47
+ instance_variable_get("@#{scope_name}")
48
+ end
49
+
50
+ def set_instance_var(obj)
51
+ instance_variable_set("@#{scope_name}", obj)
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,6 @@
1
+ module Motr::Cargo
2
+ module Delivery
3
+ module Templating
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,37 @@
1
+ module Motr
2
+ module Cargo
3
+
4
+ module Package
5
+
6
+ autoload :Mongoid, 'motr/cargo/package/mongoid'
7
+
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ class_attribute(:cargo_contexts, :instance_writer => false) unless self.respond_to?(:cargo_contexts)
12
+ self.cargo_contexts ||= []
13
+ orm_const = self.motr_orm_type.to_s.classify
14
+ send(:include, Motr::Cargo::Package.const_get(orm_const))
15
+ create_mod_attribute!(:title, String)
16
+ create_mod_attribute!(:post_date, Date)
17
+ create_mod_attribute!(:published, Boolean)
18
+ attr_accessor :cargo
19
+ end
20
+
21
+ ##
22
+ # The cargo method handles "rendering" the particular package.
23
+ # This data should be defined in the cargo "show" action.
24
+ #
25
+ def cargo=(cargo_data)
26
+ @cargo
27
+ end
28
+
29
+ def cargo
30
+ @cargo
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
37
+
@@ -1,15 +1,12 @@
1
1
  module Motr
2
2
  module Cargo::Package
3
-
4
- module Mongoid
3
+ # @private
4
+ module Mongoid #:nodoc:
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- field :title, :type => String
9
- field :post_date, :type => Time
10
- field :published, :type => Boolean
11
- field :uid, :type => Integer
12
-
8
+ include ::Mongoid::MultiParameterAttributes
9
+ field :uid, :type => Integer
13
10
  before_save :generate_cargo_uid
14
11
  end
15
12
 
@@ -0,0 +1,45 @@
1
+ module Motr
2
+ module Controller
3
+
4
+ module CargoHelpers
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ class_attribute :motr_cargo_classes, :instance_writer => false
9
+ self.motr_cargo_classes ||= []
10
+ end
11
+
12
+ module ClassMethods
13
+ ##
14
+ # Configures models a particular controller "delivers".
15
+ # By default cargo considers the controller name to be the resource name
16
+ # that it is to serve. Calling delivers_cargo_for allows the controller to
17
+ # find objects based on object_id parameters.
18
+ #
19
+ # @param [Symbol,Array] *resources The resources/models this controller delivers
20
+ #
21
+ # @example Configure a Posts controller to deliver resources for Blog and Article
22
+ # class PostsController < Motr::CargosController
23
+ # delivers_cargo_for :blog, :article
24
+ # end
25
+ #
26
+ def delivers_cargo_for(*resources)
27
+ options = resources.extract_options!
28
+ self.motr_cargo_classes |= resources
29
+ end
30
+
31
+ ##
32
+ # Normally you would have your controllers extend Motr::CargoController,
33
+ # in the event this isn't possible, calling delivers_cargo will ensure
34
+ # the proper functionality exists.
35
+ #
36
+ def delivers_cargo
37
+ include Motr::Cargo::Delivery
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
@@ -38,13 +38,26 @@ module Motr
38
38
 
39
39
  options(:for, :as)
40
40
 
41
- configure(:mongoid) do
41
+ configure do
42
42
  mod_opts = cargo_mod_options
43
- unless mod_opts.key?(:as) && mod_opts[:as].to_s.match(/context/i)
44
- self.send(:include, Motr::Cargo::Package::Mongoid)
43
+ unless mod_opts.key?(:as) && mod_opts[:as].to_s.match(/context/i)
44
+ include Motr::Cargo::Package
45
45
  else
46
- puts 'called context'
47
- self.send(:include, Motr::Cargo::Context::Mongoid)
46
+ include Motr::Cargo::Context
47
+ end
48
+ end
49
+
50
+ configure(:mongoid) do
51
+ class << self
52
+ alias :cargo_context_belongs_to :embedded_in
53
+ alias :cargo_context_has_many :embeds_many
54
+ end
55
+ end
56
+
57
+ configure(:active_record) do
58
+ class << self
59
+ alias :cargo_context_belongs_to :belongs_to
60
+ alias :cargo_context_has_many :has_many
48
61
  end
49
62
  end
50
63
 
@@ -0,0 +1,33 @@
1
+ module ActionDispatch::Routing
2
+ class Mapper
3
+ attr_accessor :cargo_context_routes_set
4
+ ##
5
+ # Calling deliver_cargo_for within routes sets up routing for each
6
+ # cargo model. By default all passed models are routed with:
7
+ # :controller => 'motr/cargo
8
+ # :scope_name => 'ModelName'
9
+ #
10
+ # Override these options when configuring if you would prefer a different controller/scope name
11
+ #
12
+ def deliver_cargo_for(*models)
13
+
14
+ options = models.extract_options!
15
+ models.map!(&:to_sym).each do |mod|
16
+ sing = ActiveSupport::Inflector.singularize(mod.to_s)
17
+ plural = ActiveSupport::Inflector.pluralize(mod.to_s)
18
+ resources *[plural, options.reverse_merge(:controller => 'motr/cargo', :scope_name => "#{sing.classify}")]
19
+ end
20
+
21
+ unless @cargo_context_routes_set
22
+ scope :controller => 'motr/cargo_contexts' do
23
+ get 'motr/cargo/:scope_name/:scope_id/contexts', :action => :index, :as => :motr_cargo_contexts
24
+ get 'motr/cargo/:scope_name/:scope_id/contexts/:id/edit', :action => :edit, :as => :edit_motr_cargo_context
25
+ put 'motr/cargo/:scope_name/:scope_id/contexts/:id', :action => :update, :as => :motr_cargo_context
26
+ delete 'motr/cargo/:scope_name/:scope_id/contexts/:id', :action => :destroy, :as => :motr_cargo_context
27
+ end
28
+ @cargo_context_routes_set = true
29
+ end
30
+ end
31
+
32
+ end
33
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: motr-cargo
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.1
5
+ version: 0.0.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brent Kirby
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-20 00:00:00 -04:00
13
+ date: 2011-05-24 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -144,9 +144,19 @@ extensions: []
144
144
  extra_rdoc_files: []
145
145
 
146
146
  files:
147
+ - app/controllers/motr/cargo_contexts_controller.rb
148
+ - app/controllers/motr/cargo_controller.rb
147
149
  - lib/motr/cargo/context/mongoid.rb
150
+ - lib/motr/cargo/context.rb
151
+ - lib/motr/cargo/delivery/actions.rb
152
+ - lib/motr/cargo/delivery/helpers.rb
153
+ - lib/motr/cargo/delivery/templating.rb
154
+ - lib/motr/cargo/delivery.rb
148
155
  - lib/motr/cargo/package/mongoid.rb
156
+ - lib/motr/cargo/package.rb
157
+ - lib/motr/controller/cargo_helpers.rb
149
158
  - lib/motr/mods/cargo.rb
159
+ - lib/motr/rails/cargo_routing.rb
150
160
  - lib/motr-cargo.rb
151
161
  - MIT-LICENSE
152
162
  - Rakefile
@@ -166,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
176
  requirements:
167
177
  - - ">="
168
178
  - !ruby/object:Gem::Version
169
- hash: -1531469132394986629
179
+ hash: 2143364796700752731
170
180
  segments:
171
181
  - 0
172
182
  version: "0"
@@ -175,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
185
  requirements:
176
186
  - - ">="
177
187
  - !ruby/object:Gem::Version
178
- hash: -1531469132394986629
188
+ hash: 2143364796700752731
179
189
  segments:
180
190
  - 0
181
191
  version: "0"