autoexec_bat 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +83 -0
- data/Rakefile +2 -0
- data/autoexec_bat.gemspec +17 -0
- data/autoexec_bat.js +132 -0
- data/lib/assets/javascripts/autoexec_bat.coffee +78 -0
- data/lib/autoexec_bat/helper.rb +16 -0
- data/lib/autoexec_bat/version.rb +3 -0
- data/lib/autoexec_bat.rb +11 -0
- metadata +62 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Gudleik Rasch
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# AutoexecBat
|
2
|
+
|
3
|
+
AutoexecBat was written to aid organizing and running javascript code using the Rails asset pipeline.
|
4
|
+
|
5
|
+
The main idea is to organize all javascript code into separate namespaces and let a data-autoexec attribute determine which module to run.
|
6
|
+
|
7
|
+
Some examples:
|
8
|
+
|
9
|
+
define "App.Products", (exports) ->
|
10
|
+
exports.autoexec = ->
|
11
|
+
# this is the autoexec function that AutoexecBat looks for
|
12
|
+
|
13
|
+
# Module with private methods
|
14
|
+
define "App.Products.Index", (exports) ->
|
15
|
+
exports.autoexec = ->
|
16
|
+
setupEventListeners()
|
17
|
+
setupSomethingElse()
|
18
|
+
takeItAway()
|
19
|
+
|
20
|
+
setupEventListeners = ->
|
21
|
+
$('table tbody td').on 'click', -> # event handler
|
22
|
+
$('input').on 'click', -> # another event handler
|
23
|
+
|
24
|
+
takeItAway = ->
|
25
|
+
$('tag').doSomething()
|
26
|
+
|
27
|
+
setupSomethingElse = ->
|
28
|
+
$('.private').show()
|
29
|
+
|
30
|
+
# A module with dependencies
|
31
|
+
define "App.Products.Show", ["App.Products"], (exports) ->
|
32
|
+
exports.autoexec = ->
|
33
|
+
# this module has a dependency to App.Products,
|
34
|
+
# which will be executed first
|
35
|
+
|
36
|
+
# If all you want is to run the dependencies:
|
37
|
+
define "App.Gallery", ["App.UI.Fancybox", "App.UI.FileUpload"]
|
38
|
+
|
39
|
+
# A simple coffeescript class:
|
40
|
+
class namespace("App.Models").Product
|
41
|
+
# this class will be known as App.Models.Product
|
42
|
+
|
43
|
+
# Run AutoexecBat on all tags with a data-autoexec attribute (using jQuery)
|
44
|
+
jQuery ->
|
45
|
+
$('[data-autoexec]').autoexec()
|
46
|
+
|
47
|
+
# y u no got jquery?
|
48
|
+
# Run it manually or use whatever
|
49
|
+
AutoexecBat.run "App.Products.Show"
|
50
|
+
# or
|
51
|
+
App.Products.Show.autoexec()
|
52
|
+
|
53
|
+
Finally, just add the module name to a data-autoexec attribute:
|
54
|
+
|
55
|
+
<body data-autoexec="App.Products.Index">
|
56
|
+
|
57
|
+
If the given module doesn't exist, it tries to execute a parent module.
|
58
|
+
In this case, the module App.Products.autoexec() will be executed:
|
59
|
+
|
60
|
+
<div data-autoexec="App.Products.Dev.Null">..</div>
|
61
|
+
|
62
|
+
|
63
|
+
## Installation
|
64
|
+
|
65
|
+
Add this line to your application's Gemfile:
|
66
|
+
|
67
|
+
gem 'autoexec_bat'
|
68
|
+
|
69
|
+
Require your modules and activate autoexecution:
|
70
|
+
|
71
|
+
#= require autoexec_bat
|
72
|
+
#= require_tree ./folder-containing-your-modules
|
73
|
+
jQuery ->
|
74
|
+
$('[data-autoexec]').autoexec()
|
75
|
+
|
76
|
+
|
77
|
+
## Contributing
|
78
|
+
|
79
|
+
1. Fork it
|
80
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
81
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
82
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
83
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/autoexec_bat/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Gudleik Rasch"]
|
6
|
+
gem.email = ["gudleik@gmail.com"]
|
7
|
+
gem.description = %q{Autoexecution of javascript based on data attribute}
|
8
|
+
gem.summary = %q{Autoexecution of javascript based on data attribute}
|
9
|
+
gem.homepage = "https://github.com/Skalar/autoexec_bat"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "autoexec_bat"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = AutoexecBat::VERSION
|
17
|
+
end
|
data/autoexec_bat.js
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
// Generated by CoffeeScript 1.3.1
|
2
|
+
(function() {
|
3
|
+
var $, AutoexecBat, root,
|
4
|
+
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
5
|
+
|
6
|
+
root = typeof exports !== "undefined" && exports !== null ? exports : window;
|
7
|
+
|
8
|
+
AutoexecBat = {
|
9
|
+
topLevel: "App",
|
10
|
+
debug: true,
|
11
|
+
log: function(msg) {
|
12
|
+
if (AutoexecBat.debug) {
|
13
|
+
return typeof console !== "undefined" && console !== null ? console.log(msg) : void 0;
|
14
|
+
}
|
15
|
+
},
|
16
|
+
define: function(name) {
|
17
|
+
var arg, block, dependencies, module, target, top, _i, _j, _len, _len1;
|
18
|
+
dependencies = [];
|
19
|
+
if (AutoexecBat.autoRequire && name !== AutoexecBat.autoRequire) {
|
20
|
+
dependencies.push(AutoexecBat.autoRequire);
|
21
|
+
}
|
22
|
+
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
|
23
|
+
arg = arguments[_i];
|
24
|
+
if (typeof arg === "object") {
|
25
|
+
for (_j = 0, _len1 = arg.length; _j < _len1; _j++) {
|
26
|
+
module = arg[_j];
|
27
|
+
if (!(__indexOf.call(dependencies, module) >= 0 && module !== name)) {
|
28
|
+
dependencies.push(module);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
} else if (typeof arg === "function") {
|
32
|
+
block = arg;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
if (block == null) {
|
36
|
+
block = function() {};
|
37
|
+
}
|
38
|
+
top = AutoexecBat.topLevel;
|
39
|
+
target = AutoexecBat.namespace(name);
|
40
|
+
target.name = name;
|
41
|
+
target.loaded = false;
|
42
|
+
target.autoexec = function() {};
|
43
|
+
target.dependencies = dependencies;
|
44
|
+
target.init = function() {
|
45
|
+
if (!this.loaded) {
|
46
|
+
require(dependencies);
|
47
|
+
if (typeof this.autoexec === 'function') {
|
48
|
+
this.autoexec();
|
49
|
+
}
|
50
|
+
this.autoexec = function() {
|
51
|
+
return AutoexecBat.log("Module already initialized");
|
52
|
+
};
|
53
|
+
return this.loaded = true;
|
54
|
+
}
|
55
|
+
};
|
56
|
+
return block(target, top);
|
57
|
+
},
|
58
|
+
require: function(dependencies) {
|
59
|
+
var lib, _i, _len, _results;
|
60
|
+
if (dependencies) {
|
61
|
+
_results = [];
|
62
|
+
for (_i = 0, _len = dependencies.length; _i < _len; _i++) {
|
63
|
+
lib = dependencies[_i];
|
64
|
+
_results.push(AutoexecBat.initializeModule(lib));
|
65
|
+
}
|
66
|
+
return _results;
|
67
|
+
}
|
68
|
+
},
|
69
|
+
namespace: function(name) {
|
70
|
+
var item, target, _i, _len, _ref;
|
71
|
+
target = root;
|
72
|
+
_ref = name.split('.');
|
73
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
74
|
+
item = _ref[_i];
|
75
|
+
target = target[item] || (target[item] = {});
|
76
|
+
}
|
77
|
+
return target;
|
78
|
+
},
|
79
|
+
findModule: function(ns) {
|
80
|
+
var item, module, _i, _len;
|
81
|
+
if (!ns) {
|
82
|
+
return;
|
83
|
+
}
|
84
|
+
if (typeof ns === "string") {
|
85
|
+
ns = ns.split(".");
|
86
|
+
}
|
87
|
+
if (ns[0] !== AutoexecBat.topLevel) {
|
88
|
+
ns.unshift(AutoexecBat.topLevel);
|
89
|
+
}
|
90
|
+
module = root;
|
91
|
+
for (_i = 0, _len = ns.length; _i < _len; _i++) {
|
92
|
+
item = ns[_i];
|
93
|
+
if (typeof module[item] !== 'undefined') {
|
94
|
+
module = module[item];
|
95
|
+
}
|
96
|
+
}
|
97
|
+
return module;
|
98
|
+
},
|
99
|
+
initializeModule: function(nameOrModule) {
|
100
|
+
var module;
|
101
|
+
module = typeof nameOrModule === "string" ? AutoexecBat.findModule(nameOrModule) : nameOrModule;
|
102
|
+
if (typeof module !== 'undefined' && typeof module.init !== 'undefined') {
|
103
|
+
return module.init();
|
104
|
+
}
|
105
|
+
},
|
106
|
+
run: function(name) {
|
107
|
+
var module;
|
108
|
+
module = AutoexecBat.findModule(name);
|
109
|
+
return AutoexecBat.initializeModule(module);
|
110
|
+
}
|
111
|
+
};
|
112
|
+
|
113
|
+
root.AutoexecBat = AutoexecBat;
|
114
|
+
|
115
|
+
root.define = AutoexecBat.define;
|
116
|
+
|
117
|
+
root.require = AutoexecBat.require;
|
118
|
+
|
119
|
+
root.namespace = AutoexecBat.namespace;
|
120
|
+
|
121
|
+
if (typeof jQuery !== 'undefined') {
|
122
|
+
$ = jQuery;
|
123
|
+
$.fn.extend({
|
124
|
+
autoexec: function(options) {
|
125
|
+
return this.each(function() {
|
126
|
+
return AutoexecBat.run($(this).data('autoexec'));
|
127
|
+
});
|
128
|
+
}
|
129
|
+
});
|
130
|
+
}
|
131
|
+
|
132
|
+
}).call(this);
|
@@ -0,0 +1,78 @@
|
|
1
|
+
root = exports ? window
|
2
|
+
|
3
|
+
AutoexecBat =
|
4
|
+
topLevel: "App"
|
5
|
+
debug: true
|
6
|
+
# autoRequire: null
|
7
|
+
|
8
|
+
log: (msg) ->
|
9
|
+
console?.log msg if AutoexecBat.debug
|
10
|
+
|
11
|
+
define: (name) ->
|
12
|
+
dependencies = []
|
13
|
+
dependencies.push AutoexecBat.autoRequire if AutoexecBat.autoRequire && name != AutoexecBat.autoRequire
|
14
|
+
|
15
|
+
for arg in arguments
|
16
|
+
if typeof arg is "object"
|
17
|
+
for module in arg
|
18
|
+
dependencies.push module unless module in dependencies && module != name
|
19
|
+
|
20
|
+
else if typeof arg is "function"
|
21
|
+
block = arg
|
22
|
+
|
23
|
+
block ?= -> # empty function
|
24
|
+
top = AutoexecBat.topLevel
|
25
|
+
target = AutoexecBat.namespace name
|
26
|
+
|
27
|
+
target.name = name
|
28
|
+
target.loaded = false
|
29
|
+
target.autoexec = -> # make sure the autoexec function exists
|
30
|
+
target.dependencies = dependencies
|
31
|
+
target.init = ->
|
32
|
+
unless @loaded
|
33
|
+
require dependencies
|
34
|
+
@autoexec() if typeof @autoexec is 'function'
|
35
|
+
@autoexec = -> AutoexecBat.log "Module already initialized"
|
36
|
+
@loaded = true
|
37
|
+
|
38
|
+
block target, top
|
39
|
+
|
40
|
+
require: (dependencies) ->
|
41
|
+
(AutoexecBat.initializeModule(lib) for lib in dependencies) if dependencies
|
42
|
+
|
43
|
+
namespace: (name) ->
|
44
|
+
target = root
|
45
|
+
target = target[item] or= {} for item in name.split '.'
|
46
|
+
target
|
47
|
+
|
48
|
+
findModule: (ns) ->
|
49
|
+
return unless ns
|
50
|
+
ns = ns.split "." if typeof ns is "string"
|
51
|
+
ns.unshift AutoexecBat.topLevel unless ns[0] == AutoexecBat.topLevel
|
52
|
+
|
53
|
+
module = root
|
54
|
+
for item in ns
|
55
|
+
module = module[item] unless typeof module[item] is 'undefined'
|
56
|
+
module
|
57
|
+
|
58
|
+
initializeModule: (nameOrModule) ->
|
59
|
+
module = if typeof nameOrModule is "string" then AutoexecBat.findModule(nameOrModule) else nameOrModule
|
60
|
+
module.init() if typeof module isnt 'undefined' and typeof module.init isnt 'undefined'
|
61
|
+
|
62
|
+
run: (name) ->
|
63
|
+
module = AutoexecBat.findModule name
|
64
|
+
AutoexecBat.initializeModule module
|
65
|
+
|
66
|
+
|
67
|
+
# Globals
|
68
|
+
root.AutoexecBat = AutoexecBat
|
69
|
+
root.define = AutoexecBat.define
|
70
|
+
root.require = AutoexecBat.require
|
71
|
+
root.namespace = AutoexecBat.namespace
|
72
|
+
|
73
|
+
# Plugins
|
74
|
+
unless typeof jQuery is 'undefined'
|
75
|
+
$ = jQuery
|
76
|
+
$.fn.extend
|
77
|
+
autoexec: (options) ->
|
78
|
+
return @each -> AutoexecBat.run $(@).data('autoexec')
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AutoexecBat
|
2
|
+
module Helper
|
3
|
+
|
4
|
+
def default_autoexec_module
|
5
|
+
candidates = controller.controller_path.split('/') << controller.action_name
|
6
|
+
# candidates.unshift "shared" if candidates.length == 2
|
7
|
+
candidates.map &:camelcase
|
8
|
+
end
|
9
|
+
|
10
|
+
def autoexec_module(name=nil)
|
11
|
+
@autoexec_module = name if name
|
12
|
+
@autoexec_module || default_autoexec_module
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
data/lib/autoexec_bat.rb
ADDED
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: autoexec_bat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gudleik Rasch
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-13 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Autoexecution of javascript based on data attribute
|
15
|
+
email:
|
16
|
+
- gudleik@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- LICENSE
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- autoexec_bat.gemspec
|
27
|
+
- autoexec_bat.js
|
28
|
+
- lib/assets/javascripts/autoexec_bat.coffee
|
29
|
+
- lib/autoexec_bat.rb
|
30
|
+
- lib/autoexec_bat/helper.rb
|
31
|
+
- lib/autoexec_bat/version.rb
|
32
|
+
homepage: https://github.com/Skalar/autoexec_bat
|
33
|
+
licenses: []
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
hash: 1279658281685689202
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
49
|
+
requirements:
|
50
|
+
- - ! '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
segments:
|
54
|
+
- 0
|
55
|
+
hash: 1279658281685689202
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.8.21
|
59
|
+
signing_key:
|
60
|
+
specification_version: 3
|
61
|
+
summary: Autoexecution of javascript based on data attribute
|
62
|
+
test_files: []
|