motr 0.0.3 → 0.0.4
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/Gemfile +10 -1
- data/README.rdoc +9 -2
- data/Rakefile +8 -0
- data/app/helpers/motr_helper.rb +0 -6
- data/lib/motr.rb +60 -12
- data/lib/motr/controller/helpers.rb +83 -0
- data/lib/motr/controller/responder.rb +7 -7
- data/lib/motr/defaults.rb +1 -0
- data/lib/motr/errors/invalid_options.rb +1 -1
- data/lib/motr/errors/module_missing.rb +13 -0
- data/lib/motr/forms.rb +1 -1
- data/lib/motr/forms/base.rb +3 -2
- data/lib/motr/forms/builder.rb +5 -4
- data/lib/motr/helpers/navigation.rb +1 -0
- data/lib/motr/model.rb +124 -0
- data/lib/motr/model/sluggable.rb +45 -0
- data/lib/motr/orm/active_record.rb +16 -0
- data/lib/motr/orm/mongoid.rb +13 -0
- data/lib/motr/rails.rb +11 -4
- data/lib/motr/version.rb +1 -1
- metadata +10 -4
- data/lib/motr/controller/script_events.rb +0 -77
data/Gemfile
CHANGED
@@ -5,9 +5,18 @@ gem "capybara", ">= 0.4.0"
|
|
5
5
|
gem "sqlite3-ruby"
|
6
6
|
gem "rspec-rails"
|
7
7
|
gem "mocha","0.9.12"
|
8
|
+
gem "minitest"
|
9
|
+
|
10
|
+
group :mongoid do
|
11
|
+
gem 'mongo', '~> 1.3'
|
12
|
+
gem 'bson_ext', '~> 1.3'
|
13
|
+
gem 'mongoid', '~> 2.0'
|
14
|
+
end
|
8
15
|
|
9
16
|
group :test do
|
17
|
+
gem "colored"
|
18
|
+
gem 'shoulda-context'
|
10
19
|
gem 'fabrication', '0.9.5'
|
11
20
|
gem 'ffaker', '1.5.0'
|
12
|
-
gem 'spork', '~> 0.9.0.rc'
|
21
|
+
gem 'spork', '~> 0.9.0.rc', :require => false
|
13
22
|
end
|
data/README.rdoc
CHANGED
@@ -2,8 +2,11 @@
|
|
2
2
|
|
3
3
|
{Official Documentation}[http://rubydoc.info/github/kurbmedia/motr/master/frames]
|
4
4
|
|
5
|
-
Motr is a basic Rails engine which adds additional functionality to your applications
|
6
|
-
|
5
|
+
Motr is a basic Rails engine which adds additional functionality to your applications, and creates the ability to "extend" models
|
6
|
+
easily to support routine functionality. The {core Motr}[http://github.com/kurbmedia/motr] engine
|
7
|
+
provides a number of helpers and functionality geared towards bringing the ease of Rails back-end development, to the front-end. It
|
8
|
+
also implements a {Devise}[https://github.com/plataformatec/devise] inspired "hook" system to support easily adding data functionality to
|
9
|
+
models in a similar manner to how Devise adds session management functionality.
|
7
10
|
|
8
11
|
Rails view helpers and form builders are convenient an easy to use, however some aren't very design/html friendly (whose idea was it to
|
9
12
|
wrap fields with errors in a div?). The goal is to keep html valid and sensible where possible, and make things like javascript integration
|
@@ -18,6 +21,10 @@ Motr is maintained and funded by {kurb media}[http://kurbmedia.com/], and was de
|
|
18
21
|
opinionated in how it works. However, additions / enhancements / alternative methods are more than welcome and encouraged. We also welcome
|
19
22
|
feature requests, especially from designers/front-end developers who spend a lot of time working along-side Rails developers.
|
20
23
|
|
24
|
+
== Credits
|
25
|
+
|
26
|
+
Thanks to José Valim and {Devise}[https://github.com/plataformatec/devise] which inspired the model hook functionality.
|
27
|
+
|
21
28
|
== License
|
22
29
|
|
23
30
|
Motr is Copyright © 2010-2011 kurb media, llc.
|
data/Rakefile
CHANGED
@@ -13,11 +13,19 @@ require 'rake/rdoctask'
|
|
13
13
|
|
14
14
|
require 'rspec/core'
|
15
15
|
require 'rspec/core/rake_task'
|
16
|
+
require 'rake/testtask'
|
16
17
|
|
17
18
|
RSpec::Core::RakeTask.new(:spec)
|
18
19
|
|
19
20
|
task :default => :spec
|
20
21
|
|
22
|
+
Rake::TestTask.new(:test) do |t|
|
23
|
+
t.libs << 'lib'
|
24
|
+
t.libs << 'test'
|
25
|
+
t.pattern = 'test/**/*_test.rb'
|
26
|
+
t.verbose = false
|
27
|
+
end
|
28
|
+
|
21
29
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
22
30
|
rdoc.rdoc_dir = 'rdoc'
|
23
31
|
rdoc.title = 'motr'
|
data/app/helpers/motr_helper.rb
CHANGED
data/lib/motr.rb
CHANGED
@@ -3,35 +3,83 @@ require 'active_support/dependencies'
|
|
3
3
|
require 'set'
|
4
4
|
|
5
5
|
require 'motr/forms'
|
6
|
+
require 'motr/model'
|
6
7
|
|
7
8
|
module Motr
|
8
|
-
|
9
|
-
module Controller
|
10
|
-
autoload :
|
11
|
-
autoload :
|
9
|
+
|
10
|
+
module Controller #:nodoc:
|
11
|
+
autoload :Helpers, 'motr/controller/helpers'
|
12
|
+
autoload :Responder, 'motr/controller/responder'
|
12
13
|
end
|
13
|
-
|
14
|
-
module Helpers
|
14
|
+
|
15
|
+
module Helpers #:nodoc:
|
15
16
|
autoload :LayoutHelpers, 'motr/helpers/layout_helpers'
|
16
17
|
autoload :Navigation, 'motr/helpers/navigation'
|
17
18
|
autoload :Elements, 'motr/helpers/elements'
|
18
19
|
end
|
19
20
|
|
20
|
-
module Errors
|
21
|
+
module Errors #:nodoc:
|
21
22
|
autoload :MotrError, 'motr/errors/motr_error'
|
22
23
|
autoload :InvalidOptions, 'motr/errors/invalid_options'
|
24
|
+
autoload :ModuleMissing, 'motr/errors/module_missing'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Store configurations for included models
|
28
|
+
ALL = []
|
29
|
+
CONFIGS = {}
|
30
|
+
|
31
|
+
##
|
32
|
+
#
|
33
|
+
# Enable adding models to the core Motr library. These modules
|
34
|
+
# can then be included/initialized using the +motr+ method.
|
35
|
+
#
|
36
|
+
# @param [Symbol] module_name The name of the module to be added (underscored)
|
37
|
+
# @param [Hash] config Default configuration options for the module
|
38
|
+
#
|
39
|
+
# @option config [String, Boolean] :autoload The path to autoload the module from (optional)
|
40
|
+
#
|
41
|
+
# All other configuration options are considered default options for that particular module.
|
42
|
+
#
|
43
|
+
#
|
44
|
+
def self.add_module(module_name, config = {})
|
45
|
+
|
46
|
+
# Store a reference to any module loaded
|
47
|
+
ALL << module_name
|
48
|
+
config.assert_valid_keys(:autoload)
|
49
|
+
|
50
|
+
const_name = ActiveSupport::Inflector.camelize(module_name.to_s)
|
51
|
+
|
52
|
+
# Setup autoloading for this module if necessary
|
53
|
+
if autoload_path = config.delete(:autoload)
|
54
|
+
path = (autoload_path == true ? "motr/model/#{module_name.to_s}" : autoload_path)
|
55
|
+
Motr::Model.send(:autoload, const_name, path)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Setup placeholder for configuration
|
59
|
+
Motr::CONFIGS[module_name] ||= {}
|
60
|
+
|
61
|
+
# Setup configuration method for module.
|
62
|
+
#
|
63
|
+
self.class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
64
|
+
def self.#{module_name.to_s}(options = {})
|
65
|
+
raise Motr::Errors::InvalidOptions.new('Configuration for #{module_name} must be a hash.') unless options.is_a?(Hash)
|
66
|
+
Motr::CONFIGS[:#{module_name.to_s}].merge!(options)
|
67
|
+
end
|
68
|
+
METHOD
|
69
|
+
|
70
|
+
# Apply any defaults
|
71
|
+
Motr.send(:"#{module_name}", config)
|
72
|
+
|
23
73
|
end
|
24
74
|
|
25
75
|
# Support initializer configuration
|
76
|
+
# @private
|
77
|
+
#
|
26
78
|
def self.configure #:nodoc:
|
27
79
|
yield self
|
28
80
|
end
|
29
81
|
|
30
|
-
# Support configuration of the forms module
|
31
|
-
def self.forms #:nodoc:
|
32
|
-
yield Motr::Forms
|
33
|
-
end
|
34
|
-
|
35
82
|
end
|
36
83
|
|
84
|
+
require 'motr/defaults'
|
37
85
|
require 'motr/rails'
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'action_controller/base'
|
2
|
+
|
3
|
+
module Motr
|
4
|
+
module Controller
|
5
|
+
|
6
|
+
module Helpers
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
after_filter :generate_ajax_headers
|
11
|
+
class_attribute :response_metadata
|
12
|
+
self.response_metadata = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# Generates additional header information for ajax requests, to allow more flexibility in
|
17
|
+
# handling responses. It simply creates a X-Response-Meta header in the response which contains
|
18
|
+
# a json object representing the requested controller and action name, as well as any user defined metadata set with +add_response_meta+
|
19
|
+
#
|
20
|
+
# @see Motr#Controller#Helpers#add_response_meta
|
21
|
+
# @private
|
22
|
+
#
|
23
|
+
def generate_ajax_headers #:nodoc:
|
24
|
+
return true unless response.content_type.to_s.match(/javascript/i)
|
25
|
+
|
26
|
+
response_params = request.filtered_parameters.dup
|
27
|
+
controller_name = response_params.delete('controller').to_s.underscore
|
28
|
+
action_name = response_params.delete('action').to_s
|
29
|
+
|
30
|
+
parsed_meta = self.class.response_metadata
|
31
|
+
parsed_meta = case parsed_meta
|
32
|
+
when Symbol then send(parsed_meta)
|
33
|
+
when Proc then parsed_meta.call
|
34
|
+
else parsed_meta
|
35
|
+
end
|
36
|
+
|
37
|
+
meta_info = {
|
38
|
+
:pathinfo => "#{controller_name}##{action_name}",
|
39
|
+
:meta => parsed_meta
|
40
|
+
}
|
41
|
+
response.header['X-Response-Meta'] = meta_info.to_json
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
module ClassMethods #:nodoc:
|
46
|
+
|
47
|
+
##
|
48
|
+
# Adds additional "meta" information to AJAX response headers. By default an additional
|
49
|
+
# X-Response-Meta header is added to ajax requests which describes the current controller/action names. Passing
|
50
|
+
# additional information to this method adds data to that header.
|
51
|
+
#
|
52
|
+
# @param [Hash,Proc,Symbol] options Information to be added to the response header. If a hash is used, the data is passed
|
53
|
+
# directly. If a symbol is used, it is considered an instance method to be called on the controller. If a proc is used
|
54
|
+
# it is evaluated when the data is built. NOTE: Procs/methods are called AFTER actions are run. This way action data can be used.
|
55
|
+
#
|
56
|
+
# @example Add a "post_name" meta
|
57
|
+
#
|
58
|
+
# class PostsController < ApplicationController
|
59
|
+
# add_response_meta { :post_name => 'This post is awesome' }
|
60
|
+
# end
|
61
|
+
# * index action run *
|
62
|
+
#
|
63
|
+
# 'X-Response-Meta' #=> { :pathinfo => 'posts#index', :meta => { :post_name => 'This post is awesome' } }
|
64
|
+
#
|
65
|
+
#
|
66
|
+
def add_response_meta(options)
|
67
|
+
self.response_metadata = options
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# @deprecated Use add_response_meta
|
72
|
+
#
|
73
|
+
def enable_script_events(opts = {})
|
74
|
+
ActiveSupport::Deprecation.issue_warning("enable_script_events is deprecated. Please use the 'add_response_meta helper'")
|
75
|
+
response_metadata = opts
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
@@ -1,20 +1,19 @@
|
|
1
1
|
require 'action_controller/base'
|
2
2
|
|
3
3
|
module Motr
|
4
|
-
module Controller
|
4
|
+
module Controller #:nodoc:
|
5
5
|
|
6
6
|
##
|
7
7
|
#
|
8
8
|
# A custom responder which extends the default functionality of respond_with to handle
|
9
9
|
# more advanced javascript functionality, as well as flash messages.
|
10
10
|
#
|
11
|
-
#
|
11
|
+
# @see The ActionController::Metal::Responder (https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/responder.rb) for more info
|
12
12
|
#
|
13
|
-
|
14
|
-
#
|
15
|
-
class Responder < ActionController::Responder
|
13
|
+
class Responder < ActionController::Responder #:nodoc:
|
16
14
|
|
17
|
-
|
15
|
+
# @private
|
16
|
+
def initialize(controller, resources, options = {})
|
18
17
|
super
|
19
18
|
flash = (format == :js) ? controller.flash : controller.flash.now
|
20
19
|
[:success, :notice, :error].each do |key|
|
@@ -24,8 +23,9 @@ module Motr
|
|
24
23
|
|
25
24
|
##
|
26
25
|
# Override to_js to set a +X-Flash-Messages+ header to be utilized by an ajax response.
|
26
|
+
# @private
|
27
27
|
#
|
28
|
-
def to_js
|
28
|
+
def to_js
|
29
29
|
flash = controller.flash.now
|
30
30
|
controller.response['X-Flash-Messages'] = flash.to_json if [:success, :notice, :error].detect{ |key| flash[key].present? }
|
31
31
|
defined?(super) ? super : to_format
|
@@ -0,0 +1 @@
|
|
1
|
+
Motr.add_module(:sluggable, :autoload => true)
|
data/lib/motr/forms.rb
CHANGED
data/lib/motr/forms/base.rb
CHANGED
@@ -5,7 +5,7 @@ module Motr
|
|
5
5
|
##
|
6
6
|
# Base class for creating form builders
|
7
7
|
#
|
8
|
-
class Base < ActionView::Helpers::FormBuilder
|
8
|
+
class Base < ActionView::Helpers::FormBuilder #:nodoc:
|
9
9
|
|
10
10
|
# Access the template object
|
11
11
|
attr_accessor :template
|
@@ -17,6 +17,7 @@ module Motr
|
|
17
17
|
|
18
18
|
|
19
19
|
# Overrides fields_for to make sure the form builder is set properly
|
20
|
+
#
|
20
21
|
def fields_for(record_or_name_or_array, *args, &block) #:nodoc:
|
21
22
|
opts = args.extract_options!
|
22
23
|
opts[:builder] ||= Motr::Forms.default_builder
|
@@ -205,7 +206,7 @@ module Motr
|
|
205
206
|
|
206
207
|
private
|
207
208
|
|
208
|
-
def validator_of_type_exists?(validators, kind, check_options = true) #:nodoc:
|
209
|
+
def validator_of_type_exists?(validators, kind, check_options = true) #:nodoc: @private
|
209
210
|
validators.detect do |validator|
|
210
211
|
exists = (validator.kind.to_s == kind.to_s)
|
211
212
|
next exists unless (check_options && exists) && validator.options.present?
|
data/lib/motr/forms/builder.rb
CHANGED
@@ -6,10 +6,10 @@ module Motr
|
|
6
6
|
# Default Motr form builder. Extends the passed input tags to include additional
|
7
7
|
# html attributes, primarily for javascript integration.
|
8
8
|
#
|
9
|
-
class Builder < Motr::Forms::Base
|
9
|
+
class Builder < Motr::Forms::Base #:nodoc:
|
10
10
|
|
11
11
|
# create overrides for custom rendering
|
12
|
-
[:email_field, :password_field, :text_field, :text_area, :url_field
|
12
|
+
[:email_field, :password_field, :text_field, :text_area, :url_field].each do |method|
|
13
13
|
class_eval <<-FUNC, __FILE__, __LINE__ + 1
|
14
14
|
|
15
15
|
alias :_super_#{method} :#{method}
|
@@ -21,9 +21,10 @@ module Motr
|
|
21
21
|
end
|
22
22
|
|
23
23
|
##
|
24
|
-
# Modified label tag to support adding a 'required' asterisk to the end of the label
|
24
|
+
# Modified label tag to support adding a 'required' asterisk to the end of the label.
|
25
|
+
# Same params as the original implementation
|
25
26
|
#
|
26
|
-
def label(method, text = nil, options = {}, &block)
|
27
|
+
def label(method, text = nil, options = {}, &block) #:nodoc:
|
27
28
|
|
28
29
|
options, text = text, nil if text.is_a?(Hash)
|
29
30
|
text ||= method.to_s.humanize
|
data/lib/motr/model.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
module Motr
|
2
|
+
|
3
|
+
##
|
4
|
+
# Provides a interface for extending models and controllers with additional Motr libraries.
|
5
|
+
# To create a new library, sub-class/module Motr::Model or Motr::Controller depending on the
|
6
|
+
# functionality to include. To 'attach' functionality call motr :module_name
|
7
|
+
#
|
8
|
+
# @example Create a "postable" model using Motr::Model::Postable (see the motr-content gem)
|
9
|
+
# class MyPost
|
10
|
+
# motr :postable
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
module Model
|
14
|
+
##
|
15
|
+
# Stores a list of available options for a model. This way when
|
16
|
+
# options are passed at load-time, they can be applied to the proper modules.
|
17
|
+
#
|
18
|
+
# @param [Class, Module] mod The module to configure
|
19
|
+
# @param [Symbol] cfg_name The name of the configuration to modify
|
20
|
+
# @param [Array] *options Argument list of options to create.
|
21
|
+
#
|
22
|
+
# @example Create configuration options on a module
|
23
|
+
# module Motr::Model::Sample
|
24
|
+
# module ClassMethods
|
25
|
+
# Motr::Model.config(self, :sample, :option1, :option2)
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
#
|
30
|
+
def self.config(mod, cfg_name, *options)
|
31
|
+
(class << mod; self; end).send(:attr_accessor_with_default, :motr_options, {})
|
32
|
+
mod.motr_options[cfg_name] ||= []
|
33
|
+
|
34
|
+
options.each do |option|
|
35
|
+
mod.motr_options[cfg_name] << option
|
36
|
+
fullname = [cfg_name, option].map(&:to_s).join("_")
|
37
|
+
|
38
|
+
mod.class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
39
|
+
def #{fullname}
|
40
|
+
if defined?(@#{fullname})
|
41
|
+
@#{fullname}
|
42
|
+
elsif superclass.respond_to?(:#{fullname})
|
43
|
+
superclass.#{fullname}
|
44
|
+
else
|
45
|
+
Motr::CONFIGS[:#{cfg_name}][:#{option}]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
def #{fullname}=(value)
|
49
|
+
@#{fullname} = value
|
50
|
+
end
|
51
|
+
METHOD
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# The motr method enables loading other motr libraries into application modules/classes.
|
57
|
+
#
|
58
|
+
# @example Create a model include to hook into any model class
|
59
|
+
# module Motr::Model::Sample
|
60
|
+
# def instance_method
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# module ClassMethods
|
64
|
+
# def class_method
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
#
|
69
|
+
# class SomeModel < ActiveRecord::Base
|
70
|
+
# motr :sample
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
#
|
74
|
+
def motr(*mods)
|
75
|
+
|
76
|
+
options = mods.extract_options!
|
77
|
+
modules = mods.map(&:to_sym).uniq
|
78
|
+
|
79
|
+
motrize_model! do
|
80
|
+
|
81
|
+
modules.each do |mod|
|
82
|
+
const_name = mod.to_s.classify
|
83
|
+
raise Motr::Model.load_failure("Motr::Model::#{const_name}") unless Motr::ALL.include?(mod)
|
84
|
+
|
85
|
+
begin
|
86
|
+
const_incl = Motr::Model.const_get(:"#{const_name}")
|
87
|
+
rescue NameError
|
88
|
+
raise Motr::Errors.ModuleMissing.new("Motr::Model::#{const_name} could not be found. Perhaps try adding the module with the :autoload option.")
|
89
|
+
end
|
90
|
+
|
91
|
+
if const_incl.const_defined?('ClassMethods')
|
92
|
+
class_incl = const_incl.const_get("ClassMethods")
|
93
|
+
extend class_incl
|
94
|
+
end
|
95
|
+
# # Apply passed options to modules where applicable.
|
96
|
+
#
|
97
|
+
if class_incl.respond_to?(:motr_options)
|
98
|
+
class_incl.motr_options[mod].each do |option|
|
99
|
+
next unless options.key?(option)
|
100
|
+
send(:"#{mod}_#{option}=", options.delete(option))
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
include const_incl
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# Raise a ModuleMissing error if a module cannot be loaded.
|
111
|
+
# @private
|
112
|
+
#
|
113
|
+
def self.load_failure(mod) #:nodoc:
|
114
|
+
Motr::Errors::ModuleMissing.new("The module #{mod} wasn't found. Add it with Motr.add_module(#{mod})") and return
|
115
|
+
end
|
116
|
+
|
117
|
+
# Override motrize_model! to create specific functionality on a model
|
118
|
+
# @private
|
119
|
+
def motrize_model! #:nodoc:
|
120
|
+
yield
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Motr
|
2
|
+
module Model
|
3
|
+
|
4
|
+
module Sluggable #:nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
callback_opt = (self.sluggable_on || "save")
|
9
|
+
send(:"before_#{callback_opt.to_s}", :make_sluggable_fields)
|
10
|
+
end
|
11
|
+
|
12
|
+
# @private
|
13
|
+
def make_sluggable_fields #:nodoc:
|
14
|
+
[self.class.sluggable_fields].flatten.each do |atr|
|
15
|
+
orig = self.send(:"#{atr}")
|
16
|
+
self.send(:"#{atr}=", orig.to_slug)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# @private
|
21
|
+
module ClassMethods #:nodoc:
|
22
|
+
Motr::Model.config(self, :sluggable, :fields, :on)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Original implementation by Ludo van den Boom's to_slug plugin
|
32
|
+
# @see to_slug (https://github.com/ludo/to_slug)
|
33
|
+
#
|
34
|
+
module ToSlug #:nodoc:
|
35
|
+
def to_slug
|
36
|
+
value = self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s
|
37
|
+
value.gsub!(/[']+/, '')
|
38
|
+
value.gsub!(/\W+/, ' ')
|
39
|
+
value.strip!
|
40
|
+
value.downcase!
|
41
|
+
value.gsub!(' ', '-')
|
42
|
+
value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
String.send(:include, ToSlug)
|
data/lib/motr/rails.rb
CHANGED
@@ -6,12 +6,19 @@ module Motr
|
|
6
6
|
require 'active_support/i18n'
|
7
7
|
I18n.load_path << File.expand_path('../../config/locales/en.yml', __FILE__)
|
8
8
|
|
9
|
-
initializer
|
10
|
-
|
11
|
-
|
9
|
+
initializer 'motr.initializer' do
|
10
|
+
ActiveSupport.on_load(:action_view) do
|
11
|
+
include Motr::Helpers::LayoutHelpers
|
12
|
+
include Motr::Helpers::Navigation
|
13
|
+
include Motr::Helpers::Elements
|
14
|
+
include Motr::Forms::Helpers
|
15
|
+
self.send :default_form_builder=, Motr::Forms.default_builder
|
16
|
+
end
|
17
|
+
ActiveSupport.on_load(:action_controller) do
|
18
|
+
include Motr::Controller::Helpers
|
12
19
|
self.responder = Motr::Controller::Responder
|
13
20
|
end
|
14
|
-
|
21
|
+
|
15
22
|
end
|
16
23
|
|
17
24
|
end
|
data/lib/motr/version.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: motr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.4
|
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-
|
13
|
+
date: 2011-05-09 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -123,9 +123,11 @@ files:
|
|
123
123
|
- lib/generator/templates/compass/screen.scss
|
124
124
|
- lib/generator/templates/motr.rb
|
125
125
|
- lib/generator/templates/post_install
|
126
|
+
- lib/motr/controller/helpers.rb
|
126
127
|
- lib/motr/controller/responder.rb
|
127
|
-
- lib/motr/
|
128
|
+
- lib/motr/defaults.rb
|
128
129
|
- lib/motr/errors/invalid_options.rb
|
130
|
+
- lib/motr/errors/module_missing.rb
|
129
131
|
- lib/motr/errors/motr_error.rb
|
130
132
|
- lib/motr/forms/base.rb
|
131
133
|
- lib/motr/forms/builder.rb
|
@@ -134,6 +136,10 @@ files:
|
|
134
136
|
- lib/motr/helpers/elements.rb
|
135
137
|
- lib/motr/helpers/layout_helpers.rb
|
136
138
|
- lib/motr/helpers/navigation.rb
|
139
|
+
- lib/motr/model/sluggable.rb
|
140
|
+
- lib/motr/model.rb
|
141
|
+
- lib/motr/orm/active_record.rb
|
142
|
+
- lib/motr/orm/mongoid.rb
|
137
143
|
- lib/motr/rails.rb
|
138
144
|
- lib/motr/version.rb
|
139
145
|
- lib/motr.rb
|
@@ -156,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
156
162
|
requirements:
|
157
163
|
- - ">="
|
158
164
|
- !ruby/object:Gem::Version
|
159
|
-
hash:
|
165
|
+
hash: 2672633965524668472
|
160
166
|
segments:
|
161
167
|
- 0
|
162
168
|
version: "0"
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'action_controller/base'
|
2
|
-
|
3
|
-
module Motr
|
4
|
-
module Controller
|
5
|
-
|
6
|
-
##
|
7
|
-
# Enables triggering javascript events from controllers. This helps with extraction of javascript from
|
8
|
-
# actual view templates. Since by default Rails' respond_with will render a html template on a js request
|
9
|
-
# where there is no .js.erb template, we can capture that content and trigger a javascript event with it.
|
10
|
-
#
|
11
|
-
# @option options [Symbol] :type The type of callback to use (only supports :jquery right now)
|
12
|
-
#
|
13
|
-
# @example
|
14
|
-
# In your controller:
|
15
|
-
# controller SomeResourceController < ApplicationController
|
16
|
-
# respond_to :html, :js
|
17
|
-
# enable_script_events :only => :create
|
18
|
-
#
|
19
|
-
# def create
|
20
|
-
# # some create functionality here
|
21
|
-
# # @some_resource.name = "Test"
|
22
|
-
# respond_with(@some_resource)
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# end
|
26
|
-
#
|
27
|
-
# With the view "create.html.erb"
|
28
|
-
#
|
29
|
-
# <div id="resource"><%= @some_resource.name %></div>
|
30
|
-
#
|
31
|
-
# Will return (where the last param is an object notation of any params passed (after filtering))
|
32
|
-
#
|
33
|
-
# jQuery.trigger("some_resource:create", "<div id=\"resource\">Test</div>", {});
|
34
|
-
#
|
35
|
-
#
|
36
|
-
module ScriptEvents
|
37
|
-
|
38
|
-
def enable_script_events(options = {}) #:nodoc:
|
39
|
-
|
40
|
-
|
41
|
-
after_filter(options) do
|
42
|
-
|
43
|
-
# TODO: Possibly support other js libraries? I mean... does anyone care? I don't
|
44
|
-
#event_type = options.delete(:type) || :jquery
|
45
|
-
event_type = :jquery
|
46
|
-
callback_str = case event_type.to_s
|
47
|
-
when 'prototype' then "alert('sorry, no prototype love');"
|
48
|
-
else "jQuery.event.trigger('%s:%s', [%s, %s]);"
|
49
|
-
end
|
50
|
-
|
51
|
-
return true unless response.content_type.to_s.match(/javascript/i)
|
52
|
-
response_params = request.filtered_parameters.dup
|
53
|
-
|
54
|
-
cname = response_params.delete('controller').to_s.underscore
|
55
|
-
aname = response_params.delete('action').to_s
|
56
|
-
escape_map = {
|
57
|
-
'\\' => '\\\\',
|
58
|
-
'</' => '<\/',
|
59
|
-
"\r\n" => '\n',
|
60
|
-
"\n" => '\n',
|
61
|
-
"\r" => '\n',
|
62
|
-
'"' => '\\"',
|
63
|
-
"'" => "\\'" }
|
64
|
-
|
65
|
-
response_params.delete("format")
|
66
|
-
json_params = response_params.to_json#.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { escape_map[$1] }
|
67
|
-
old_body = response.body.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { escape_map[$1] }
|
68
|
-
response.body = callback_str % [cname, aname, old_body.inspect, json_params.html_safe]
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|