ultimate-base 0.2.4 → 0.3.0.alpha

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.
Files changed (106) hide show
  1. data/.gitignore +4 -1
  2. data/.rvmrc +0 -1
  3. data/.rvmrc.example +0 -1
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +113 -1
  6. data/app/assets/javascripts/ultimate/backbone/base.js.coffee +14 -2
  7. data/app/assets/javascripts/ultimate/backbone/extra/jquery-plugin-adapter.js.coffee +1 -1
  8. data/app/assets/javascripts/ultimate/backbone/model.js.coffee +6 -0
  9. data/app/assets/javascripts/ultimate/backbone/view.js.coffee +5 -4
  10. data/app/assets/javascripts/ultimate/backbone/views/slider.js.coffee +4 -1
  11. data/app/assets/javascripts/ultimate/helpers/asset_tag.js.coffee +71 -54
  12. data/app/assets/javascripts/ultimate/helpers/base.js.coffee +3 -0
  13. data/app/assets/javascripts/ultimate/helpers/decor.js.coffee +19 -14
  14. data/app/assets/javascripts/ultimate/helpers/number.js.coffee +600 -0
  15. data/app/assets/javascripts/ultimate/helpers/record_tag.js.coffee +66 -0
  16. data/app/assets/javascripts/ultimate/helpers/tag.js.coffee +77 -0
  17. data/app/assets/javascripts/ultimate/helpers/url.js.coffee +49 -0
  18. data/app/assets/javascripts/ultimate/helpers.js.coffee +39 -66
  19. data/app/assets/javascripts/ultimate/{devise.js.coffee → improves/devise.js.coffee} +0 -0
  20. data/app/assets/javascripts/ultimate/improves/i18n-lite.js.coffee +18 -12
  21. data/app/assets/javascripts/ultimate/improves/magic-radios.js.coffee +2 -0
  22. data/app/assets/javascripts/ultimate/improves/typed-fields.js.coffee +13 -14
  23. data/app/assets/javascripts/ultimate/{base.js.coffee → jquery.base.js.coffee} +24 -37
  24. data/app/assets/javascripts/ultimate/{experimental/_inflections → underscore}/underscore.inflection.js +19 -18
  25. data/app/assets/javascripts/ultimate/underscore/underscore.outcasts.js.coffee +123 -0
  26. data/app/assets/javascripts/ultimate/underscore/underscore.string.js +16 -6
  27. data/config/routes.rb +2 -0
  28. data/lib/{ultimate-base → ultimate/base}/engine.rb +1 -0
  29. data/lib/{ultimate-base → ultimate/base}/version.rb +1 -1
  30. data/lib/ultimate/base.rb +10 -0
  31. data/lib/{ultimate-base → ultimate}/extensions/directive_processor.rb +0 -0
  32. data/lib/{ultimate-base → ultimate}/extensions/sass_script_functions.rb +0 -0
  33. data/scripts/rails +8 -0
  34. data/test/dummy/Rakefile +7 -0
  35. data/test/dummy/_emfile +18 -0
  36. data/{app/assets/javascripts/ultimate/helpers/forms.js.coffee → test/dummy/app/assets/images/.gitkeep} +0 -0
  37. data/test/dummy/app/assets/javascripts/application.js +3 -0
  38. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  39. data/test/dummy/app/assets/stylesheets/global/forms.css.scss +65 -0
  40. data/test/dummy/app/assets/stylesheets/global/layout/footer.scss +18 -0
  41. data/test/dummy/app/assets/stylesheets/global/layout/header.scss +13 -0
  42. data/test/dummy/app/assets/stylesheets/global/layout/main-menu.scss +68 -0
  43. data/test/dummy/app/assets/stylesheets/global/layout.css.scss +46 -0
  44. data/test/dummy/app/assets/stylesheets/global/reserved.css.scss +79 -0
  45. data/test/dummy/app/assets/stylesheets/global/reset.css.scss +85 -0
  46. data/test/dummy/app/assets/stylesheets/global/structures.css.scss +9 -0
  47. data/test/dummy/app/assets/stylesheets/import/base.scss +34 -0
  48. data/test/dummy/app/assets/stylesheets/plugins/qunit.css.scss +3 -0
  49. data/test/dummy/app/controllers/application_controller.rb +4 -0
  50. data/test/dummy/app/controllers/main_controller.rb +8 -0
  51. data/test/dummy/app/helpers/application_helper.rb +2 -0
  52. data/test/dummy/app/mailers/.gitkeep +0 -0
  53. data/test/dummy/app/models/.gitkeep +0 -0
  54. data/test/dummy/app/views/application/_footer.html.haml +3 -0
  55. data/test/dummy/app/views/application/_header.html.haml +4 -0
  56. data/test/dummy/app/views/application/_main_menu.html.haml +11 -0
  57. data/test/dummy/app/views/layouts/application.html.haml +24 -0
  58. data/test/dummy/app/views/main/index.html.haml +13 -0
  59. data/test/dummy/app/views/main/qunit.html.haml +7 -0
  60. data/test/dummy/config/application.rb +59 -0
  61. data/test/dummy/config/boot.rb +10 -0
  62. data/test/dummy/config/database.yml +25 -0
  63. data/test/dummy/config/environment.rb +5 -0
  64. data/test/dummy/config/environments/development.rb +40 -0
  65. data/test/dummy/config/environments/production.rb +67 -0
  66. data/test/dummy/config/environments/test.rb +37 -0
  67. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  68. data/test/dummy/config/initializers/inflections.rb +15 -0
  69. data/test/dummy/config/initializers/mime_types.rb +5 -0
  70. data/test/dummy/config/initializers/qunit-rails.rb +1 -0
  71. data/test/dummy/config/initializers/secret_token.rb +7 -0
  72. data/test/dummy/config/initializers/session_store.rb +8 -0
  73. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  74. data/test/dummy/config/locales/en.yml +5 -0
  75. data/test/dummy/config/routes.rb +63 -0
  76. data/test/dummy/config.ru +4 -0
  77. data/test/dummy/log/.gitkeep +0 -0
  78. data/test/dummy/public/404.html +26 -0
  79. data/test/dummy/public/422.html +26 -0
  80. data/test/dummy/public/500.html +25 -0
  81. data/test/dummy/public/favicon.ico +0 -0
  82. data/test/dummy/script/rails +6 -0
  83. data/test/javascripts/all_tests.js.coffee +13 -0
  84. data/test/javascripts/test_helper.js.coffee +3 -0
  85. data/test/javascripts/tests/base_test.js.coffee +42 -0
  86. data/test/javascripts/tests/helpers/asset_tag_test.js.coffee +51 -0
  87. data/test/javascripts/tests/helpers/number_test.js.coffee +250 -0
  88. data/test/javascripts/tests/helpers/record_tag_test.js.coffee +56 -0
  89. data/test/javascripts/tests/helpers/tag_test.js.coffee +33 -0
  90. data/test/javascripts/tests/helpers/url_test.js.coffee +28 -0
  91. data/test/javascripts/tests/helpers_test.js.coffee +47 -0
  92. data/test/javascripts/tests/improves/i18n-lite_test.js.coffee +25 -0
  93. data/test/javascripts/tests/underscore/underscore.outcasts.test.js.coffee +38 -0
  94. data/test/stylesheets/test_helper.css +4 -0
  95. data/ultimate-base.gemspec +4 -4
  96. metadata +116 -24
  97. data/app/assets/javascripts/ultimate/bus.js.coffee +0 -57
  98. data/app/assets/javascripts/ultimate/experimental/_inflections/dzone.inflections.js +0 -154
  99. data/app/assets/javascripts/ultimate/helpers/array.js.coffee +0 -63
  100. data/app/assets/javascripts/ultimate/helpers/tags.js.coffee +0 -73
  101. data/app/assets/javascripts/ultimate/widgets/dock.js.coffee +0 -70
  102. data/app/assets/javascripts/ultimate/widgets/gear.js.coffee +0 -84
  103. data/app/assets/javascripts/ultimate/widgets/jquery-ext.js.coffee +0 -104
  104. data/app/assets/javascripts/ultimate/widgets/jquery.adapter.js.coffee +0 -62
  105. data/app/assets/javascripts/ultimate/widgets/widget.js.coffee +0 -115
  106. data/lib/ultimate-base.rb +0 -10
