keymaster-rails 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/README.md +87 -0
- data/Rakefile +2 -0
- data/keymaster-rails.gemspec +21 -0
- data/lib/generators/keymaster/install/install_generator.rb +35 -0
- data/lib/keymaster-rails.rb +1 -0
- data/lib/keymaster/rails.rb +6 -0
- data/lib/keymaster/rails/engine.rb +7 -0
- data/lib/keymaster/rails/version.rb +6 -0
- data/vendor/assets/javascripts/keymaster.js +184 -0
- metadata +112 -0
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3@keymaster-rails
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
Copyright © 2012 Phil Cohen <github@phlippers.net>
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
of this software and associated documentation files (the “Software”), to deal
|
6
|
+
in the Software without restriction, including without limitation the rights
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
9
|
+
furnished to do so, subject to the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be included in
|
12
|
+
all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# keymaster-rails
|
2
|
+
|
3
|
+
[Keymaster](https://github.com/madrobby/keymaster), bundled for Rails 3.0 and up.
|
4
|
+
|
5
|
+
|
6
|
+
## Rails 3.1+
|
7
|
+
|
8
|
+
For Rails 3.1 and greater, the files will be added to the asset pipeline and available for you to use.
|
9
|
+
|
10
|
+
To enable:
|
11
|
+
|
12
|
+
* Add the following line to the file `app/assets/javascripts/application.js` (or other [sprockets](https://github.com/sstephenson/sprockets) manifest):
|
13
|
+
|
14
|
+
``` javascript
|
15
|
+
//= require keymaster
|
16
|
+
```
|
17
|
+
|
18
|
+
|
19
|
+
### Installation
|
20
|
+
|
21
|
+
* Add `keymaster-rails` to your Gemfile
|
22
|
+
* Run `bundle`
|
23
|
+
|
24
|
+
Enjoy!
|
25
|
+
|
26
|
+
|
27
|
+
## Rails 3.0
|
28
|
+
|
29
|
+
This gem adds a single generator to Rails 3, `keymaster:install`. Running the generator will install the JavaScript file necessary to use Keymaster.
|
30
|
+
|
31
|
+
### Installation
|
32
|
+
|
33
|
+
* Add `keymaster-rails` to your Gemfile
|
34
|
+
* Run `bundle`
|
35
|
+
* Invoke the generator: `rails generate keymaster:install`
|
36
|
+
* Add the following to your layout or view files:
|
37
|
+
|
38
|
+
```erb
|
39
|
+
<%= javascript_include_tag "keymaster" %>
|
40
|
+
```
|
41
|
+
|
42
|
+
You're done!
|
43
|
+
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
1. Fork it
|
48
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
49
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
50
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
51
|
+
5. Create new Pull Request
|
52
|
+
|
53
|
+
|
54
|
+
## License
|
55
|
+
|
56
|
+
**keymaster-rails**
|
57
|
+
|
58
|
+
* Freely distributable and licensed under the [MIT license](http://phlipper.mit-license.org/2012/license.html).
|
59
|
+
* Copyright (c) 2012 Phil Cohen (github@phlippers.net) [![endorse](http://api.coderwall.com/phlipper/endorsecount.png)](http://coderwall.com/phlipper)
|
60
|
+
* http://phlippers.net/
|
61
|
+
|
62
|
+
**Keymaster JS**
|
63
|
+
|
64
|
+
* Freely distributable and licensed under the MIT-style license.
|
65
|
+
* Copyright (c) 2011 Thomas Fuchs
|
66
|
+
* https://github.com/madrobby/keymaster
|
67
|
+
|
68
|
+
Copyright (c) 2011 Thomas Fuchs
|
69
|
+
|
70
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
71
|
+
a copy of this software and associated documentation files (the
|
72
|
+
"Software"), to deal in the Software without restriction, including
|
73
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
74
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
75
|
+
permit persons to whom the Software is furnished to do so, subject to
|
76
|
+
the following conditions:
|
77
|
+
|
78
|
+
The above copyright notice and this permission notice shall be
|
79
|
+
included in all copies or substantial portions of the Software.
|
80
|
+
|
81
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
82
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
83
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
84
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
85
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
86
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
87
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/keymaster/rails/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Phil Cohen"]
|
6
|
+
gem.email = ["github@phlippers.net"]
|
7
|
+
gem.description = %q{Keymaster.js, bundled for Rails 3.0 and up.}
|
8
|
+
gem.summary = %q{Keymaster.js, bundled for Rails 3.0 and up.}
|
9
|
+
gem.homepage = "https://github.com/phlipper/keymaster-rails"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "keymaster-rails"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Keymaster::Rails::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "railties", ">= 3.0.0"
|
19
|
+
gem.add_development_dependency "bundler", ">= 1.1.0"
|
20
|
+
gem.add_development_dependency "rake", "~> 0.9.2.2"
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "rails"
|
2
|
+
|
3
|
+
# Supply generator for Rails 3.0.x or if asset pipeline is not enabled
|
4
|
+
if ::Rails.version < "3.1" || !::Rails.application.config.assets.enabled
|
5
|
+
module Keymaster
|
6
|
+
module Generators
|
7
|
+
class InstallGenerator < ::Rails::Generators::Base
|
8
|
+
desc "This generator installs keymaster #{Keymaster::Rails::KEYMASTERJS_VERSION}"
|
9
|
+
source_root File.expand_path("../../../../../vendor/assets", __FILE__)
|
10
|
+
|
11
|
+
def copy_javascript
|
12
|
+
say_status("copying", "Keymaster JS", :green)
|
13
|
+
copy_file "javascripts/keymaster.js", "public/javascripts/keymaster.js"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
else
|
19
|
+
module Keymaster
|
20
|
+
module Generators
|
21
|
+
class InstallGenerator < ::Rails::Generators::Base
|
22
|
+
desc "Just show instructions so people will know what to do when mistakenly using generator for Rails 3.1 apps"
|
23
|
+
|
24
|
+
def do_nothing
|
25
|
+
say_status("deprecated", "You are using Rails 3.1 with the asset pipeline enabled, so this generator is not needed.")
|
26
|
+
say_status("", "The necessary files are already in your asset pipeline.")
|
27
|
+
say_status("", "Just add `//= require keymaster` to your app/assets/javascripts/application.js")
|
28
|
+
say_status("", "If you upgraded your app from Rails 3.0 and still have keymaster.js in your public assets folders, be sure to remove them.")
|
29
|
+
say_status("", "If you do not want the asset pipeline enabled, you may turn it off in application.rb and re-run this generator.")
|
30
|
+
# ok, nothing
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "keymaster/rails"
|
@@ -0,0 +1,184 @@
|
|
1
|
+
// keymaster.js
|
2
|
+
// (c) 2011 Thomas Fuchs
|
3
|
+
// keymaster.js may be freely distributed under the MIT license.
|
4
|
+
|
5
|
+
;(function(global){
|
6
|
+
var k,
|
7
|
+
_handlers = {},
|
8
|
+
_mods = { 16: false, 18: false, 17: false, 91: false },
|
9
|
+
_scope = 'all',
|
10
|
+
// modifier keys
|
11
|
+
_MODIFIERS = {
|
12
|
+
'⇧': 16, shift: 16,
|
13
|
+
'⌥': 18, alt: 18, option: 18,
|
14
|
+
'⌃': 17, ctrl: 17, control: 17,
|
15
|
+
'⌘': 91, command: 91
|
16
|
+
},
|
17
|
+
// special keys
|
18
|
+
_MAP = {
|
19
|
+
backspace: 8, tab: 9, clear: 12,
|
20
|
+
enter: 13, 'return': 13,
|
21
|
+
esc: 27, escape: 27, space: 32,
|
22
|
+
left: 37, up: 38,
|
23
|
+
right: 39, down: 40,
|
24
|
+
del: 46, 'delete': 46,
|
25
|
+
home: 36, end: 35,
|
26
|
+
pageup: 33, pagedown: 34,
|
27
|
+
',': 188, '.': 190, '/': 191,
|
28
|
+
'`': 192, '-': 189, '=': 187,
|
29
|
+
';': 186, '\'': 222,
|
30
|
+
'[': 219, ']': 221, '\\': 220
|
31
|
+
};
|
32
|
+
|
33
|
+
for(k=1;k<20;k++) _MODIFIERS['f'+k] = 111+k;
|
34
|
+
|
35
|
+
// IE doesn't support Array#indexOf, so have a simple replacement
|
36
|
+
function index(array, item){
|
37
|
+
var i = array.length;
|
38
|
+
while(i--) if(array[i]===item) return i;
|
39
|
+
return -1;
|
40
|
+
}
|
41
|
+
|
42
|
+
// handle keydown event
|
43
|
+
function dispatch(event){
|
44
|
+
var key, handler, k, i, modifiersMatch;
|
45
|
+
key = event.keyCode;
|
46
|
+
|
47
|
+
// if a modifier key, set the key.<modifierkeyname> property to true and return
|
48
|
+
if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko
|
49
|
+
if(key in _mods) {
|
50
|
+
_mods[key] = true;
|
51
|
+
// 'assignKey' from inside this closure is exported to window.key
|
52
|
+
for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true;
|
53
|
+
return;
|
54
|
+
}
|
55
|
+
|
56
|
+
// see if we need to ignore the keypress (ftiler() can can be overridden)
|
57
|
+
// by default ignore key presses if a select, textarea, or input is focused
|
58
|
+
if(!assignKey.filter.call(this, event)) return;
|
59
|
+
|
60
|
+
// abort if no potentially matching shortcuts found
|
61
|
+
if (!(key in _handlers)) return;
|
62
|
+
|
63
|
+
// for each potential shortcut
|
64
|
+
for (i = 0; i < _handlers[key].length; i++) {
|
65
|
+
handler = _handlers[key][i];
|
66
|
+
|
67
|
+
// see if it's in the current scope
|
68
|
+
if(handler.scope == _scope || handler.scope == 'all'){
|
69
|
+
// check if modifiers match if any
|
70
|
+
modifiersMatch = handler.mods.length > 0;
|
71
|
+
for(k in _mods)
|
72
|
+
if((!_mods[k] && index(handler.mods, +k) > -1) ||
|
73
|
+
(_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false;
|
74
|
+
// call the handler and stop the event if neccessary
|
75
|
+
if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){
|
76
|
+
if(handler.method(event, handler)===false){
|
77
|
+
if(event.preventDefault) event.preventDefault();
|
78
|
+
else event.returnValue = false;
|
79
|
+
if(event.stopPropagation) event.stopPropagation();
|
80
|
+
if(event.cancelBubble) event.cancelBubble = true;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
};
|
86
|
+
|
87
|
+
// unset modifier keys on keyup
|
88
|
+
function clearModifier(event){
|
89
|
+
var key = event.keyCode, k;
|
90
|
+
if(key == 93 || key == 224) key = 91;
|
91
|
+
if(key in _mods) {
|
92
|
+
_mods[key] = false;
|
93
|
+
for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false;
|
94
|
+
}
|
95
|
+
};
|
96
|
+
|
97
|
+
function resetModifiers() {
|
98
|
+
for(k in _mods) _mods[k] = false;
|
99
|
+
for(k in _MODIFIERS) assignKey[k] = false;
|
100
|
+
}
|
101
|
+
|
102
|
+
// parse and assign shortcut
|
103
|
+
function assignKey(key, scope, method){
|
104
|
+
var keys, mods, i, mi;
|
105
|
+
if (method === undefined) {
|
106
|
+
method = scope;
|
107
|
+
scope = 'all';
|
108
|
+
}
|
109
|
+
key = key.replace(/\s/g,'');
|
110
|
+
keys = key.split(',');
|
111
|
+
|
112
|
+
if((keys[keys.length-1])=='')
|
113
|
+
keys[keys.length-2] += ',';
|
114
|
+
// for each shortcut
|
115
|
+
for (i = 0; i < keys.length; i++) {
|
116
|
+
// set modifier keys if any
|
117
|
+
mods = [];
|
118
|
+
key = keys[i].split('+');
|
119
|
+
if(key.length > 1){
|
120
|
+
mods = key.slice(0,key.length-1);
|
121
|
+
for (mi = 0; mi < mods.length; mi++)
|
122
|
+
mods[mi] = _MODIFIERS[mods[mi]];
|
123
|
+
key = [key[key.length-1]];
|
124
|
+
}
|
125
|
+
// convert to keycode and...
|
126
|
+
key = key[0]
|
127
|
+
key = _MAP[key] || key.toUpperCase().charCodeAt(0);
|
128
|
+
// ...store handler
|
129
|
+
if (!(key in _handlers)) _handlers[key] = [];
|
130
|
+
_handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods });
|
131
|
+
}
|
132
|
+
};
|
133
|
+
|
134
|
+
function filter(event){
|
135
|
+
var tagName = (event.target || event.srcElement).tagName;
|
136
|
+
// ignore keypressed in any elements that support keyboard data input
|
137
|
+
return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');
|
138
|
+
}
|
139
|
+
|
140
|
+
// initialize key.<modifier> to false
|
141
|
+
for(k in _MODIFIERS) assignKey[k] = false;
|
142
|
+
|
143
|
+
// set current scope (default 'all')
|
144
|
+
function setScope(scope){ _scope = scope || 'all' };
|
145
|
+
function getScope(){ return _scope || 'all' };
|
146
|
+
|
147
|
+
// delete all handlers for a given scope
|
148
|
+
function deleteScope(scope){
|
149
|
+
var key, handlers, i;
|
150
|
+
|
151
|
+
for (key in _handlers) {
|
152
|
+
handlers = _handlers[key];
|
153
|
+
for (i = 0; i < handlers.length; ) {
|
154
|
+
if (handlers[i].scope === scope) handlers.splice(i, 1);
|
155
|
+
else i++;
|
156
|
+
}
|
157
|
+
}
|
158
|
+
};
|
159
|
+
|
160
|
+
// cross-browser events
|
161
|
+
function addEvent(object, event, method) {
|
162
|
+
if (object.addEventListener)
|
163
|
+
object.addEventListener(event, method, false);
|
164
|
+
else if(object.attachEvent)
|
165
|
+
object.attachEvent('on'+event, function(){ method(window.event) });
|
166
|
+
};
|
167
|
+
|
168
|
+
// set the handlers globally on document
|
169
|
+
addEvent(document, 'keydown', dispatch);
|
170
|
+
addEvent(document, 'keyup', clearModifier);
|
171
|
+
|
172
|
+
// reset modifiers to false whenever the window is (re)focused.
|
173
|
+
addEvent(window, 'focus', resetModifiers);
|
174
|
+
|
175
|
+
// set window.key and window.key.set/get/deleteScope, and the default filter
|
176
|
+
global.key = assignKey;
|
177
|
+
global.key.setScope = setScope;
|
178
|
+
global.key.getScope = getScope;
|
179
|
+
global.key.deleteScope = deleteScope;
|
180
|
+
global.key.filter = filter;
|
181
|
+
|
182
|
+
if(typeof module !== 'undefined') module.exports = key;
|
183
|
+
|
184
|
+
})(this);
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: keymaster-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Phil Cohen
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-06-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: railties
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.0.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.1.0
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.1.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.9.2.2
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2.2
|
62
|
+
description: Keymaster.js, bundled for Rails 3.0 and up.
|
63
|
+
email:
|
64
|
+
- github@phlippers.net
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- .ruby-version
|
71
|
+
- Gemfile
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- keymaster-rails.gemspec
|
76
|
+
- lib/generators/keymaster/install/install_generator.rb
|
77
|
+
- lib/keymaster-rails.rb
|
78
|
+
- lib/keymaster/rails.rb
|
79
|
+
- lib/keymaster/rails/engine.rb
|
80
|
+
- lib/keymaster/rails/version.rb
|
81
|
+
- vendor/assets/javascripts/keymaster.js
|
82
|
+
homepage: https://github.com/phlipper/keymaster-rails
|
83
|
+
licenses: []
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
segments:
|
95
|
+
- 0
|
96
|
+
hash: 1931070553266355197
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
segments:
|
104
|
+
- 0
|
105
|
+
hash: 1931070553266355197
|
106
|
+
requirements: []
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 1.8.24
|
109
|
+
signing_key:
|
110
|
+
specification_version: 3
|
111
|
+
summary: Keymaster.js, bundled for Rails 3.0 and up.
|
112
|
+
test_files: []
|