ultimate-flash 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +16 -0
- data/LICENSE +19 -0
- data/README.md +32 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/ultimate/flash.js.coffee +235 -0
- data/app/assets/stylesheets/ultimate/flash.scss +54 -0
- data/app/views/application/_flashes.html.haml +3 -0
- data/lib/ultimate-flash.rb +8 -0
- data/lib/ultimate-flash/engine.rb +6 -0
- data/lib/ultimate-flash/version.rb +5 -0
- data/ultimate-flash.gemspec +23 -0
- metadata +69 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2011-2012 Dmitry Karpunin (aka KODer) koderfunk@gmail.com
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Ruby on Rails oriented jQuery plugin for smart notifications
|
2
|
+
|
3
|
+
**Binding**:
|
4
|
+
|
5
|
+
```javascript
|
6
|
+
//= require ultimate/flash
|
7
|
+
window.flash = $(".l-page__flashes").ultimateFlash({locale: "ru"}, true);
|
8
|
+
```
|
9
|
+
|
10
|
+
## Licence ##
|
11
|
+
|
12
|
+
The MIT License
|
13
|
+
|
14
|
+
Copyright (c) 2011-2012 Dmitry Karpunin (aka KODer) koderfunk@gmail.com
|
15
|
+
|
16
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
17
|
+
of this software and associated documentation files (the "Software"), to deal
|
18
|
+
in the Software without restriction, including without limitation the rights
|
19
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
20
|
+
copies of the Software, and to permit persons to whom the Software is
|
21
|
+
furnished to do so, subject to the following conditions:
|
22
|
+
|
23
|
+
The above copyright notice and this permission notice shall be included in
|
24
|
+
all copies or substantial portions of the Software.
|
25
|
+
|
26
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
27
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
28
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
29
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
30
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
31
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
32
|
+
THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,235 @@
|
|
1
|
+
###*
|
2
|
+
* Ultimate Flash 0.6.0 - Ruby on Rails oriented jQuery plugin based on Ultimate Backbone
|
3
|
+
*
|
4
|
+
* Copyright 2011-2012 Karpunin Dmitry (KODer) / Evrone.com
|
5
|
+
*
|
6
|
+
* Dual licensed under the MIT and GPL licenses:
|
7
|
+
* http://www.opensource.org/licenses/mit-license.php
|
8
|
+
* http://www.gnu.org/licenses/gpl.html
|
9
|
+
*
|
10
|
+
###
|
11
|
+
|
12
|
+
###*
|
13
|
+
* $.fn.ultimateFlash() invoke Ultimate Flash functionality at first call on jQuery object
|
14
|
+
* for the first element in the set of matched elements.
|
15
|
+
* Subsequent calls forwarding on view methods or return view property.
|
16
|
+
* If last argument {Boolean} true, then returns {Flash}.
|
17
|
+
* @usage
|
18
|
+
* standart actions:
|
19
|
+
* construction .ultimateFlash([Object options = {}]) : {jQuery} jContainer
|
20
|
+
* updateOptions .pluginName({Object} options) : {Object} view options
|
21
|
+
* get options .pluginName("options") : {Object} view options
|
22
|
+
* show .ultimateFlash("show", String type, String text) : {jQuery} jFlash | {Boolean} false
|
23
|
+
* notice .ultimateFlash("notice", String text) : {jQuery} jFlash | {Boolean} false
|
24
|
+
* alert .ultimateFlash("alert", String text) : {jQuery} jFlash | {Boolean} false
|
25
|
+
* extended actions:
|
26
|
+
* auto .ultimateFlash("auto", {ArrayOrObject} obj) : {Array} ajFlashes | {Boolean} false
|
27
|
+
* ajaxSuccess .ultimateFlash("ajaxSuccess"[, Arguments successArgs = []])
|
28
|
+
* ajaxError .ultimateFlash("ajaxError"[, String text = translations.defaultErrorText][, Arguments errorArgs = []])
|
29
|
+
###
|
30
|
+
|
31
|
+
# TODO customizable show() and hide()
|
32
|
+
# TODO improve English
|
33
|
+
# TODO jGrowl features
|
34
|
+
|
35
|
+
#= require ultimate/backbone/view
|
36
|
+
#= require ultimate/backbone/extra/jquery-plugin-adapter
|
37
|
+
|
38
|
+
Ultimate.Backbone.Plugins ||= {}
|
39
|
+
|
40
|
+
class Ultimate.Backbone.Plugins.Flash extends Ultimate.Backbone.View
|
41
|
+
|
42
|
+
el: ".l-page__flashes"
|
43
|
+
|
44
|
+
@defaultLocales:
|
45
|
+
en:
|
46
|
+
defaultErrorText: "Error"
|
47
|
+
defaultThrownError: "server connection error"
|
48
|
+
formFieldsError: "Form filled with errors"
|
49
|
+
ru:
|
50
|
+
defaultErrorText: "Ошибка"
|
51
|
+
defaultThrownError: "ошибка соединения с сервером"
|
52
|
+
formFieldsError: "Форма заполнена с ошибками"
|
53
|
+
|
54
|
+
slideTime: 200
|
55
|
+
showTime: 3600
|
56
|
+
showTimePerChar: 30
|
57
|
+
showAjaxErrors: true # catch global jQuery.ajaxErrors(), try detect message and show it
|
58
|
+
showAjaxSuccesses: true # catch global jQuery.ajaxSuccessess(), try detect message and show it
|
59
|
+
detectFormErrors: true # can be function (parsedJSON)
|
60
|
+
detectPlainTextMaxLength: 200 # if response has plain text and its length fits, show it
|
61
|
+
hideOnClick: true # click on notice fire hide()
|
62
|
+
removeOnHide: true # remove notice DOM-element on hide
|
63
|
+
forceAddDotsAfterLastWord: false
|
64
|
+
forceRemoveDotsAfterLastWord: false
|
65
|
+
regExpLastWordWithoutDot: /[\wа-яёА-ЯЁ]{3,}$/
|
66
|
+
regExpLastWordWithDot: /([\wа-яёА-ЯЁ]{3,})\.$/
|
67
|
+
|
68
|
+
events:
|
69
|
+
"click .flash:not(:animated)" : "closeFlashClick"
|
70
|
+
|
71
|
+
initialize: (options) ->
|
72
|
+
super
|
73
|
+
# init flashes come from server in page
|
74
|
+
@jFlashes().each (index, flash) =>
|
75
|
+
jFlash = $(flash)
|
76
|
+
jFlash.html @_prepareText(jFlash.html())
|
77
|
+
@_setTimeout jFlash
|
78
|
+
# binding hook ajaxError handler
|
79
|
+
@$el.ajaxError =>
|
80
|
+
if @showAjaxErrors
|
81
|
+
a = @_ajaxSuccessParseArguments(arguments)
|
82
|
+
Ultimate.Backbone.debug ".Plugins.Flash.ajaxError", a
|
83
|
+
@ajaxError a.data, a.jqXHR
|
84
|
+
# binding hook ajaxSuccess handler
|
85
|
+
@$el.ajaxSuccess =>
|
86
|
+
if @showAjaxSuccesses
|
87
|
+
a = @_ajaxSuccessParseArguments(arguments)
|
88
|
+
Ultimate.Backbone.debug ".Plugins.Flash.ajaxSuccess", a
|
89
|
+
@ajaxSuccess a.data, a.jqXHR
|
90
|
+
|
91
|
+
# delegate event for hide on click
|
92
|
+
closeFlashClick: (event) ->
|
93
|
+
if @hideOnClick
|
94
|
+
@_hide $(event.currentTarget)
|
95
|
+
false
|
96
|
+
|
97
|
+
jFlashes: (filterSelector) ->
|
98
|
+
_jFlashes = @$(".flash")
|
99
|
+
if filterSelector then _jFlashes.filter(filterSelector) else _jFlashes
|
100
|
+
|
101
|
+
_prepareText: (text) ->
|
102
|
+
text = _.clean(text)
|
103
|
+
# Add dot after last word (if word has minimum 3 characters)
|
104
|
+
text += "." if @forceAddDotsAfterLastWord and @regExpLastWordWithoutDot.test(text)
|
105
|
+
text = text.replace(@regExpLastWordWithDot, "$1") if @forceRemoveDotsAfterLastWord
|
106
|
+
text
|
107
|
+
|
108
|
+
_hide: (jFlash) ->
|
109
|
+
clearTimeout jFlash.data("timeoutId")
|
110
|
+
jFlash.slideUp @slideTime, =>
|
111
|
+
jFlash.remove() if @removeOnHide
|
112
|
+
|
113
|
+
_setTimeout: (jFlash, timeout = @showTime + jFlash.text().length * @showTimePerChar) ->
|
114
|
+
if timeout
|
115
|
+
jFlash.data "timeoutId", setTimeout =>
|
116
|
+
jFlash.removeData("timeoutId")
|
117
|
+
@_hide jFlash
|
118
|
+
, timeout
|
119
|
+
|
120
|
+
show: (type, text, timeout = null) ->
|
121
|
+
return false if not _.isString(text) or _.isBlank(text)
|
122
|
+
jFlash = $("<div class=\"flash #{type}\" style=\"display: none;\">#{@_prepareText(text)}</div>")
|
123
|
+
jFlash.appendTo(@$el).slideDown @slideTime
|
124
|
+
@_setTimeout jFlash, timeout
|
125
|
+
jFlash
|
126
|
+
|
127
|
+
notice: (text, timeout = null) -> @show "notice", text, timeout
|
128
|
+
|
129
|
+
alert: (text, timeout = null) -> @show "alert", text, timeout
|
130
|
+
|
131
|
+
auto: (obj) ->
|
132
|
+
if _.isArray(obj)
|
133
|
+
@show(pair[0], pair[1]) for pair in obj
|
134
|
+
else if _.isObject(obj)
|
135
|
+
@show(key, text) for key, text of obj
|
136
|
+
else false
|
137
|
+
|
138
|
+
###*
|
139
|
+
* @param {Arguments} successArgs=[] аргументы колбэка jQuery.success()
|
140
|
+
* @return {data: data, jqXHR: jqXHR}
|
141
|
+
###
|
142
|
+
_ajaxSuccessParseArguments: (successArgs) ->
|
143
|
+
# detect event as first element
|
144
|
+
if successArgs[0] instanceof jQuery.Event
|
145
|
+
# convert arguments to Array
|
146
|
+
successArgs = args(successArgs)
|
147
|
+
# remove event
|
148
|
+
successArgs.shift()
|
149
|
+
# arrange arguments
|
150
|
+
if _.isString(successArgs[0])
|
151
|
+
# from jQuery.ajax().success()
|
152
|
+
[data, _textStatus, jqXHR] = successArgs
|
153
|
+
else
|
154
|
+
# from jQuery.ajaxSuccess() or jQuery.ajaxError()
|
155
|
+
[jqXHR, _ajaxSettings, data] = successArgs
|
156
|
+
data: data
|
157
|
+
jqXHR: jqXHR
|
158
|
+
|
159
|
+
###*
|
160
|
+
* @param {String|Object} data some data from ajax response
|
161
|
+
* @param {jqXHR} jqXHR jQuery XHR
|
162
|
+
* @return {Boolean} статус выполнения показа сообщения
|
163
|
+
###
|
164
|
+
# MAYBE jqXHR set default as jQuery.hxr or similar
|
165
|
+
ajaxSuccess: (data, jqXHR) ->
|
166
|
+
# prevent recall
|
167
|
+
return false if jqXHR.breakFlash
|
168
|
+
jqXHR.breakFlash = true
|
169
|
+
# detect notice
|
170
|
+
if _.isString(data)
|
171
|
+
# catch plain text message
|
172
|
+
data = _.trim(data)
|
173
|
+
return @notice(data) if data.length <= @detectPlainTextMaxLength and not $.isHTML(data)
|
174
|
+
else if _.isObject(data)
|
175
|
+
# catch json data with flash-notice
|
176
|
+
return @auto(data["flash"]) if data["flash"]
|
177
|
+
false
|
178
|
+
|
179
|
+
###*
|
180
|
+
* @param {String} [text="Ошибка"] вступительный (либо полный) текст формируемой ошибки
|
181
|
+
* @param {String} thrownError some error from ajax response
|
182
|
+
* @param {jqXHR} jqXHR jQuery XHR
|
183
|
+
* @return {Boolean} статус выполнения показа сообщения
|
184
|
+
###
|
185
|
+
ajaxError: (text, thrownError, jqXHR) ->
|
186
|
+
unless _.isObject(jqXHR)
|
187
|
+
jqXHR = thrownError
|
188
|
+
thrownError = text
|
189
|
+
text = @translations.defaultErrorText
|
190
|
+
# prevent undefined responses
|
191
|
+
return false if jqXHR.status < 100
|
192
|
+
# prevent recall
|
193
|
+
return false if jqXHR.breakFlash
|
194
|
+
jqXHR.breakFlash = true
|
195
|
+
if jqXHR.responseText
|
196
|
+
try
|
197
|
+
# try parse respose as json
|
198
|
+
if parsedJSON = $.parseJSON(jqXHR.responseText)
|
199
|
+
# catch "flash" object and call auto() method with autodetecting flash-notice type
|
200
|
+
return @auto(parsedJSON["flash"]) if parsedJSON["flash"]
|
201
|
+
# catch "error" object and call alert() method
|
202
|
+
return @alert(parsedJSON["error"]) if parsedJSON["error"]
|
203
|
+
# may be parsedJSON is form errors
|
204
|
+
if @detectFormErrors is true
|
205
|
+
# show message about form with errors
|
206
|
+
return @alert(@translations.formFieldsError)
|
207
|
+
else if _.isFunction(@detectFormErrors)
|
208
|
+
# using showFormError as callback
|
209
|
+
return @detectFormErrors.apply(@, [parsedJSON])
|
210
|
+
else
|
211
|
+
# nothing
|
212
|
+
return false
|
213
|
+
catch e
|
214
|
+
# nop
|
215
|
+
if jqXHR.status >= 400 and jqXHR.responseText
|
216
|
+
# try detect Rails raise message
|
217
|
+
if raiseMatches = jqXHR.responseText.match(/<\/h1>\n<pre>(.+?)<\/pre>/)
|
218
|
+
Ultimate.Backbone.debug "replace thrownError = \"#{thrownError}\" with raiseMatches[1] = \"#{raiseMatches[1]}\""
|
219
|
+
thrownError = raiseMatches[1]
|
220
|
+
else
|
221
|
+
# try detect short text message as error
|
222
|
+
if jqXHR.responseText.length <= @detectPlainTextMaxLength
|
223
|
+
Ultimate.Backbone.debug "replace thrownError = \"#{thrownError}\" with jqXHR.responseText = \"#{jqXHR.responseText}\""
|
224
|
+
thrownError = jqXHR.responseText
|
225
|
+
else
|
226
|
+
if _.isString(thrownError) and not _.isBlank(thrownError)
|
227
|
+
Ultimate.Backbone.debug "replace thrownError = \"#{thrownError}\" with @translations.defaultThrownError = \"#{@translations.defaultThrownError}\""
|
228
|
+
thrownError = @translations.defaultThrownError
|
229
|
+
text += ": " if text
|
230
|
+
text += "#{thrownError} [#{jqXHR.status}]"
|
231
|
+
return @alert(text)
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
Ultimate.Backbone.createJQueryPlugin "ultimateFlash", Ultimate.Backbone.Plugins.Flash
|
@@ -0,0 +1,54 @@
|
|
1
|
+
@mixin ultimate-flash(
|
2
|
+
$notice-background: #393,
|
3
|
+
$notice-border-color: #6c6,
|
4
|
+
$alert-background: #c33,
|
5
|
+
$alert-border-color: #e66,
|
6
|
+
$default-background: #06c,
|
7
|
+
$default-border-color: #39e,
|
8
|
+
$text-color: #fff,
|
9
|
+
$opacity: 1,
|
10
|
+
$background-alpha: 1
|
11
|
+
){
|
12
|
+
position: fixed;
|
13
|
+
width: 100%;
|
14
|
+
left: 0;
|
15
|
+
z-index: 9999;
|
16
|
+
text-align: center;
|
17
|
+
// >>> recomendations:
|
18
|
+
// @include invert_link_decoration();
|
19
|
+
// white-space: nowrap;
|
20
|
+
|
21
|
+
> .flash {
|
22
|
+
@if $background-alpha < 1 {
|
23
|
+
$notice-background: rgba($notice-background, $background-alpha);
|
24
|
+
$alert-background: rgba($alert-background, $background-alpha);
|
25
|
+
$default-background: rgba($default-background, $background-alpha);
|
26
|
+
}
|
27
|
+
padding: 10px;
|
28
|
+
top: 0;
|
29
|
+
width: 100%;
|
30
|
+
font-size: 24px;
|
31
|
+
line-height: 30px;
|
32
|
+
color: $text-color;
|
33
|
+
@include pie-bg($default-background);
|
34
|
+
border-bottom: 2px solid $default-border-color;
|
35
|
+
@if $opacity < 1 {
|
36
|
+
@include opacity($opacity);
|
37
|
+
}
|
38
|
+
// >>> recomendations:
|
39
|
+
// @include text-shadow_hard(#000 0 1px 0);
|
40
|
+
z-index: 9999;
|
41
|
+
a {
|
42
|
+
color: $text-color;
|
43
|
+
}
|
44
|
+
&.notice {
|
45
|
+
@include pie-bg($notice-background);
|
46
|
+
border-color: $notice-border-color;
|
47
|
+
}
|
48
|
+
&.alert {
|
49
|
+
@include pie-bg($alert-background);
|
50
|
+
border-color: $alert-border-color;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ultimate-flash/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ultimate-flash"
|
7
|
+
s.version = Ultimate::Flash::VERSION
|
8
|
+
s.authors = ["Dmitry KODer Karpunin"]
|
9
|
+
s.email = ["koderfunk@gmail.com"]
|
10
|
+
s.homepage = "http://github.com/KODerFunk/ultimate-flash"
|
11
|
+
s.summary = %q{Ruby on Rails oriented jQuery plugin for smart notifications}
|
12
|
+
s.description = %q{Ruby on Rails oriented jQuery plugin for smart notifications}
|
13
|
+
|
14
|
+
s.rubyforge_project = "ultimate-flash"
|
15
|
+
|
16
|
+
s.add_dependency "ultimate-base", "~> 0.2"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ultimate-flash
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Dmitry KODer Karpunin
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: ultimate-base
|
16
|
+
requirement: &17170900 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.2'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *17170900
|
25
|
+
description: Ruby on Rails oriented jQuery plugin for smart notifications
|
26
|
+
email:
|
27
|
+
- koderfunk@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Gemfile.lock
|
35
|
+
- LICENSE
|
36
|
+
- README.md
|
37
|
+
- Rakefile
|
38
|
+
- app/assets/javascripts/ultimate/flash.js.coffee
|
39
|
+
- app/assets/stylesheets/ultimate/flash.scss
|
40
|
+
- app/views/application/_flashes.html.haml
|
41
|
+
- lib/ultimate-flash.rb
|
42
|
+
- lib/ultimate-flash/engine.rb
|
43
|
+
- lib/ultimate-flash/version.rb
|
44
|
+
- ultimate-flash.gemspec
|
45
|
+
homepage: http://github.com/KODerFunk/ultimate-flash
|
46
|
+
licenses: []
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project: ultimate-flash
|
65
|
+
rubygems_version: 1.8.10
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Ruby on Rails oriented jQuery plugin for smart notifications
|
69
|
+
test_files: []
|