@@ -1,84 +0,0 @@
1
- # Ultimate base object
2
- # * base OOP improves
3
- # * instances controls
4
- # * options and settings controls
5
- # * translations
6
-
7
- console.log 'Ultimate.Proto.Gear', Ultimate if console?
8
-
9
- class Ultimate.Proto.Gear
10
-
11
- @className: 'Gear'
12
-
13
- # commented because must be uniq for independent widgets
14
- #@instances: []
15
- @maxInstances: Infinity # 0 for intrfaces, 1 for singleton
16
-
17
- @canCreateInstance = ->
18
- cout 'info', 'Gear.canCreateInstance', @name, @instances, @maxInstances
19
- (@instances or []).length < @maxInstances
20
-
21
- @pushInstance = (instance) ->
22
- @instances ||= []
23
- @instances.push instance
24
-
25
-
26
-
27
- @defaults:
28
- constants: {}
29
- locales:
30
- 'en':
31
- description: 'Base Ultimate js Class'
32
- 'ru':
33
- description: 'Базовай Ultimate js-класс'
34
- options:
35
- locale: 'en'
36
- translations: {}
37
-
38
- settings: {}
39
-
40
- uniqId: null
41
-
42
- debugMode: false
43
-
44
- constructor: (options = {}) ->
45
- @uniqId = _.uniqueId @constructor.className
46
- @constructor.pushInstance @
47
- @updateSettings @constructor.defaults.options
48
- @updateSettings @initTranslations(options)
49
- @debug "#{@constructor.className}.constructor()", @uniqId, options
50
-
51
- # use I18n, and modify locale and translations in options
52
- # modify and return merged data
53
- initTranslations: (options) ->
54
- # if global compatible I18n
55
- if I18n? and I18n.locale and I18n.t
56
- options['locale'] ?= I18n.locale
57
- if options['locale'] is I18n.locale
58
- # pointing to defaults locales of language specified in I18n
59
- _defaultLocales = @constructor.defaults.locales[I18n.locale]
60
- unless _defaultLocales['loaded']
61
- _defaultLocales['loaded'] = true
62
- # try read localized strings
63
- if _localesFromI18n = I18n.t options['i18nKey'] or _.underscored(@constructor.className)
64
- # fill it from I18n
65
- _defaultLocales[_.camelize key] = value for key, value of _localesFromI18n
66
- options
67
-
68
- getSettings: ->
69
- @settings
70
-
71
- setSettings: (settings) ->
72
- @settings = settings
73
-
74
- updateSettings: (options) ->
75
- cout 'updateSettings', options
76
- for optionsKey, optionsValue of options when optionsKey in @ then @[optionsKey] = optionsValue
77
- translations = if (l = options['locale']) then @constructor.defaults.locales[l] or {} else {}
78
- $.extend true, @settings, translations: translations, options
79
-
80
- debug: ->
81
- if @settings.debugMode
82
- a = ["DEBUG | #{@constructor.className} >>> "]
83
- Array::push.apply a, arguments
84
- cout.apply @, a
@@ -1,104 +0,0 @@
1
- ###
2
- For begin Ultimate actions use:
3
- $ ->
4
- Ultimate.initialize()
5
- cout '>>> go $(\'body\').bindWidgets Ultimate.Widgets'
6
- cout '>>> binded', $('body').bindWidgets Ultimate.Widgets
7
- ###
8
-
9
- do ($ = jQuery) ->
10
-
11
-
12
- # TODO arguments
13
- $.fn.getWidgets = (widgetClass = null, inheritance = false, domDeep = false) ->
14
- if not @length
15
- return []
16
- else if @length is 1
17
- widgets = @data('widgets') or []
18
- else
19
- # TODO check work and perf tests
20
- widgets = _.flatten($(o).data('widgets') or [] for o in @, true)
21
- #2: @map -> $(@).data('widgets') or []
22
- #3: _.flatten ( @map -> $(@).data('widgets') or [] ), true
23
- if widgetClass?
24
- _.filter widgets, if inheritance then (w) -> w instanceof widgetClass else (w) -> w.costructor is widgetClass
25
- else
26
- widgets
27
-
28
- $.fn.getWidget = (widgetClass, inheritance = false) ->
29
- if _.isString widgetClass
30
- for o in @
31
- widgets = $(o).data('widgets') or []
32
- for w in widgets
33
- return w if w.constructor.className is widgetClass
34
- else if Ultimate.isWidgetClass widgetClass
35
- for o in @
36
- widgets = $(o).data('widgets') or []
37
- if inheritance
38
- for w in widgets
39
- return w if w instanceof widgetClass
40
- else
41
- for w in widgets
42
- return w if w.constructor is widgetClass
43
- false
44
-
45
- $.fn.hasWidget = (widgetClass) ->
46
- if _.isString widgetClass
47
- for o in @
48
- return true if _.any $(o).data('widgets') or [], (w) -> w.constructor.className is widgetClass
49
- else if Ultimate.isWidgetClass widgetClass
50
- for o in @
51
- return true if _.any $(o).data('widgets') or [], (w) -> w.constructor is widgetClass
52
- false
53
-
54
- $.fn.bindOneWidget = (widgetClass, options = {}) ->
55
- Ultimate.gcWidgets()
56
- bindedWidget = null
57
- if widgetClass.canCreateInstance()
58
- if @length
59
- selector = "#{widgetClass.selector}:not(.prevent-binding)"
60
- jContainer = if @is(selector) then @filter(selector) else @find(selector)
61
- if (l = jContainer.length)
62
- if l is 1
63
- bindedWidget = Ultimate.createWidget widgetClass, jContainer, options
64
- else
65
- warning "$.fn.bindOneWidget() found #{l} elements by #{selector}, when need only 1"
66
- else
67
- warning "$.fn.bindOneWidget() not found elements by #{selector}"
68
- else
69
- warning "$.fn.bindOneWidget() call from empty jQuery()"
70
- else
71
- warning "Widget #{widgetClass.className} can't create call from empty jQuery()"
72
- bindedWidget
73
-
74
- $.fn.bindWidget = (widgetClass, options = {}) ->
75
- Ultimate.gcWidgets()
76
- bindedWidgets = []
77
- if @length
78
- ( if @is(widgetClass.selector) then @ else @find(widgetClass.selector) ).filter(':not(.prevent-binding)').each ->
79
- if widgetClass.canCreateInstance()
80
- jContainer = $ @
81
- if widget = Ultimate.createWidget widgetClass, jContainer, options
82
- bindedWidgets.push widget
83
- else
84
- false
85
- bindedWidgets
86
-
87
- $.fn.bindWidgets = (widgetClasses = Ultimate.LazyWidgets, options = {}) ->
88
- cout 'info', 'bindWidgets begin'
89
- bindedWidgets = []
90
- if @length
91
- bindedWidgets = for widgetName, widgetClass of widgetClasses when widgetClass.canCreateInstance()
92
- widgetClass.constructor.className ||= widgetName
93
- @bindWidget widgetClass, options
94
- _.flatten bindedWidgets, true
95
-
96
-
97
-
98
- # TODO filtering by widgetClass
99
- # TODO enother algorithm with enother projection
100
- $.fn.closestWidgets = (widgetClass = null) ->
101
- widgets = []
102
- jTry = @
103
- jTry = jTry.parent() while jTry.length and not (widgets = jTry.getWidgets()).length
104
- widgets
@@ -1,62 +0,0 @@
1
- # jQueryPluginAdapter
2
-
3
- do ($ = jQuery) ->
4
- $.fn.pluginAdapter = (widgetClass, pluginName, pluginArgs) ->
5
- a = args pluginArgs
6
- argsLength = a.length
7
- # Shall return the Widget, if have arguments and last argument of the call is a Boolean true.
8
- _returnWidget =
9
- if argsLength and _.isBoolean a[argsLength - 1]
10
- argsLength--
11
- a.pop()
12
- else
13
- false
14
- unless @length
15
- return if _returnWidget then undefined else @
16
- # get the first TODO analize, maybe each?
17
- jContainer = @first()
18
- # try to get the Widget-object, controlling everything that happens in our magical container
19
- widget = jContainer.getWidget(widgetClass)
20
- if widget and widget.jContainer[0] is jContainer[0]
21
- command = null
22
- if argsLength and _.isString a[0]
23
- command = a.shift()
24
- else
25
- return widget if _returnWidget
26
- return jContainer unless argsLength
27
- command = 'updateSettings'
28
- if _.isFunction widget[command]
29
- return widget[command].apply widget, a
30
- else
31
- $.error "Command [#{command}] does not exist on jQuery.#{pluginName}()"
32
- else
33
- options = if argsLength then a[0] else {}
34
- if $.isPlainObject options
35
- widget = Ultimate.createWidget widgetClass, jContainer, options
36
- else
37
- $.error "First argument of jQuery.#{pluginName}() must be plain object"
38
- if _returnWidget then widget else jContainer
39
-
40
-
41
- # TODO rewrite docs
42
- ###
43
- * Invoke Ultimate Flash functionality for the first element in the set of matched elements.
44
- * If last argument {Boolean} true, then returns {Widget}.
45
- * @usage
46
- *** standart actions ***
47
- * construction .ultimateFlash([Object options = {}]) ~ {jQuery} jContainer
48
- * show .ultimateFlash('show', String type, String text) ~ {jQuery} jFlash | {Boolean} false
49
- * notice .ultimateFlash('notice', String text) ~ {jQuery} jFlash | {Boolean} false
50
- * alert .ultimateFlash('alert', String text) ~ {jQuery} jFlash | {Boolean} false
51
- *** extended actions ***
52
- * getSettings .ultimateFlash('getSettings') ~ {Object} settings
53
- * setSettings .ultimateFlash('setSettings', {Object} settings) ~ {jQuery} jContainer
54
- * updateSettings .ultimateFlash({Object} options) ~ {Object} settings
55
- * auto .ultimateFlash('auto', {ArrayOrObject} obj) ~ {Array} ajFlashes | {Boolean} false
56
- * ajaxSuccess .ultimateFlash('ajaxSuccess'[, Arguments successArgs = []])
57
- * ajaxError .ultimateFlash('ajaxError'[, String text = settings.translations.defaultErrorText][, Arguments errorArgs = []])
58
- ###
59
-
60
- Ultimate.createPlugin = (widgetClass, pluginName = widgetClass.className) ->
61
- cout "Ultimate.createPlugin", pluginName
62
- jQuery.fn[pluginName] = -> @pluginAdapter widgetClass, pluginName, arguments
@@ -1,115 +0,0 @@
1
- # require:
2
- # jquery ~> 1.7.0
3
- # underscore ~> 1.3.0
4
-
5
- # TODO inheritance:
6
- # ? class Classes.Proto.Observer see jU-widget
7
-
8
- console.log 'Ultimate.Proto.Widget', Ultimate if console?
9
-
10
- class Ultimate.Proto.Widget extends Ultimate.Proto.Gear
11
-
12
- @className: 'Widget' # set during bindWidgets()
13
-
14
- @defaults:
15
- locales:
16
- 'en':
17
- description: 'Proto Widget'
18
- 'ru':
19
- description: 'Прото Виджет'
20
-
21
- # TODO move to @defaults.options :
22
- @loadingWidthMethodName: 'innerWidth'
23
- @loadingHeightMethodName: 'innerHeight'
24
- loadingState: false
25
-
26
- eventsMatcher = /^(\S+)\s*(.*)$/ # /^\s*([\w\.:]+)(\s+(.+?))?\s*$/
27
- @events: {}
28
- eventsNamespace: null
29
-
30
- @nodes:
31
- jNoInfo: '.no-info'
32
-
33
- jContainer: null
34
-
35
- constructor: (@jContainer, options = {}) ->
36
- data = @jContainer.data()
37
- if data
38
- widgets = _delete data, 'widgets'
39
- options = $.extend true, {}, data, options
40
- super options
41
- if widgets
42
- widgets.push @
43
- else
44
- @jContainer.data 'widgets', [@]
45
- @eventsNamespace = ".widget-#{@uniqId}"
46
- @bindEvents()
47
- @findNodes()
48
-
49
- isGarbage: -> not (@jContainer and @jContainer.parent().length)
50
-
51
- unbindEvents: ->
52
- @jContainer.off @eventsNamespace
53
-
54
- bindEvents: (events = @constructor.events) ->
55
- # TODO check IE key with unwordchars ('ajax:error'), and Array.forEach() functionality
56
- @unbindEvents()
57
- _.each events, (method, eventRoute) =>
58
- if _.isString method
59
- if _.isFunction @[method]
60
- method = @[method]
61
- else
62
- $.error "Method \"#{method}\" does not exist in #{@constructor.className}.bindEvents()"
63
- if _.isFunction method
64
- matchedEventRoute = eventRoute.match eventsMatcher
65
- if matchedEventRoute
66
- matchedEventRoute.shift()
67
- [eventName, selector] = matchedEventRoute
68
- eventName = "#{eventName}#{@eventsNamespace}"
69
- method = _.bind method, @
70
- if selector
71
- @jContainer.on eventName, selector, method
72
- else
73
- @jContainer.on eventName, method
74
- # http://37signals.com/svn/posts/3137-using-event-capturing-to-improve-basecamp-page-load-times
75
- else
76
- $.error "Bad event route \"#{eventRoute}\" in #{@constructor.className}.bindEvents()"
77
- else
78
- $.error "No method for route \"#{eventRoute}\" in #{@constructor.className}.bindEvents()"
79
-
80
- findNodes: (jRoot = @jContainer, nodes = @constructor.nodes) ->
81
- jNodes = {}
82
- for nodeName, selector of nodes
83
- _isObject = _.isObject selector
84
- if _isObject
85
- nestedNodes = selector
86
- selector = _delete nestedNodes, 'selector'
87
- jNodes[nodeName] = @[nodeName] = jRoot.find(selector)
88
- if _isObject
89
- _.extend jNodes, @findNodes(jNodes[nodeName], nestedNodes)
90
- jNodes
91
-
92
- replaceContainer: (jNewContainer, sideCall = false) ->
93
- unless sideCall
94
- widgets = @jContainer.data 'widgets'
95
- jNewContainer.data 'widgets', widgets
96
- @jContainer.replaceWith jNewContainer
97
- for widget in widgets when widget isnt @
98
- widget.replaceContainer jNewContainer, true
99
- @jContainer = jNewContainer
100
- @unbindEvents()
101
- @bindEvents()
102
-
103
- # overloadable
104
- getJLoadingContainer: -> @jContainer
105
-
106
- loading: (state, text = '') ->
107
- jLoadingContainer = @getJLoadingContainer()
108
- if jLoadingContainer and jLoadingContainer.length
109
- jLoadingContainer.children('.loading-overlay').remove()
110
- if @loadingState = state
111
- width = jLoadingContainer[@constructor.loadingWidthMethodName]()
112
- height = jLoadingContainer[@constructor.loadingHeightMethodName]()
113
- text = "<span class=\"text\">#{text}</span>" if text
114
- style = "width: #{width}px; height: #{height}px; line-height: #{height}px;"
115
- jLoadingContainer.append "<div class=\"loading-overlay\" style=\"#{style}\"><span class=\"circle\"></span>#{text}</div>"
data/lib/ultimate-base.rb DELETED
@@ -1,10 +0,0 @@
1
- require "ultimate-base/version"
2
- require "ultimate-base/extensions/directive_processor"
3
- require "ultimate-base/engine"
4
- require "ultimate-base/extensions/sass_script_functions"
5
-
6
- module Ultimate
7
- module Base
8
-
9
- end
10
- end