ultimate-base 0.3.2.1 → 0.3.3.0
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.lock +1 -1
- data/app/assets/javascripts/ultimate/backbone/view.js.coffee +0 -37
- data/app/assets/javascripts/ultimate/helpers/form_options.js.coffee +45 -4
- data/app/assets/javascripts/ultimate/helpers/record_tag.js.coffee +4 -3
- data/app/assets/javascripts/ultimate/helpers/tag.js.coffee +31 -21
- data/app/assets/javascripts/ultimate/helpers/url.js.coffee +51 -3
- data/app/assets/javascripts/ultimate/jquery-plugin-adapter.js.coffee +10 -2
- data/app/assets/javascripts/ultimate/jquery-plugin-class.js.coffee +35 -45
- data/app/assets/javascripts/ultimate/underscore/underscore.outcasts.js.coffee +12 -2
- data/app/assets/stylesheets/ultimate/mixins/_vendors.scss +1 -0
- data/app/assets/stylesheets/ultimate/mixins/css3/_text-shadow.scss +3 -0
- data/app/assets/stylesheets/ultimate/mixins/css3.scss +1 -2
- data/app/assets/stylesheets/ultimate/mixins/microstructures.scss +15 -0
- data/lib/ultimate/base/version.rb +1 -1
- data/test/javascripts/tests/helpers/form_options_test.js.coffee +89 -15
- data/test/javascripts/tests/helpers/record_tag_test.js.coffee +2 -0
- data/test/javascripts/tests/helpers/tag_test.js.coffee +19 -0
- data/test/javascripts/tests/jquery-plugin-class_test.js.coffee +66 -0
- metadata +10 -24
data/Gemfile.lock
CHANGED
@@ -4,13 +4,6 @@
|
|
4
4
|
|
5
5
|
class Ultimate.Backbone.View extends Backbone.View
|
6
6
|
|
7
|
-
@defaultLocales:
|
8
|
-
en: {}
|
9
|
-
ru: {}
|
10
|
-
|
11
|
-
locale: "en"
|
12
|
-
translations: {}
|
13
|
-
|
14
7
|
loadingState: null
|
15
8
|
loadingWidthMethodName: "innerWidth"
|
16
9
|
loadingHeightMethodName: "innerHeight"
|
@@ -86,7 +79,6 @@ class Ultimate.Backbone.View extends Backbone.View
|
|
86
79
|
# Overload parent method Backbone.View._configure() as hook for reflectOptions().
|
87
80
|
_configure: (options) ->
|
88
81
|
super
|
89
|
-
@initTranslations()
|
90
82
|
@reflectOptions()
|
91
83
|
|
92
84
|
reflectOptions: (viewOptions = _.result(@, "viewOptions"), options = @options) ->
|
@@ -94,35 +86,6 @@ class Ultimate.Backbone.View extends Backbone.View
|
|
94
86
|
@[attr] = value for attr, value of options when typeof @[attr] isnt "undefined"
|
95
87
|
@
|
96
88
|
|
97
|
-
updateOptions: (options) ->
|
98
|
-
@_configure(options)
|
99
|
-
@options
|
100
|
-
|
101
|
-
# use I18n, and modify locale and translations in options
|
102
|
-
# modify and return merged data
|
103
|
-
initTranslations: (options = @options) ->
|
104
|
-
# if global compatible I18n
|
105
|
-
if I18n? and I18n.locale and I18n.t
|
106
|
-
options["locale"] ||= I18n.locale
|
107
|
-
if options["locale"] is I18n.locale
|
108
|
-
# pointing to defaults locales of language specified in I18n
|
109
|
-
_defaultLocales = @constructor.defaultLocales?[I18n.locale] ||= {}
|
110
|
-
unless _defaultLocales["loaded"]
|
111
|
-
_defaultLocales["loaded"] = true
|
112
|
-
# try read localized strings
|
113
|
-
if _localesFromI18n = I18n.t(options["i18nKey"] or _.underscored(@constructor.pluginName or @constructor.name))
|
114
|
-
# fill it from I18n
|
115
|
-
_.extend _defaultLocales, _localesFromI18n
|
116
|
-
@locale = options["locale"] if options["locale"]
|
117
|
-
translations = if @locale then @constructor.defaultLocales?[@locale] or {} else {}
|
118
|
-
$.extend true, options, translations: translations, options
|
119
|
-
options
|
120
|
-
|
121
|
-
t: (key) ->
|
122
|
-
# TODO maybe use I18n there
|
123
|
-
@translations[key]
|
124
|
-
|
125
|
-
|
126
89
|
# Overloadable getter for jQuery-container that will be blocked.
|
127
90
|
getJLoadingContainer: -> @$el
|
128
91
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
).join("\n")
|
19
19
|
|
20
20
|
options_from_collection_for_select: (collection, value_method, text_method, selected = null) ->
|
21
|
-
options =
|
21
|
+
options = @__mapCollection collection, (element) ->
|
22
22
|
[@_value_for_collection(element, text_method), @_value_for_collection(element, value_method)]
|
23
23
|
[selected, disabled] = @_extract_selected_and_disabled(selected)
|
24
24
|
select_deselect =
|
@@ -26,6 +26,27 @@
|
|
26
26
|
disabled: @_extract_values_from_collection(collection, value_method, disabled)
|
27
27
|
@options_for_select(options, select_deselect)
|
28
28
|
|
29
|
+
option_groups_from_collection_for_select: (collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = null) ->
|
30
|
+
@__mapCollection(collection, (group) ->
|
31
|
+
option_tags = @options_from_collection_for_select(_.result(group, group_method), option_key_method, option_value_method, selected_key)
|
32
|
+
Ultimate.Helpers.Tag.content_tag_string 'optgroup', option_tags, label: _.result(group, group_label_method), true, false
|
33
|
+
).join('')
|
34
|
+
|
35
|
+
grouped_options_for_select: (grouped_options, selected_key = null, options = {}) ->
|
36
|
+
prompt = options['prompt']
|
37
|
+
divider = options['divider']
|
38
|
+
body = ""
|
39
|
+
if prompt
|
40
|
+
body += Ultimate.Helpers.Tag.content_tag_string('option', @_prompt_text(prompt), value: '')
|
41
|
+
grouped_options = _.outcasts.sortHash(grouped_options) if $.isPlainObject(grouped_options)
|
42
|
+
_.each grouped_options, (container) ->
|
43
|
+
if divider
|
44
|
+
label = divider
|
45
|
+
else
|
46
|
+
[label, container] = container
|
47
|
+
body += Ultimate.Helpers.Tag.content_tag_string('optgroup', @options_for_select(container, selected_key), label: label, true, false)
|
48
|
+
body
|
49
|
+
|
29
50
|
|
30
51
|
|
31
52
|
_option_html_attributes: (element) ->
|
@@ -56,10 +77,30 @@
|
|
56
77
|
|
57
78
|
_extract_values_from_collection: (collection, value_method, selected) ->
|
58
79
|
if _.isFunction(selected)
|
59
|
-
_.compact
|
60
|
-
|
80
|
+
_.compact @__mapCollection collection, (element) ->
|
81
|
+
@__getValueFromElement(element, value_method) if selected(element)
|
61
82
|
else
|
62
83
|
selected
|
63
84
|
|
64
85
|
_value_for_collection: (item, value) ->
|
65
|
-
if _.isFunction(value)
|
86
|
+
if _.isFunction(value)
|
87
|
+
value(item)
|
88
|
+
else
|
89
|
+
@__getValueFromElement(item, value)
|
90
|
+
|
91
|
+
_prompt_text: (prompt) ->
|
92
|
+
prompt = if _.isString(prompt) then prompt else I18n?.translate('helpers.select.prompt', default: 'Please select') ? 'Please select'
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
__getValueFromElement: (element, property) ->
|
97
|
+
if _.isFunction(element.get)
|
98
|
+
element.get(property)
|
99
|
+
else
|
100
|
+
_.result(element, property)
|
101
|
+
|
102
|
+
__mapCollection: (collection, iterator) ->
|
103
|
+
if _.isFunction(collection.map)
|
104
|
+
collection.map(iterator)
|
105
|
+
else
|
106
|
+
_.map(collection, iterator)
|
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
content_tag_for: (tag_name, single_or_multiple_records, prefix = null, options = null, block = null) ->
|
10
10
|
block = _.outcasts.blockGiven(arguments)
|
11
|
-
if _.isFunction(single_or_multiple_records
|
11
|
+
if _.isFunction(single_or_multiple_records?.map)
|
12
12
|
single_or_multiple_records.map( (single_record) =>
|
13
13
|
@content_tag_for_single_record(tag_name, single_record, prefix, options, block)
|
14
14
|
).join("\n")
|
@@ -16,6 +16,7 @@
|
|
16
16
|
@content_tag_for_single_record(tag_name, single_or_multiple_records, prefix, options, block)
|
17
17
|
|
18
18
|
content_tag_for_single_record: (tag_name, record, prefix, options, block = null) ->
|
19
|
+
return '' unless record?
|
19
20
|
[options, prefix] = [prefix, null] if _.isObject(prefix)
|
20
21
|
block = _.outcasts.blockGiven(arguments)
|
21
22
|
options = if _.isObject(options) then _.clone(options) else {}
|
@@ -29,7 +30,7 @@
|
|
29
30
|
|
30
31
|
# from ActionView::ModelNaming
|
31
32
|
model_name_from_record_or_class: (record_or_class) ->
|
32
|
-
modelClass = record_or_class
|
33
|
+
modelClass = record_or_class?.constructor ? record_or_class
|
33
34
|
if modelClass?
|
34
35
|
modelClass.modelName or modelClass.className or modelClass.name or 'Model'
|
35
36
|
else
|
@@ -77,4 +78,4 @@
|
|
77
78
|
# protected
|
78
79
|
|
79
80
|
_record_key_for_dom_id: (record) ->
|
80
|
-
record
|
81
|
+
record?.id
|
@@ -24,8 +24,8 @@
|
|
24
24
|
splitted = content.replace(/\]\]>/g, ']]]]><![CDATA[>')
|
25
25
|
"<![CDATA[#{splitted}]]>"
|
26
26
|
|
27
|
-
content_tag_string: (name, content = '', options = {}, escape = true) ->
|
28
|
-
content = _.string.escapeHTML(content) if
|
27
|
+
content_tag_string: (name, content = '', options = {}, escape = true, _escapeContent = escape) ->
|
28
|
+
content = _.string.escapeHTML(content) if _escapeContent
|
29
29
|
"<#{name}#{@tag_options(options, escape)}>#{@PRE_CONTENT_STRINGS[name] ? ''}#{content}</#{name}>"
|
30
30
|
|
31
31
|
html_options_to_s: (html_options, escape = false, prefix = "") ->
|
@@ -58,24 +58,34 @@
|
|
58
58
|
value = _.string.escapeHTML(value) if escape
|
59
59
|
"#{key}=\"#{value}\""
|
60
60
|
|
61
|
+
concat_class: ->
|
62
|
+
flatten_classes = _.filter( _.flatten(arguments), (e) -> _.isString(e) ).join(' ')
|
63
|
+
_.uniq( _.string.words(flatten_classes) ).join(' ')
|
61
64
|
|
62
65
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
66
|
+
|
67
|
+
selfClosedTags: _.string.words('area base br col command embed hr img input keygen link meta param source track wbr')
|
68
|
+
|
69
|
+
# Generate html from zen-selector. Ninja tool.
|
70
|
+
# TODO more zen features: +, *x, {content}
|
71
|
+
# TODO cache
|
72
|
+
selectorToHtml: (selector) ->
|
73
|
+
if matches = selector.match(/^[\s>]*([\w\.#]+)(.*)$/)
|
74
|
+
selector = matches[1]
|
75
|
+
continuation = matches[2] # in v1 {(if continuation then ">" + content else " />")}
|
76
|
+
tag_name = selector.match(/^\w+/)?[0] or 'div'
|
77
|
+
id = selector.match(/#(\w+)/)?[1]
|
78
|
+
classes = _.map( selector.match(/\.\w+/g), (c) -> _.string.ltrim(c, '.') )
|
79
|
+
html_options = {}
|
80
|
+
html_options['id'] = id if id
|
81
|
+
html_options['class'] = classes.join(' ') if classes.length
|
82
|
+
if _.contains(@selfClosedTags, tag_name)
|
83
|
+
@tag(tag_name, html_options)
|
84
|
+
else
|
85
|
+
continuation = @selectorToHtml(continuation) if continuation
|
86
|
+
@content_tag(tag_name, continuation, html_options)
|
87
|
+
# else if matches = selector.match(/^\s*\+\s*(.*)$/) # /^\s*\+\s*([\w\.#]+)(.*)$/)
|
88
|
+
# continuation = matches[1]
|
89
|
+
# if continuation then @selectorToHtml(continuation) else continuation
|
90
|
+
else
|
91
|
+
''
|
@@ -3,7 +3,7 @@
|
|
3
3
|
#= require ./javascript
|
4
4
|
|
5
5
|
__char_encode = (char) -> "%#{char.charCodeAt(0).toString(16)}"
|
6
|
-
|
6
|
+
__escape_path = (str) -> str.replace(/[^*\-.0-9A-Z_a-z]/g, __char_encode).replace(/\+/g, '%20')
|
7
7
|
__string_encode = (str) -> _.map(str, (char) -> "&##{char.charCodeAt(0)};" ).join('')
|
8
8
|
|
9
9
|
@Ultimate.Helpers.Url =
|
@@ -41,7 +41,38 @@ __string_encode = (str) -> _.map(str, (char) -> "&##{char.charCodeAt(0)};" ).joi
|
|
41
41
|
[options, name] = [name, null] if block = _.outcasts.blockGiven(arguments)
|
42
42
|
@link_to [name, options, html_options, block]...
|
43
43
|
|
44
|
+
# TODO tests
|
45
|
+
link_to_unless_current_span: (name, options = null, html_options = null, block = null) ->
|
46
|
+
[html_options, options] = [options, name] if block = _.outcasts.blockGiven(arguments)
|
47
|
+
url = @url_for(options)
|
48
|
+
if @current_page_(url)
|
49
|
+
if block
|
50
|
+
Ultimate.Helpers.Tag.content_tag('span', html_options, null, false, block)
|
51
|
+
else
|
52
|
+
Ultimate.Helpers.Tag.content_tag('span', name ? url, html_options, false)
|
53
|
+
else
|
54
|
+
if block
|
55
|
+
@link_to options, html_options, block
|
56
|
+
else
|
57
|
+
@link_to name, options, html_options
|
58
|
+
|
59
|
+
# TODO tests
|
60
|
+
link_to_unless_current: (name, options = {}, html_options = {}, block = null) ->
|
61
|
+
@link_to_unless @current_page_(options), name, options, html_options, block
|
62
|
+
|
63
|
+
# TODO tests
|
64
|
+
link_to_unless: (condition, name, options = {}, html_options = {}, block = null) ->
|
65
|
+
if condition
|
66
|
+
if block = _.outcasts.blockGiven(arguments)
|
67
|
+
block(name, options, html_options)
|
68
|
+
else
|
69
|
+
name
|
70
|
+
else
|
71
|
+
@link_to name, options, html_options, block
|
44
72
|
|
73
|
+
# TODO tests
|
74
|
+
link_to_if: (condition, name, options = {}, html_options = {}, block = null) ->
|
75
|
+
@link_to_unless not condition, name, options, html_options, block
|
45
76
|
|
46
77
|
mail_to: (email_address, name = null, html_options = {}) ->
|
47
78
|
email_address = _.string.escapeHTML(email_address)
|
@@ -49,7 +80,7 @@ __string_encode = (str) -> _.map(str, (char) -> "&##{char.charCodeAt(0)};" ).joi
|
|
49
80
|
extras = _.compact _.map _.string.words('cc bcc body subject'), (item) ->
|
50
81
|
option = _.outcasts.delete(html_options, item)
|
51
82
|
if option?
|
52
|
-
"#{item}=#{
|
83
|
+
"#{item}=#{__escape_path(option)}"
|
53
84
|
extras = if _.isEmpty(extras) then '' else '?' + _.string.escapeHTML(extras.join('&'))
|
54
85
|
email_address_obfuscated = email_address
|
55
86
|
email_address_obfuscated = email_address_obfuscated.replace('@', _.outcasts.delete(html_options, 'replace_at')) if 'replace_at' of html_options
|
@@ -67,6 +98,15 @@ __string_encode = (str) -> _.map(str, (char) -> "&##{char.charCodeAt(0)};" ).joi
|
|
67
98
|
else
|
68
99
|
@link_to name or email_address_obfuscated, "mailto:#{email_address}#{extras}", html_options
|
69
100
|
|
101
|
+
# TODO tests
|
102
|
+
current_page_: (options) ->
|
103
|
+
url_string = @url_for(options)
|
104
|
+
request_uri = location.pathname
|
105
|
+
if /^\w+:\/\//.test(url_string)
|
106
|
+
url_string == "#{location.protocol}#{location.host}#{request_uri}"
|
107
|
+
else
|
108
|
+
url_string == request_uri
|
109
|
+
|
70
110
|
|
71
111
|
|
72
112
|
_convert_options_to_data_attributes: (options, html_options) ->
|
@@ -91,8 +131,16 @@ __string_encode = (str) -> _.map(str, (char) -> "&##{char.charCodeAt(0)};" ).joi
|
|
91
131
|
html_options
|
92
132
|
|
93
133
|
__protect_against_forgery: false
|
94
|
-
__form_authenticity_token: 'secret'
|
95
134
|
__request_forgery_protection_token: 'form_token'
|
135
|
+
__form_authenticity_token: 'secret'
|
136
|
+
|
137
|
+
__init_request_forgery_protection: ->
|
138
|
+
param = $('head meta[name="csrf-param"]').attr('content')
|
139
|
+
token = $('head meta[name="csrf-token"]').attr('content')
|
140
|
+
if param and token
|
141
|
+
@__protect_against_forgery = true
|
142
|
+
@__request_forgery_protection_token = param
|
143
|
+
@__form_authenticity_token = token
|
96
144
|
|
97
145
|
_token_tag: (token = @__form_authenticity_token) ->
|
98
146
|
if token isnt false and @__protect_against_forgery
|
@@ -1,5 +1,13 @@
|
|
1
1
|
#= require ./base
|
2
2
|
|
3
|
+
# TODO minimize requirements
|
4
|
+
# requirements stats:
|
5
|
+
# 1 _.extend
|
6
|
+
# 1 _.isString
|
7
|
+
# 1 _.isBoolean
|
8
|
+
# 1 _.toArray
|
9
|
+
# 1 _.last
|
10
|
+
|
3
11
|
###*
|
4
12
|
* Make $.fn.pluginName() as adapter to plugin object (instance of Ultimate.Plugin or Backbone.View).
|
5
13
|
* First call on jQuery object invoke View functionality for the first element in the set of matched elements.
|
@@ -13,7 +21,7 @@
|
|
13
21
|
###
|
14
22
|
|
15
23
|
Ultimate.createJQueryPlugin = (pluginName, pluginClass) ->
|
16
|
-
Ultimate.debug(".createJQueryPlugin()", pluginName, pluginClass) if
|
24
|
+
Ultimate.debug(".createJQueryPlugin()", pluginName, pluginClass) if $.isFunction(Ultimate.debug)
|
17
25
|
pluginClass.pluginName ||= pluginName
|
18
26
|
jQuery.fn[pluginName] = -> @ultimatePluginAdapter pluginName, pluginClass, arguments
|
19
27
|
|
@@ -46,7 +54,7 @@ do ($ = jQuery) ->
|
|
46
54
|
return if _returnPlugin then plugin else jContainer
|
47
55
|
if command of plugin
|
48
56
|
value = plugin[command]
|
49
|
-
return if
|
57
|
+
return if $.isFunction(value)
|
50
58
|
plugin.$el.removeData(pluginName) if command is "destroy"
|
51
59
|
result = value.apply(plugin, args)
|
52
60
|
if command is "_configure" then plugin.options else result
|
@@ -25,26 +25,24 @@ class Ultimate.Plugin
|
|
25
25
|
|
26
26
|
options: {}
|
27
27
|
|
28
|
-
|
28
|
+
# @defaultLocales: { en: {} }
|
29
|
+
locale: 'en'
|
29
30
|
translations: {}
|
30
31
|
|
31
32
|
constructor: (options) ->
|
32
|
-
|
33
|
+
throw new Error('Property `el` must be specified at first argument of Ultimate.Plugin.constructor') unless options?.el
|
34
|
+
@cid = _.uniqueId('ultimatePlugin_')
|
35
|
+
@_configure options
|
33
36
|
@$el = $(@el)
|
34
37
|
@findNodes()
|
35
|
-
@initialize arguments...
|
38
|
+
@initialize? arguments...
|
36
39
|
@delegateEvents()
|
37
40
|
|
38
|
-
|
39
41
|
# jQuery delegate for element lookup, scoped to DOM elements within the
|
40
42
|
# current plugin. This should be prefered to global lookups where possible.
|
41
43
|
$: (selector) ->
|
42
44
|
@$el.find(selector)
|
43
45
|
|
44
|
-
# Initialize is an empty function by default. Override it with your own
|
45
|
-
# initialization logic.
|
46
|
-
initialize: ->
|
47
|
-
|
48
46
|
findNodes: (jRoot = @$el, nodes = @nodes) ->
|
49
47
|
jNodes = {}
|
50
48
|
nodes = if _.isFunction(nodes) then @nodes.call(@) else _.clone(nodes)
|
@@ -53,18 +51,24 @@ class Ultimate.Plugin
|
|
53
51
|
_isObject = _.isObject(selector)
|
54
52
|
if _isObject
|
55
53
|
nestedNodes = selector
|
56
|
-
selector = _.outcasts.delete(nestedNodes,
|
54
|
+
selector = _.outcasts.delete(nestedNodes, 'selector')
|
57
55
|
jNodes[nodeName] = @[nodeName] = jRoot.find(selector)
|
58
56
|
if _isObject
|
59
57
|
_.extend jNodes, @findNodes(jNodes[nodeName], nestedNodes)
|
60
58
|
jNodes
|
61
59
|
|
62
60
|
undelegateEvents: ->
|
63
|
-
@$el.unbind ".
|
61
|
+
@$el.unbind ".delegateEvents_#{@cid}"
|
64
62
|
|
65
63
|
# Cached regex to split keys for `delegate`, from backbone.js.
|
66
64
|
delegateEventSplitter = /^(\S+)\s*(.*)$/
|
67
65
|
|
66
|
+
# Overload and proxy parent method Backbone.View.delegateEvents() as hook for normalizeEvents().
|
67
|
+
delegateEvents: (events) ->
|
68
|
+
args = _.toArray(arguments)
|
69
|
+
args[0] = @_normalizeEvents(events)
|
70
|
+
@_delegateEvents args...
|
71
|
+
|
68
72
|
# delegateEvents() from backbone.js
|
69
73
|
_delegateEvents: (events = _.result(@, "events")) ->
|
70
74
|
return unless events
|
@@ -74,20 +78,13 @@ class Ultimate.Plugin
|
|
74
78
|
throw new Error("Method \"#{events[key]}\" does not exist") unless method
|
75
79
|
[[], eventName, selector] = key.match(delegateEventSplitter)
|
76
80
|
method = _.bind(method, @)
|
77
|
-
eventName += ".
|
81
|
+
eventName += ".delegateEvents_#{@cid}"
|
78
82
|
if selector is ''
|
79
83
|
@$el.bind(eventName, method)
|
80
84
|
else
|
81
85
|
@$el.delegate(selector, eventName, method)
|
82
86
|
|
83
|
-
|
84
|
-
delegateEvents: (events) ->
|
85
|
-
args = []
|
86
|
-
Array::push.apply args, arguments if arguments.length > 0
|
87
|
-
args[0] = @normalizeEvents(events)
|
88
|
-
@_delegateEvents args...
|
89
|
-
|
90
|
-
normalizeEvents: (events) ->
|
87
|
+
_normalizeEvents: (events) ->
|
91
88
|
events = _.result(@, "events") unless events
|
92
89
|
if events
|
93
90
|
normalizedEvents = {}
|
@@ -104,31 +101,24 @@ class Ultimate.Plugin
|
|
104
101
|
|
105
102
|
_configure: (options) ->
|
106
103
|
_.extend @options, options
|
107
|
-
@
|
108
|
-
@
|
104
|
+
#cout '@options', @options
|
105
|
+
@_reflectOptions()
|
106
|
+
@_initTranslations()
|
109
107
|
|
110
|
-
|
108
|
+
_reflectOptions: (reflectableOptions = _.result(@, "reflectableOptions"), options = @options) ->
|
111
109
|
if _.isArray(reflectableOptions)
|
112
|
-
@[attr] = options[attr] for attr in reflectableOptions when
|
113
|
-
@[attr] = value for attr, value of options when
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
#
|
121
|
-
|
122
|
-
#
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
# # try read localized strings
|
128
|
-
# if _localesFromI18n = I18n.t(options["i18nKey"] or _.string.underscored(@constructor.pluginName or @constructor.name))
|
129
|
-
# # fill it from I18n
|
130
|
-
# _.extend _defaultLocales, _localesFromI18n
|
131
|
-
@locale = options["locale"] if options["locale"]
|
132
|
-
translations = if @locale then @constructor.defaultLocales?[@locale] or {} else {}
|
133
|
-
$.extend true, options, translations: translations, options
|
134
|
-
options
|
110
|
+
@[attr] = options[attr] for attr in reflectableOptions when not _.isUndefined(options[attr])
|
111
|
+
@[attr] = value for attr, value of options when not _.isUndefined(@[attr])
|
112
|
+
|
113
|
+
# use I18n, and modify locale and translations
|
114
|
+
_initTranslations: ->
|
115
|
+
if @constructor.defaultLocales?
|
116
|
+
if not @options["locale"] and I18n?.locale of @constructor.defaultLocales
|
117
|
+
@locale = I18n.locale
|
118
|
+
#cout '!!!Set LOCALE FROM I18N ', @locale
|
119
|
+
defaultTranslations = if @locale then @constructor.defaultLocales[@locale] or {} else {}
|
120
|
+
#cout '!!!defaultTranslations', @locale, defaultTranslations
|
121
|
+
_.defaults @translations, defaultTranslations
|
122
|
+
|
123
|
+
t: (key) ->
|
124
|
+
@translations[key] or _.string.humanize(key)
|
@@ -4,7 +4,7 @@
|
|
4
4
|
Underscore.outcasts is freely distributable under the terms of the MIT license.
|
5
5
|
Documentation: https://github.com/KODerFunk/underscore.outcasts
|
6
6
|
Some code is borrowed from outcasts pull requests to Underscore.
|
7
|
-
Version '0.1.
|
7
|
+
Version '0.1.4'
|
8
8
|
###
|
9
9
|
|
10
10
|
'use strict'
|
@@ -15,7 +15,7 @@
|
|
15
15
|
|
16
16
|
UnderscoreOutcasts =
|
17
17
|
|
18
|
-
VERSION: '0.1.
|
18
|
+
VERSION: '0.1.4'
|
19
19
|
|
20
20
|
delete: (object, key) ->
|
21
21
|
value = object[key]
|
@@ -73,6 +73,16 @@ UnderscoreOutcasts =
|
|
73
73
|
else
|
74
74
|
[object]
|
75
75
|
|
76
|
+
# http://coderwall.com/p/krcdig
|
77
|
+
deepBindAll: (obj) ->
|
78
|
+
target = _.last(arguments)
|
79
|
+
for key, value of obj
|
80
|
+
if _.isFunction(value)
|
81
|
+
obj[key] = _.bind(value, target)
|
82
|
+
else if _.isObject(value)
|
83
|
+
obj[key] = _.deepBindAll(value, target)
|
84
|
+
obj
|
85
|
+
|
76
86
|
###
|
77
87
|
Split array into slices of <number> elements.
|
78
88
|
Map result by iterator if last given.
|
@@ -1,12 +1,11 @@
|
|
1
1
|
// Use compatibility tables from http://caniuse.com/
|
2
|
-
// http://css3pie.com/documentation/supported-css3-features/#pie-watch-ancestors
|
3
2
|
// http://css3pie.com/documentation/supported-css3-features/#pie-lazy-init
|
4
|
-
// TODO use !default http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variable_defaults_
|
5
3
|
|
6
4
|
$support-ie: true !default;
|
7
5
|
$pie-url: asset-url("polyfills/PIE.htc", '') !default;
|
8
6
|
$boxsizing-url: asset-url("polyfills/boxsizing.htc", '') !default;
|
9
7
|
|
8
|
+
|
10
9
|
@mixin pie($poll: none, $watch-ancestors: 0) {
|
11
10
|
@if $support-ie and $pie-url {
|
12
11
|
behavior: $pie-url;
|
@@ -65,6 +65,21 @@ $support-ie: true !default;
|
|
65
65
|
}
|
66
66
|
}
|
67
67
|
|
68
|
+
@mixin position($top: false, $right: false, $bottom: false, $left: false, $position: absolute) {
|
69
|
+
@if length($top) == 4 {
|
70
|
+
$left : nth($top, 4);
|
71
|
+
$bottom : nth($top, 3);
|
72
|
+
$right : nth($top, 2);
|
73
|
+
$top : nth($top, 1);
|
74
|
+
@if isset($right) { $position: $right; }
|
75
|
+
}
|
76
|
+
@if isset($position) { position: $position; }
|
77
|
+
@if isset($top) { top: $top; }
|
78
|
+
@if isset($right) { right: $right; }
|
79
|
+
@if isset($bottom) { botttom: $bottom; }
|
80
|
+
@if isset($left) { left: $left; }
|
81
|
+
}
|
82
|
+
|
68
83
|
@mixin before($display: block, $content: '') {
|
69
84
|
&:before {
|
70
85
|
display: $display;
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#= require ultimate/underscore/underscore
|
2
2
|
#= require ultimate/underscore/underscore.string
|
3
3
|
#= require ultimate/underscore/underscore.outcasts
|
4
|
+
#= require ultimate/backbone/lib/backbone
|
4
5
|
#= require ultimate/helpers/form_options
|
5
6
|
|
6
7
|
module "Ultimate.Helpers.FormOptions"
|
@@ -53,31 +54,24 @@ test "options_for_select", ->
|
|
53
54
|
|
54
55
|
|
55
56
|
|
56
|
-
class
|
57
|
-
title : null
|
58
|
-
author_name : null
|
59
|
-
body : null
|
60
|
-
secret : null
|
61
|
-
written_on : null
|
62
|
-
category : null
|
63
|
-
origin : null
|
64
|
-
allow_comments : null
|
65
|
-
|
57
|
+
class Struct
|
66
58
|
constructor: ->
|
67
|
-
|
68
|
-
|
69
|
-
|
59
|
+
for key, index in @constructor.keys
|
60
|
+
@[key] = arguments[index] ? null
|
61
|
+
|
62
|
+
class Post extends Struct
|
63
|
+
@keys = ['title', 'author_name', 'body', 'secret', 'written_on', 'category', 'origin', 'allow_comments']
|
70
64
|
|
71
65
|
dummy_posts =
|
72
66
|
[ new Post("<Abe> went home", "<Abe>", "To a little house", "shh!"),
|
73
67
|
new Post("Babe went home", "Babe", "To a little house", "shh!"),
|
74
|
-
new Post("Cabe went home", "Cabe", "To a little house", "shh!") ]
|
68
|
+
new Post("Cabe went home", "Cabe", (-> "To a little house"), (-> "shh!")) ]
|
75
69
|
|
76
70
|
test "options_from_collection_for_select", ->
|
77
71
|
equal options_from_collection_for_select(dummy_posts, "author_name", "title"),
|
78
72
|
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
79
73
|
equal options_from_collection_for_select(dummy_posts, "author_name", "title", "Babe"),
|
80
|
-
|
74
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
81
75
|
equal options_from_collection_for_select(dummy_posts, "author_name", "title", [ "Babe", "Cabe" ]),
|
82
76
|
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option selected=\"selected\" value=\"Cabe\">Cabe went home</option>"
|
83
77
|
equal options_from_collection_for_select(dummy_posts, "author_name", "title", (p) -> p.author_name is 'Babe'),
|
@@ -94,3 +88,83 @@ test "options_from_collection_for_select", ->
|
|
94
88
|
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
95
89
|
equal options_from_collection_for_select(dummy_posts, "author_name", (p) -> p.title),
|
96
90
|
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
_objectsArrayToHashesArray = (objectsArray) ->
|
95
|
+
_.map objectsArray, (element) ->
|
96
|
+
hash = {}
|
97
|
+
for key in element.constructor.keys
|
98
|
+
hash[key] = element[key]
|
99
|
+
hash
|
100
|
+
|
101
|
+
test "options_from_collection_for_select with array of hashes", ->
|
102
|
+
equal options_from_collection_for_select(_objectsArrayToHashesArray(dummy_posts), "author_name", "title", "Babe"),
|
103
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
class BBPost extends Backbone.Model
|
108
|
+
|
109
|
+
class BBPosts extends Backbone.Collection
|
110
|
+
model: BBPost
|
111
|
+
|
112
|
+
test "options_from_collection_for_select with Backbone.Collection", ->
|
113
|
+
bbPosts = new BBPosts(_objectsArrayToHashesArray(dummy_posts))
|
114
|
+
equal options_from_collection_for_select(bbPosts, "author_name", "title", "Babe"),
|
115
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option selected=\"selected\" value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
116
|
+
equal options_from_collection_for_select(bbPosts, "author_name", "title", disabled: (p) -> p.get('author_name') in ['Babe', 'Cabe']),
|
117
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option disabled=\"disabled\" value=\"Babe\">Babe went home</option>\n<option disabled=\"disabled\" value=\"Cabe\">Cabe went home</option>"
|
118
|
+
equal options_from_collection_for_select(bbPosts, ((p) -> p.get('author_name')), "title"),
|
119
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
120
|
+
equal options_from_collection_for_select(bbPosts, "author_name", (p) -> p.get('title')),
|
121
|
+
"<option value=\"<Abe>\"><Abe> went home</option>\n<option value=\"Babe\">Babe went home</option>\n<option value=\"Cabe\">Cabe went home</option>"
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
class Continent extends Struct
|
126
|
+
@keys = ['continent_name', 'countries']
|
127
|
+
|
128
|
+
class Country extends Struct
|
129
|
+
@keys = ['country_id', 'country_name']
|
130
|
+
|
131
|
+
dummy_continents =
|
132
|
+
[ new Continent("<Africa>", [new Country("<sa>", "<South Africa>"), new Country("so", "Somalia")]),
|
133
|
+
new Continent("Europe", [new Country("dk", "Denmark"), new Country("ie", "Ireland")]) ]
|
134
|
+
|
135
|
+
test "option_groups_from_collection_for_select", ->
|
136
|
+
equal option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk"),
|
137
|
+
"<optgroup label=\"<Africa>\"><option value=\"<sa>\"><South Africa></option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option selected=\"selected\" value=\"dk\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>"
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
class BBContinent extends Backbone.Model
|
142
|
+
|
143
|
+
class BBContinents extends Backbone.Collection
|
144
|
+
model: BBContinent
|
145
|
+
|
146
|
+
test "option_groups_from_collection_for_select with Backbone.Collection", ->
|
147
|
+
BBContinents = new BBContinents(_objectsArrayToHashesArray(dummy_continents))
|
148
|
+
equal option_groups_from_collection_for_select(dummy_continents, "countries", "continent_name", "country_id", "country_name", "dk"),
|
149
|
+
"<optgroup label=\"<Africa>\"><option value=\"<sa>\"><South Africa></option>\n<option value=\"so\">Somalia</option></optgroup><optgroup label=\"Europe\"><option selected=\"selected\" value=\"dk\">Denmark</option>\n<option value=\"ie\">Ireland</option></optgroup>"
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
test "grouped_options_for_select", ->
|
154
|
+
equal grouped_options_for_select([
|
155
|
+
["North America",
|
156
|
+
[['United States','US'],"Canada"]],
|
157
|
+
["Europe",
|
158
|
+
[["Great Britain","GB"], "Germany"]]
|
159
|
+
]),
|
160
|
+
"<optgroup label=\"North America\"><option value=\"US\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"Europe\"><option value=\"GB\">Great Britain</option>\n<option value=\"Germany\">Germany</option></optgroup>"
|
161
|
+
equal grouped_options_for_select([['US',"Canada"] , ["GB", "Germany"]], null, divider: "----------"),
|
162
|
+
"<optgroup label=\"----------\"><option value=\"US\">US</option>\n<option value=\"Canada\">Canada</option></optgroup><optgroup label=\"----------\"><option value=\"GB\">GB</option>\n<option value=\"Germany\">Germany</option></optgroup>"
|
163
|
+
equal grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]], "Cowboy Hat", prompt: "Choose a product..."),
|
164
|
+
"<option value=\"\">Choose a product...</option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option selected=\"selected\" value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>"
|
165
|
+
equal grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]], "Cowboy Hat", prompt: true),
|
166
|
+
"<option value=\"\">Please select</option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option selected=\"selected\" value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>"
|
167
|
+
equal grouped_options_for_select([["Hats", ["Baseball Cap","Cowboy Hat"]]], null, prompt: '<Choose One>'),
|
168
|
+
"<option value=\"\"><Choose One></option><optgroup label=\"Hats\"><option value=\"Baseball Cap\">Baseball Cap</option>\n<option value=\"Cowboy Hat\">Cowboy Hat</option></optgroup>"
|
169
|
+
equal grouped_options_for_select({'North America': ['United States','Canada'], 'Europe': ['Denmark','Germany']}),
|
170
|
+
"<optgroup label=\"Europe\"><option value=\"Denmark\">Denmark</option>\n<option value=\"Germany\">Germany</option></optgroup><optgroup label=\"North America\"><option value=\"United States\">United States</option>\n<option value=\"Canada\">Canada</option></optgroup>"
|
@@ -47,6 +47,8 @@ test "content_tag_for", ->
|
|
47
47
|
options = class: 'important'
|
48
48
|
content_tag_for('li', record, options)
|
49
49
|
deepEqual options, class: 'important'
|
50
|
+
strictEqual content_tag_for('tr', null), ""
|
51
|
+
strictEqual content_tag_for('tr', [null, null]), "\n"
|
50
52
|
|
51
53
|
test "div_for", ->
|
52
54
|
record.id = 36
|
@@ -36,3 +36,22 @@ test "cdata_section", ->
|
|
36
36
|
equal cdata_section("<hello world>"), "<![CDATA[<hello world>]]>"
|
37
37
|
equal cdata_section("hello]]>world"), "<![CDATA[hello]]]]><![CDATA[>world]]>"
|
38
38
|
equal cdata_section("hello]]>world]]>again"), "<![CDATA[hello]]]]><![CDATA[>world]]]]><![CDATA[>again]]>"
|
39
|
+
|
40
|
+
test "concat_class", ->
|
41
|
+
strictEqual concat_class(), ''
|
42
|
+
strictEqual concat_class(null), ''
|
43
|
+
strictEqual concat_class([]), ''
|
44
|
+
equal concat_class('lol', 0), 'lol'
|
45
|
+
equal concat_class(' lol ', false, ' wow '), 'lol wow'
|
46
|
+
equal concat_class('lol', null, 'rofl lol wow ', ' wow '), 'lol rofl wow'
|
47
|
+
equal concat_class([['lol', [null]], 'rofl lol wow '], ' wow '), 'lol rofl wow'
|
48
|
+
|
49
|
+
test "selectorToHtml", ->
|
50
|
+
equal selectorToHtml(''), ''
|
51
|
+
equal selectorToHtml('.lol'), '<div class="lol"></div>'
|
52
|
+
equal selectorToHtml('tr.lol'), '<tr class="lol"></tr>'
|
53
|
+
equal selectorToHtml('tr.lol#rofl'), '<tr class="lol" id="rofl"></tr>'
|
54
|
+
equal selectorToHtml('#rofl.lol'), '<div class="lol" id="rofl"></div>'
|
55
|
+
equal selectorToHtml('.lol.wow'), '<div class="lol wow"></div>'
|
56
|
+
equal selectorToHtml('.wow#rofl.lol'), '<div class="wow lol" id="rofl"></div>'
|
57
|
+
# equal selectorToHtml('h1.one+p.two'), '<h1 class="one"></h1><p class="two"></p>'
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#= require ultimate/jquery-plugin-class
|
2
|
+
|
3
|
+
module "Ultimate.Plugin"
|
4
|
+
|
5
|
+
class EmptyPlugin extends Ultimate.Plugin
|
6
|
+
|
7
|
+
test "EmptyPlugin", ->
|
8
|
+
cout 'EmptyPlugin'
|
9
|
+
$('#qunit-fixture').html '<div class="test-plugin"><div class="test-plugin__inner"></div></div>'
|
10
|
+
plugin = new EmptyPlugin(el: '.test-plugin')
|
11
|
+
|
12
|
+
throws (-> new EmptyPlugin), "plugin can't build without `el` as option"
|
13
|
+
ok /^ultimatePlugin_\d+$/.test(plugin.cid)
|
14
|
+
ok plugin.$el.length is 1
|
15
|
+
jDiv = plugin.$('div')
|
16
|
+
ok jDiv.length is 1
|
17
|
+
ok jDiv.hasClass('test-plugin__inner')
|
18
|
+
strictEqual plugin.locale, 'en'
|
19
|
+
strictEqual plugin.t('smokeString'), 'Smoke string'
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
class TestPlugin extends Ultimate.Plugin
|
24
|
+
someOption: null
|
25
|
+
reflectableOptions: -> ['thirdOption']
|
26
|
+
@defaultLocales =
|
27
|
+
en:
|
28
|
+
someMessage: 'English message.'
|
29
|
+
ru:
|
30
|
+
someMessage: 'Сообщение на русском.'
|
31
|
+
|
32
|
+
|
33
|
+
test "TestPlugin", ->
|
34
|
+
cout 'warn', 'TestPlugin'
|
35
|
+
$('#qunit-fixture').html '<div class="test-plugin"><a class="action one" href="javascript:;">action one</a><div class="test-plugin__inner"></div></div>'
|
36
|
+
plugin = new TestPlugin
|
37
|
+
el: '.test-plugin'
|
38
|
+
someOption: 'bingo!'
|
39
|
+
otherOption: 'ringo!'
|
40
|
+
thirdOption: 'dingo!'
|
41
|
+
locale: 'de'
|
42
|
+
|
43
|
+
equal plugin.someOption, 'bingo!'
|
44
|
+
ok typeof plugin.otherOption is 'undefined'
|
45
|
+
equal plugin.thirdOption, 'dingo!'
|
46
|
+
equal plugin.locale, 'de'
|
47
|
+
deepEqual plugin.translations, {}
|
48
|
+
# equal plugin.t('someMessage'), 'Some message'
|
49
|
+
# plugin._configure locale: 'ru'
|
50
|
+
# deepEqual plugin.translations, {someMessage: 'Сообщение на русском.'}
|
51
|
+
# equal plugin.t('someMessage'), 'Сообщение на русском.'
|
52
|
+
|
53
|
+
#test "TestPlugin locale from I18n", ->
|
54
|
+
# cout 'warn', 'TestPlugin locale from I18n'
|
55
|
+
# window.I18n ||= {}
|
56
|
+
# _storedI18nLocale = I18n.locale
|
57
|
+
# cout '_storeI18nLocale', _storedI18nLocale
|
58
|
+
# I18n.locale = 'de'
|
59
|
+
# plugin = new TestPlugin el: '.test-plugin'
|
60
|
+
# strictEqual plugin.locale, 'en'
|
61
|
+
# equal plugin.t('someMessage'), 'English message.'
|
62
|
+
## I18n.locale = 'ru'
|
63
|
+
## plugin = new TestPlugin el: '.test-plugin'
|
64
|
+
## strictEqual plugin.locale, 'ru'
|
65
|
+
## equal plugin.t('someMessage'), 'Сообщение на русском.'
|
66
|
+
# I18n.locale = _storedI18nLocale
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ultimate-base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &21675360 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.2.8
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 3.2.8
|
24
|
+
version_requirements: *21675360
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: sqlite3
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &21672200 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ! '>='
|
@@ -37,15 +32,10 @@ dependencies:
|
|
37
32
|
version: '0'
|
38
33
|
type: :development
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
35
|
+
version_requirements: *21672200
|
46
36
|
- !ruby/object:Gem::Dependency
|
47
37
|
name: coffee-rails
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirement: &21669100 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
40
|
requirements:
|
51
41
|
- - ~>
|
@@ -53,12 +43,7 @@ dependencies:
|
|
53
43
|
version: 3.2.1
|
54
44
|
type: :development
|
55
45
|
prerelease: false
|
56
|
-
version_requirements:
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 3.2.1
|
46
|
+
version_requirements: *21669100
|
62
47
|
description: Ultimate UI core, base helpers and improves for Ruby on Rails Front-end
|
63
48
|
email:
|
64
49
|
- koderfunk@gmail.com
|
@@ -194,6 +179,7 @@ files:
|
|
194
179
|
- test/javascripts/tests/helpers_test.js.coffee
|
195
180
|
- test/javascripts/tests/improves/i18n-lite_test.js.coffee
|
196
181
|
- test/javascripts/tests/jquery-plugin-adapter_test.js.coffee
|
182
|
+
- test/javascripts/tests/jquery-plugin-class_test.js.coffee
|
197
183
|
- test/javascripts/tests/underscore/underscore.outcasts.test.js.coffee
|
198
184
|
- test/stylesheets/test_helper.css
|
199
185
|
- ultimate-base.gemspec
|
@@ -217,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
217
203
|
version: '0'
|
218
204
|
requirements: []
|
219
205
|
rubyforge_project: ultimate-base
|
220
|
-
rubygems_version: 1.8.
|
206
|
+
rubygems_version: 1.8.10
|
221
207
|
signing_key:
|
222
208
|
specification_version: 3
|
223
209
|
summary: Ultimate UI core, base helpers and improves for Ruby on Rails Front-end
|