lanes 0.1.0 → 0.1.2

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 (257) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -0
  3. data/Gemfile +2 -2
  4. data/client/lanes/components/Base.coffee +12 -11
  5. data/client/lanes/components/enabled.js.erb +1 -1
  6. data/client/lanes/components/grid/Editor.coffee +2 -2
  7. data/client/lanes/components/grid/Grid.coffee +60 -58
  8. data/client/lanes/components/grid/PopOverEditor.coffee +3 -3
  9. data/client/lanes/components/grid/RowEditor.coffee +1 -1
  10. data/client/lanes/components/grid/{grid.scss → _index.scss} +0 -0
  11. data/client/lanes/components/grid/template.html +1 -1
  12. data/client/lanes/components/modal/ModalDialog.coffee +1 -1
  13. data/client/lanes/components/modal/{modal.scss → _index.scss} +1 -1
  14. data/client/lanes/components/modal/index.js +1 -1
  15. data/client/lanes/components/popover/PopOver.coffee +1 -1
  16. data/client/lanes/components/popover/_index.scss +1 -0
  17. data/client/lanes/components/popover/index.js +1 -1
  18. data/client/lanes/components/select_field/{select_field.scss → _index.scss} +0 -0
  19. data/client/lanes/extension/Extensions.coffee +3 -2
  20. data/client/lanes/lib/Templates.coffee +7 -0
  21. data/client/lanes/minimal.js +1 -1
  22. data/client/lanes/minimal.scss.erb +1 -1
  23. data/client/lanes/models/Base.coffee +16 -19
  24. data/client/lanes/models/Bootstrap.coffee +1 -2
  25. data/client/lanes/models/Collection.coffee +37 -25
  26. data/client/lanes/models/Screens.coffee +6 -18
  27. data/client/lanes/models/Sync.coffee +12 -5
  28. data/client/lanes/screens/Base.coffee +1 -2
  29. data/client/lanes/screens/Instance.coffee +2 -5
  30. data/client/lanes/screens/screen-definitions.js.erb +10 -2
  31. data/client/{styles → lanes/styles}/components/all.scss +0 -0
  32. data/client/{styles → lanes/styles}/components/changes-notification.scss +0 -0
  33. data/client/{styles → lanes/styles}/components/record-finder.scss +0 -0
  34. data/client/{styles → lanes/styles}/components/suggest.scss +0 -0
  35. data/client/{styles → lanes/styles}/fonts/icomoon.eot +0 -0
  36. data/client/{styles → lanes/styles}/fonts/icomoon.svg +0 -0
  37. data/client/{styles → lanes/styles}/fonts/icomoon.ttf +0 -0
  38. data/client/{styles → lanes/styles}/fonts/icomoon.woff +0 -0
  39. data/client/{styles → lanes/styles}/fonts/selection.json +0 -0
  40. data/client/{styles → lanes/styles}/fonts/style.scss +0 -0
  41. data/client/{styles → lanes/styles}/fonts.scss +5 -5
  42. data/client/{styles → lanes/styles}/forms.scss +0 -0
  43. data/client/{styles → lanes/styles}/index.css +0 -0
  44. data/client/{styles → lanes/styles}/keybindings.scss +0 -0
  45. data/client/{styles → lanes/styles}/layout.scss +0 -0
  46. data/client/{styles → lanes/styles}/plugins/all.scss +0 -0
  47. data/client/{styles → lanes/styles}/plugins/overlay.scss +0 -0
  48. data/client/{styles → lanes/styles}/plugins/resize-sensor.scss +0 -0
  49. data/client/{styles → lanes/styles}/screens.scss +0 -0
  50. data/client/{styles → lanes/styles}/tabs.scss +0 -0
  51. data/client/{styles → lanes/styles}/vendor/bootstrap/_alerts.scss +0 -0
  52. data/client/{styles → lanes/styles}/vendor/bootstrap/_badges.scss +0 -0
  53. data/client/{styles → lanes/styles}/vendor/bootstrap/_breadcrumbs.scss +0 -0
  54. data/client/{styles → lanes/styles}/vendor/bootstrap/_button-groups.scss +0 -0
  55. data/client/{styles → lanes/styles}/vendor/bootstrap/_buttons.scss +0 -0
  56. data/client/{styles → lanes/styles}/vendor/bootstrap/_carousel.scss +0 -0
  57. data/client/{styles → lanes/styles}/vendor/bootstrap/_close.scss +0 -0
  58. data/client/{styles → lanes/styles}/vendor/bootstrap/_code.scss +0 -0
  59. data/client/{styles → lanes/styles}/vendor/bootstrap/_component-animations.scss +0 -0
  60. data/client/{styles → lanes/styles}/vendor/bootstrap/_dropdowns.scss +0 -0
  61. data/client/{styles → lanes/styles}/vendor/bootstrap/_forms.scss +0 -0
  62. data/client/{styles → lanes/styles}/vendor/bootstrap/_glyphicons.scss +0 -0
  63. data/client/{styles → lanes/styles}/vendor/bootstrap/_grid.scss +0 -0
  64. data/client/{styles → lanes/styles}/vendor/bootstrap/_input-groups.scss +0 -0
  65. data/client/{styles → lanes/styles}/vendor/bootstrap/_jumbotron.scss +0 -0
  66. data/client/{styles → lanes/styles}/vendor/bootstrap/_labels.scss +0 -0
  67. data/client/{styles → lanes/styles}/vendor/bootstrap/_list-group.scss +0 -0
  68. data/client/{styles → lanes/styles}/vendor/bootstrap/_media.scss +0 -0
  69. data/client/{styles → lanes/styles}/vendor/bootstrap/_mixins.scss +0 -0
  70. data/client/{styles → lanes/styles}/vendor/bootstrap/_modals.scss +0 -0
  71. data/client/{styles → lanes/styles}/vendor/bootstrap/_navbar.scss +0 -0
  72. data/client/{styles → lanes/styles}/vendor/bootstrap/_navs.scss +0 -0
  73. data/client/{styles → lanes/styles}/vendor/bootstrap/_normalize.scss +0 -0
  74. data/client/{styles → lanes/styles}/vendor/bootstrap/_pager.scss +0 -0
  75. data/client/{styles → lanes/styles}/vendor/bootstrap/_pagination.scss +0 -0
  76. data/client/{styles → lanes/styles}/vendor/bootstrap/_panels.scss +0 -0
  77. data/client/{styles → lanes/styles}/vendor/bootstrap/_popovers.scss +0 -0
  78. data/client/{styles → lanes/styles}/vendor/bootstrap/_print.scss +0 -0
  79. data/client/{styles → lanes/styles}/vendor/bootstrap/_progress-bars.scss +0 -0
  80. data/client/{styles → lanes/styles}/vendor/bootstrap/_responsive-embed.scss +0 -0
  81. data/client/{styles → lanes/styles}/vendor/bootstrap/_responsive-utilities.scss +0 -0
  82. data/client/{styles → lanes/styles}/vendor/bootstrap/_scaffolding.scss +0 -0
  83. data/client/{styles → lanes/styles}/vendor/bootstrap/_tables.scss +0 -0
  84. data/client/{styles → lanes/styles}/vendor/bootstrap/_theme.scss +0 -0
  85. data/client/{styles → lanes/styles}/vendor/bootstrap/_thumbnails.scss +0 -0
  86. data/client/{styles → lanes/styles}/vendor/bootstrap/_tooltip.scss +0 -0
  87. data/client/{styles → lanes/styles}/vendor/bootstrap/_type.scss +0 -0
  88. data/client/{styles → lanes/styles}/vendor/bootstrap/_utilities.scss +0 -0
  89. data/client/{styles → lanes/styles}/vendor/bootstrap/_variables.scss +0 -0
  90. data/client/{styles → lanes/styles}/vendor/bootstrap/_wells.scss +0 -0
  91. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_alerts.scss +0 -0
  92. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_background-variant.scss +0 -0
  93. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_border-radius.scss +0 -0
  94. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_buttons.scss +0 -0
  95. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_center-block.scss +0 -0
  96. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_clearfix.scss +0 -0
  97. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_forms.scss +0 -0
  98. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_gradients.scss +0 -0
  99. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_grid-framework.scss +0 -0
  100. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_grid.scss +0 -0
  101. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_hide-text.scss +0 -0
  102. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_image.scss +0 -0
  103. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_labels.scss +0 -0
  104. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_list-group.scss +0 -0
  105. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_nav-divider.scss +0 -0
  106. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_nav-vertical-align.scss +0 -0
  107. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_opacity.scss +0 -0
  108. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_pagination.scss +0 -0
  109. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_panels.scss +0 -0
  110. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_progress-bar.scss +0 -0
  111. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_reset-filter.scss +0 -0
  112. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_resize.scss +0 -0
  113. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_responsive-visibility.scss +0 -0
  114. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_size.scss +0 -0
  115. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_tab-focus.scss +0 -0
  116. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_table-row.scss +0 -0
  117. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_text-emphasis.scss +0 -0
  118. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_text-overflow.scss +0 -0
  119. data/client/{styles → lanes/styles}/vendor/bootstrap/mixins/_vendor-prefixes.scss +0 -0
  120. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_alerts.scss +0 -0
  121. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_badges.scss +0 -0
  122. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_breadcrumbs.scss +0 -0
  123. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_button-groups.scss +0 -0
  124. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_buttons.scss +0 -0
  125. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_carousel.scss +0 -0
  126. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_close.scss +0 -0
  127. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_code.scss +0 -0
  128. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_component-animations.scss +0 -0
  129. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_dropdowns.scss +0 -0
  130. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_forms.scss +0 -0
  131. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_glyphicons.scss +0 -0
  132. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_grid.scss +0 -0
  133. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_input-groups.scss +0 -0
  134. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_jumbotron.scss +0 -0
  135. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_labels.scss +0 -0
  136. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_list-group.scss +0 -0
  137. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_media.scss +0 -0
  138. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_mixins.scss +0 -0
  139. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_modals.scss +0 -0
  140. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_navbar.scss +0 -0
  141. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_navs.scss +0 -0
  142. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_normalize.scss +0 -0
  143. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_pager.scss +0 -0
  144. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_pagination.scss +0 -0
  145. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_panels.scss +0 -0
  146. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_popovers.scss +0 -0
  147. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_print.scss +0 -0
  148. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_progress-bars.scss +0 -0
  149. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_responsive-embed.scss +0 -0
  150. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_responsive-utilities.scss +0 -0
  151. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_scaffolding.scss +0 -0
  152. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_tables.scss +0 -0
  153. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_theme.scss +0 -0
  154. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_thumbnails.scss +0 -0
  155. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_tooltip.scss +0 -0
  156. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_type.scss +0 -0
  157. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_utilities.scss +0 -0
  158. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_variables.scss +0 -0
  159. data/client/{styles → lanes/styles}/vendor/bootstrap/old/_wells.scss +0 -0
  160. data/client/{styles → lanes/styles}/vendor/bootstrap/old/bootstrap.scss +0 -0
  161. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_alerts.scss +0 -0
  162. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_background-variant.scss +0 -0
  163. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_border-radius.scss +0 -0
  164. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_buttons.scss +0 -0
  165. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_center-block.scss +0 -0
  166. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_clearfix.scss +0 -0
  167. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_forms.scss +0 -0
  168. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_gradients.scss +0 -0
  169. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_grid-framework.scss +0 -0
  170. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_grid.scss +0 -0
  171. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_hide-text.scss +0 -0
  172. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_image.scss +0 -0
  173. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_labels.scss +0 -0
  174. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_list-group.scss +0 -0
  175. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_nav-divider.scss +0 -0
  176. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_nav-vertical-align.scss +0 -0
  177. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_opacity.scss +0 -0
  178. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_pagination.scss +0 -0
  179. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_panels.scss +0 -0
  180. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_progress-bar.scss +0 -0
  181. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_reset-filter.scss +0 -0
  182. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_resize.scss +0 -0
  183. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_responsive-visibility.scss +0 -0
  184. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_size.scss +0 -0
  185. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_tab-focus.scss +0 -0
  186. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_table-row.scss +0 -0
  187. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_text-emphasis.scss +0 -0
  188. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_text-overflow.scss +0 -0
  189. data/client/{styles → lanes/styles}/vendor/bootstrap/old/mixins/_vendor-prefixes.scss +0 -0
  190. data/client/{styles → lanes/styles}/vendor/bootstrap-custom-grid.scss +0 -0
  191. data/client/{styles → lanes/styles}/vendor/bootstrap-custom-modals.scss +0 -0
  192. data/client/{styles → lanes/styles}/vendor/bootstrap.scss +2 -2
  193. data/client/{styles → lanes/styles}/vendor/dataTables.scss +0 -0
  194. data/client/lanes/views/Base.coffee +34 -49
  195. data/client/lanes/views/FormBindings.coffee +22 -20
  196. data/client/lanes/views/Helpers.coffee +1 -1
  197. data/client/lanes/views/empty-span.html +1 -0
  198. data/client/lanes/workspace/ActiveScreensSwitcher.coffee +8 -1
  199. data/client/lanes/workspace/Layout.coffee +7 -4
  200. data/client/lanes/workspace/Navbar.coffee +6 -2
  201. data/client/lanes/workspace/Pages.coffee +5 -1
  202. data/client/lanes/workspace/ScreensMenu.coffee +14 -2
  203. data/client/lanes/workspace/WorkspaceView.coffee +5 -0
  204. data/client/lanes/workspace/index.js +1 -0
  205. data/client/lanes/workspace.scss.erb +6 -1
  206. data/lanes.gemspec +1 -1
  207. data/lib/lanes/api/controller.rb +5 -7
  208. data/lib/lanes/api/helper_methods.rb +1 -1
  209. data/lib/lanes/api/javascript_processor.rb +3 -2
  210. data/lib/lanes/command/app.rb +8 -4
  211. data/lib/lanes/command/generate_model.rb +13 -11
  212. data/lib/lanes/command/generate_screen.rb +9 -2
  213. data/lib/lanes/command/generate_view.rb +15 -3
  214. data/lib/lanes/command/generate_view.usage +7 -7
  215. data/lib/lanes/command/named_command.rb +2 -2
  216. data/lib/lanes/command/templates/client/index.js +3 -0
  217. data/lib/lanes/command/templates/client/models/BaseModel.coffee +5 -0
  218. data/lib/lanes/command/templates/client/models/Model.coffee +1 -1
  219. data/lib/lanes/command/templates/client/views/BaseView.coffee +5 -0
  220. data/lib/lanes/command/templates/client/views/View.coffee +1 -1
  221. data/lib/lanes/command/templates/config/screen.rb +8 -0
  222. data/lib/lanes/command/templates/lib/namespace/base_model.rb +9 -0
  223. data/lib/lanes/command/templates/lib/namespace/model.rb +1 -1
  224. data/lib/lanes/command/templates/spec/client/models/ModelSpec.coffee +1 -1
  225. data/lib/lanes/command/templates/spec/client/views/ViewSpec.coffee +1 -1
  226. data/lib/lanes/command.rb +1 -2
  227. data/lib/lanes/components.rb +5 -4
  228. data/lib/lanes/concerns/all.rb +0 -5
  229. data/lib/lanes/concerns/attr_accessor_with_default.rb +5 -3
  230. data/lib/lanes/concerns/set_attribute_data.rb +6 -23
  231. data/lib/lanes/configuration.rb +1 -0
  232. data/lib/lanes/extension.rb +19 -10
  233. data/lib/lanes/guard_tasks.rb +1 -1
  234. data/lib/lanes/model.rb +1 -6
  235. data/lib/lanes/{screens.rb → screen.rb} +40 -23
  236. data/lib/lanes/spec_helper.rb +4 -2
  237. data/lib/lanes/version.rb +1 -1
  238. data/lib/lanes.rb +1 -1
  239. data/spec/api/javascript_processor_spec.rb +3 -3
  240. data/spec/command_spec.rb +49 -0
  241. data/spec/concerns/attr_accessor_with_default_spec.rb +7 -0
  242. data/spec/helpers/lanes-helpers.coffee +46 -22
  243. data/spec/helpers/minitest_assertions.rb +23 -0
  244. data/spec/lanes/models/BaseSpec.coffee +57 -56
  245. data/spec/lanes/models/CollectionSpec.coffee +14 -0
  246. data/spec/lanes/models/PubSubSpec.coffee +5 -5
  247. data/spec/lanes/views/BaseSpec.coffee +32 -31
  248. data/spec/lanes/views/FormBindingsSpec.coffee +32 -0
  249. metadata +183 -179
  250. data/client/lanes/components/popover/popover.scss +0 -1
  251. data/lib/lanes/command/templates/lib/namespace/screen.rb +0 -17
  252. data/lib/lanes/concerns/code_identifier.rb +0 -43
  253. data/lib/lanes/concerns/immutable_model.rb +0 -32
  254. data/lib/lanes/concerns/locked_fields.rb +0 -84
  255. data/lib/lanes/concerns/random_hash_code.rb +0 -40
  256. data/lib/lanes/concerns/visible_id_identifier.rb +0 -53
  257. data/spec/concerns/code_identifier_spec.rb +0 -45
@@ -1,17 +1,15 @@
1
- Lanes.namespace 'Testing'
1
+ Lanes.namespace 'Test'
2
2
 
3
- class Lanes.Testing.View extends Lanes.Views.Base
3
+ View = undefined
4
+ Model = undefined
5
+ Collection = undefined
6
+
7
+ class Lanes.Test.DummyView extends Lanes.Views.Base
4
8
  template: "<p>hi</p"
5
9
  events: { "click #mylink": 'onClick' }
6
10
  onClick: Lanes.emptyFn
7
11
 
8
- Lanes.Vendor.MessageBus = {
9
- subscribe: jasmine.createSpy('subscribe')
10
- unsubscribe: jasmine.createSpy('unsubscribe')
11
- start: Lanes.emptyFn
12
- }
13
-
14
- class Lanes.Testing.Model extends Lanes.Models.Base
12
+ class Lanes.Test.DummyModel extends Lanes.Models.Base
15
13
  api_path: "test"
16
14
  props:
17
15
  id: 'number',
@@ -29,23 +27,49 @@ class Lanes.Testing.Model extends Lanes.Models.Base
29
27
  deps: ['something', 'fireDanger', 'active'],
30
28
  fn: -> this.something + this.active;
31
29
 
32
- class Lanes.Testing.Collection extends Lanes.Models.Collection
33
- model: Lanes.Testing.Model
30
+ Lanes.Test.makeModel = (props={}, args={})->
31
+ _.extend(Model.prototype, props)
32
+ Lanes.Models.Base.extend(Model)
33
+ Collection::model = Model
34
+ Lanes.Models.Collection.extend(Collection)
35
+ collection = new Collection
36
+ return collection.add(new Model(args))
37
+
38
+ Lanes.Test.makeView = (props={}, args={})->
39
+ _.extend(View.prototype, props)
40
+ Lanes.Views.Base.extend(View)
41
+ return new View(args)
34
42
 
35
- syncResponse = (method,model,options)->
36
- if options.success && syncReply.success
37
- options.success(model, syncReply, {})
38
- if options.failure && !syncReply.success
39
- options.failure(model, syncReply, {})
40
- _.Promise.resolve(model,options)
43
+ syncResponse = (method, model, options)->
44
+ _.defer ->
45
+ if options.success && syncReply.success
46
+ options.success(syncReply, "success", {})
47
+ if options.failure && !syncReply.success
48
+ options.failure(syncReply, "failure", {})
49
+ _.Promise.resolve(model, options)
41
50
 
42
51
  syncReply = {}
43
52
 
53
+ Lanes.Vendor.MessageBus = {
54
+ subscribe: jasmine.createSpy('subscribe')
55
+ unsubscribe: jasmine.createSpy('unsubscribe')
56
+ start: Lanes.emptyFn
57
+ }
58
+
44
59
  window.syncSucceedWith = (data)->
45
60
  syncReply.success = true
46
61
  syncReply.data = data
47
-
62
+
48
63
  beforeEach ->
64
+ class TestModel
65
+ constructor: -> super
66
+ Model = TestModel
67
+ class TestCollection
68
+ constructor: -> super
69
+ Collection = TestCollection
70
+ class TestView
71
+ constructor: -> super
72
+ View = TestView
49
73
 
50
74
  syncReply = {
51
75
  success: true
@@ -53,10 +77,10 @@ beforeEach ->
53
77
  data: {}
54
78
  }
55
79
 
56
- Lanes.Testing.syncSpy = jasmine.createSpy('sync').and.callFake(syncResponse)
57
- Lanes.Testing.syncSpy.lastOptions = ->
80
+ Lanes.Test.syncSpy = jasmine.createSpy('sync').and.callFake(syncResponse)
81
+ Lanes.Test.syncSpy.lastOptions = ->
58
82
  this.calls.mostRecent().args[2]
59
- Lanes.Models.Base::sync = Lanes.Testing.syncSpy
60
- Lanes.Models.Collection::sync = Lanes.Testing.syncSpy
83
+ Lanes.Models.Base::sync = Lanes.Test.syncSpy
84
+ Lanes.Models.Collection::sync = Lanes.Test.syncSpy
61
85
 
62
86
 
@@ -0,0 +1,23 @@
1
+ require 'minitest/assertions'
2
+
3
+ module Minitest::Assertions
4
+ #
5
+ # Fails unless +expected and +actual have the same items.
6
+ #
7
+ def assert_executes(cmd)
8
+ assert execute_cmd(cmd),
9
+ "Expected #{cmd} exited with status #{$?.exitstatus}"
10
+ end
11
+
12
+ def last_cmd_execution_output
13
+ @cmd_last_output
14
+ end
15
+
16
+ private
17
+
18
+ def execute_cmd(cmd)
19
+ @cmd_last_output = `#{cmd} 2>&1`
20
+ $?.exitstatus == 0
21
+ end
22
+
23
+ end
@@ -1,31 +1,31 @@
1
1
 
2
- describe "Base Model Suite", ->
3
- Model = undefined
4
- Collection = undefined
2
+ describe "Lanes.Models.Base", ->
3
+ # Model = undefined
4
+ # Collection = undefined
5
5
  class Color
6
6
  constructor: -> super
7
7
  props: { id: 'integer', rgb: 'string' }
8
8
  Lanes.Models.Base.extend(Color)
9
9
 
10
- makeModel = (props,args={})->
11
- _.extend(Model.prototype, props)
12
- Lanes.Models.Base.extend(Model)
13
- Collection::model = Model
14
- Lanes.Models.Collection.extend(Collection)
15
- collection = new Collection
16
- return collection.add(new Model(args))
10
+ # makeModel = (props,args={})->
11
+ # _.extend(Model.prototype, props)
12
+ # Lanes.Models.Base.extend(Model)
13
+ # Collection::model = Model
14
+ # Lanes.Models.Collection.extend(Collection)
15
+ # collection = new Collection
16
+ # return collection.add(new Model(args))
17
17
 
18
- beforeEach ->
19
- class TestModel
20
- constructor: -> super
21
- Model = TestModel
22
- class TestCollection
23
- constructor: -> super
24
- Collection = TestCollection
18
+ # beforeEach ->
19
+ # class TestModel
20
+ # constructor: -> super
21
+ # Model = TestModel
22
+ # class TestCollection
23
+ # constructor: -> super
24
+ # Collection = TestCollection
25
25
 
26
26
 
27
27
  it "tracks unsaved attributes", ->
28
- model = makeModel({
28
+ model = Lanes.Test.makeModel({
29
29
  session:
30
30
  foo: 'string'
31
31
  bar: 'integer'
@@ -35,13 +35,13 @@ describe "Base Model Suite", ->
35
35
  expect(model.isDirty()).toBeFalse()
36
36
  model.foo = 'baz' # session prop
37
37
  expect(model.isDirty()).toBeFalse()
38
- expect(model.unsavedModels()).toBeEmptyObject()
38
+ expect(model.unsavedAttributes()).toBeEmptyObject()
39
39
  model.set( saved: 'true' )
40
40
  expect(model.isDirty()).toBeTrue()
41
41
 
42
42
 
43
43
  it "can tell if it has attributes", ->
44
- model = makeModel({
44
+ model = Lanes.Test.makeModel({
45
45
  session:
46
46
  foo: 'string'
47
47
  props:
@@ -53,7 +53,7 @@ describe "Base Model Suite", ->
53
53
 
54
54
  it "provides data for saving", ->
55
55
  # model with other types of data, but should only save "props"
56
- model = makeModel({
56
+ model = Lanes.Test.makeModel({
57
57
  associations:
58
58
  color:{ model: Color }
59
59
  session:
@@ -74,8 +74,8 @@ describe "Base Model Suite", ->
74
74
  a=model.changeMonitor.changedAttributes()
75
75
  expect( model.dataForSave() ).toEqual( id: 10, foo: 'a value', color: { rgb: '99FFFF' } )
76
76
 
77
- it "can be saved", ->
78
- model = makeModel({
77
+ it "can be saved", (done)->
78
+ model = Lanes.Test.makeModel({
79
79
  props:
80
80
  id: 'integer'
81
81
  foo: 'string'
@@ -83,7 +83,7 @@ describe "Base Model Suite", ->
83
83
 
84
84
  }, { foo: 'one, two, three'} )
85
85
  expect(model.isDirty()).toBeTrue()
86
- expect(model.unsavedModels()).toEqual( foo: 'one, two, three' )
86
+ expect(model.unsavedAttributes()).toEqual( foo: 'one, two, three' )
87
87
  model.save()
88
88
  expect(model.sync).toHaveBeenCalledWith('create', model, jasmine.any(Object))
89
89
  model.id=11
@@ -92,56 +92,57 @@ describe "Base Model Suite", ->
92
92
  syncSucceedWith({
93
93
  foo: 'a new foo value'
94
94
  })
95
- model.save()
96
- expect(model.sync).toHaveBeenCalledWith('patch', model, jasmine.any(Object))
97
- expect(model.foo).toEqual('a new foo value')
98
-
99
- it "can be fetched",->
100
- model = makeModel({
95
+ model.save().then ->
96
+ expect(model.sync).toHaveBeenCalledWith('patch', model, jasmine.any(Object))
97
+ expect(model.foo).toEqual('a new foo value')
98
+ done()
99
+
100
+ it "can be fetched", (done)->
101
+ model = Lanes.Test.makeModel({
101
102
  props:
102
103
  { id: 'integer', foo: 'string' }
103
104
  })
104
105
  syncSucceedWith({
105
106
  foo: 'foo value'
106
107
  })
107
- model.fetch()
108
- expect(model.sync).toHaveBeenCalledWith('read', model, jasmine.any(Object))
109
- expect(model.foo).toEqual('foo value')
110
- options = model.sync.lastOptions()
111
- expect(options).toHaveTrue('ignoreUnsaved')
112
- expect(options).toHaveNumberWithinRange('limit',1,1)
108
+ model.fetch().then ->
109
+ expect(model.sync).toHaveBeenCalledWith('read', model, jasmine.any(Object))
110
+ expect(model.foo).toEqual('foo value')
111
+ options = model.sync.lastOptions()
112
+ expect(options).toHaveTrue('ignoreUnsaved')
113
+ expect(options).toHaveNumberWithinRange('limit',1,1)
114
+ done()
113
115
 
114
116
  it "creates a Collection property", ->
115
- model = makeModel({})
117
+ Model = Lanes.Test.DummyModel
116
118
  expect(Model.Collection::model).toEqual(Model)
117
119
 
118
- it "loads using where", ->
119
- model = makeModel({
120
- props:
121
- { id: 'integer', title: 'string' }
122
- })
120
+ it "loads using where", (done)->
121
+ Model = Lanes.Test.DummyModel
123
122
  syncSucceedWith([
124
- { id: 1, title: 'first value' }
123
+ { id: 1, title: 'first value' }
125
124
  { id: 2, title: 'second value' }
126
125
  ])
127
- collection = model.where(title: 'first value')
128
- options = model.sync.lastOptions()
129
- expect(options.query).toEqual({title:'first value'})
130
- expect(collection.length).toEqual(2)
126
+ Model.where(title: 'first value').whenLoaded (collection)->
127
+ options = Model::sync.lastOptions()
128
+ expect(options.query).toEqual({title:'first value'})
129
+ expect(collection.length).toEqual(2)
130
+ done()
131
131
 
132
- it "can be destroyed", ->
133
- model = makeModel({
132
+ it "can be destroyed", (done)->
133
+ model = Lanes.Test.makeModel({
134
134
  props: { id: 'integer' }
135
135
  },{ id: 1 })
136
136
  collection = model.collection
137
137
  expect(collection.length).toEqual(1)
138
- model.destroy()
139
- expect(model.sync)
140
- .toHaveBeenCalledWith('delete', model, jasmine.any(Object))
141
- expect(collection.length).toEqual(0)
138
+ model.destroy().then ->
139
+ expect(model.sync)
140
+ .toHaveBeenCalledWith('delete', model, jasmine.any(Object))
141
+ expect(collection.length).toEqual(0)
142
+ done()
142
143
 
143
144
  it "sets associations", ->
144
- model = makeModel({
145
+ model = Lanes.Test.makeModel({
145
146
  associations:
146
147
  color:{ model: Color }
147
148
  props: { id: 'integer', foo: 'string' }
@@ -149,11 +150,11 @@ describe "Base Model Suite", ->
149
150
  expect(model.color).toBeObject()
150
151
  model.set(color: { rgb: '99FFFF' })
151
152
  expect(model.color.rgb).toEqual('99FFFF')
152
- model.setFromResponse(color:{ rgb: 'FFA500' })
153
+ model.setFromServer(color:{ rgb: 'FFA500' })
153
154
  expect(model.color.rgb).toEqual('FFA500')
154
155
 
155
156
  it "can fetch associations", ->
156
- model = makeModel({
157
+ model = Lanes.Test.makeModel({
157
158
  associations:
158
159
  color:{ model: Color }
159
160
  props: { id: 'integer', foo: 'string' }
@@ -0,0 +1,14 @@
1
+ describe "Lanes.Models.Collection", ->
2
+
3
+
4
+ it "it triggers promise on loading", (done)->
5
+ Model = Lanes.Test.DummyModel
6
+ syncSucceedWith([
7
+ { id: 1, title: 'first value' }
8
+ { id: 2, title: 'second value' }
9
+ ])
10
+ collection = Model.where( name: 'foo' )
11
+ collection.whenLoaded ->
12
+ expect( collection.isLoaded() ).toBeTrue()
13
+ done()
14
+
@@ -1,9 +1,9 @@
1
1
 
2
- describe "PubSub Suite", ->
2
+ describe "Lanes.Model.PubSub", ->
3
3
 
4
4
  it "checks in/out a model when it binds to a view", ->
5
- view = new Lanes.Testing.View
6
- model = new Lanes.Testing.Model(id:1)
5
+ view = new Lanes.Test.DummyView
6
+ model = new Lanes.Test.DummyModel(id:1)
7
7
  spyOn(Lanes.Models.PubSub,'add').and.callThrough()
8
8
  spyOn(Lanes.Models.PubSub,'remove')
9
9
  view.model = model
@@ -14,8 +14,8 @@ describe "PubSub Suite", ->
14
14
  expect(Lanes.Models.PubSub.remove).toHaveBeenCalledWith(model)
15
15
 
16
16
  it "can retrieve a model after checkin", ->
17
- model = new Lanes.Testing.Model(id: 11, name:'bar')
17
+ model = new Lanes.Test.DummyModel(id: 11, name:'bar')
18
18
  Lanes.Models.PubSub.add(model)
19
- checkin = Lanes.Models.PubSub.instanceFor(Lanes.Testing.Model, 11)
19
+ checkin = Lanes.Models.PubSub.instanceFor(Lanes.Test.DummyModel, 11)
20
20
  expect(checkin).toEqual(model)
21
21
 
@@ -1,39 +1,40 @@
1
-
2
-
3
- describe "BaseView Suite", ->
4
- View = undefined
5
- makeView = (props,args={})->
6
- _.extend(View.prototype, props)
7
- Lanes.Views.Base.extend(View)
8
- return new View(args)
9
-
10
- beforeEach ->
11
- class TestView
12
- constructor: -> super
13
- View = TestView
1
+ describe "Lanes.Views.Base", ->
14
2
 
15
3
  it "fires el change on render", ->
16
4
  spy = jasmine.createSpy()
17
- view = makeView({
5
+ view = Lanes.Test.makeView({
18
6
  template: "<p>hi</p"
19
7
  })
20
8
  view.on("change:el", spy)
21
9
  view.render()
22
10
  expect(spy).toHaveBeenCalled()
23
11
 
12
+ it "renders a template file", ->
13
+ spy = jasmine.createSpy('view-test').and.callFake ->
14
+ "<p>a test</p>"
15
+ Lanes.Templates['view-test'] = spy
16
+
17
+ view = Lanes.Test.makeView({
18
+ templatePrefix: ''
19
+ templateName: "view-test"
20
+ }, { model: new Lanes.Test.DummyModel({name: 'foo'}) } )
21
+ view.render()
22
+ expect(spy).toHaveBeenCalledWith( model: { name: 'foo' }, collection: undefined )
23
+ expect(view.el.innerHTML).toEqual("a test")
24
+
24
25
  it "renders a template string", ->
25
- view = makeView({
26
- template: "<p>hi</p"
26
+ view = Lanes.Test.makeView({
27
+ template: "<p>hello test</p"
27
28
  })
28
- expect(view.template).toEqual "<p>hi</p"
29
+ expect(view.template).toEqual "<p>hello test</p"
29
30
  view.render()
30
31
  expect(view.el.tagName).toEqual("P")
31
- expect(view.el.innerHTML).toEqual("hi")
32
+ expect(view.el.innerHTML).toEqual("hello test")
32
33
 
33
34
  it "listens to events", ->
34
35
  spy = jasmine.createSpy('onClick')
35
36
  el = _.el( 'div',{id: 'testdiv'} )
36
- view = makeView({
37
+ view = Lanes.Test.makeView({
37
38
  events: { "click #mylink": 'onClick' }
38
39
  template: "<div>text,text,text<a id='mylink'>click me</a>mor text</div>"
39
40
  onClick: spy
@@ -44,8 +45,8 @@ describe "BaseView Suite", ->
44
45
  expect(spy).toHaveBeenCalledWith(jasmine.any(Object),22)
45
46
 
46
47
  it "updates from bindings", ->
47
- model = new Lanes.Testing.Model({ name: "Bob" })
48
- view = makeView({
48
+ model = new Lanes.Test.DummyModel({ name: "Bob" })
49
+ view = Lanes.Test.makeView({
49
50
  bindings: {
50
51
  "model.name": { hook: 'link' }
51
52
  "model.url": { type:'attribute', name: 'href', hook: 'link' }
@@ -65,8 +66,8 @@ describe "BaseView Suite", ->
65
66
  constructor: -> super
66
67
  session: { answer: 'string' }
67
68
  Lanes.Views.Base.extend(LowerView)
68
- model = new Lanes.Testing.Model
69
- view = makeView({
69
+ model = new Lanes.Test.DummyModel
70
+ view = Lanes.Test.makeView({
70
71
  subviews:
71
72
  lower:
72
73
  hook: 'lower'
@@ -88,8 +89,8 @@ describe "BaseView Suite", ->
88
89
  constructor: -> super
89
90
  bindings: { "model.name": { type: "text" } }
90
91
  Lanes.Views.Base.extend(LowerView)
91
- collection = new Lanes.Testing.Collection
92
- view = makeView({
92
+ collection = new Lanes.Test.DummyModel.Collection
93
+ view = Lanes.Test.makeView({
93
94
  subviews:
94
95
  lower:
95
96
  hook: 'lower'
@@ -105,7 +106,7 @@ describe "BaseView Suite", ->
105
106
 
106
107
  it "caches elements in ui", ->
107
108
  spy = jasmine.createSpy('onClick')
108
- view = makeView({
109
+ view = Lanes.Test.makeView({
109
110
  ui:
110
111
  link: '#linky'
111
112
  events:
@@ -121,8 +122,8 @@ describe "BaseView Suite", ->
121
122
  it "invokes model events", ->
122
123
  nameSpy = jasmine.createSpy()
123
124
  urlSpy = jasmine.createSpy()
124
- model = new Lanes.Testing.Model
125
- view = makeView({
125
+ model = new Lanes.Test.DummyModel
126
+ view = Lanes.Test.makeView({
126
127
  modelEvents:
127
128
  'change:name': nameSpy
128
129
  'change:url' : 'onURLChange'
@@ -135,12 +136,12 @@ describe "BaseView Suite", ->
135
136
 
136
137
  it "invokes collection events", ->
137
138
  eventSpy = jasmine.createSpy('event')
138
- view = makeView({
139
+ view = Lanes.Test.makeView({
139
140
  collectionEvents:
140
141
  all: 'onEvent'
141
142
  onEvent: eventSpy
142
- initialize: -> this.collection = new Lanes.Testing.Collection
143
+ initialize: -> this.collection = new Lanes.Test.DummyModel.Collection
143
144
  })
144
145
  expect(eventSpy).not.toHaveBeenCalled()
145
- view.collection.add(new Lanes.Testing.Model)
146
+ view.collection.add(new Lanes.Test.DummyModel)
146
147
  expect(eventSpy).toHaveBeenCalled()
@@ -0,0 +1,32 @@
1
+ describe "Lanes.Views.FormBindings", ->
2
+
3
+ it "updates inputs", ->
4
+ model = new Lanes.Test.DummyModel({name: 'start'})
5
+ view = Lanes.Test.makeView({
6
+ template: '<div><h1>foo</h1><input type="text" name="name"></div>'
7
+ }, { formBindings: true, model: model })
8
+ view.render()
9
+ input = view.$('input')
10
+ expect(input.val()).toEqual('start')
11
+ input.val('test')
12
+ input.trigger('change')
13
+ expect(model.name).toEqual('test')
14
+
15
+ it "updates radio fields", ->
16
+ model = new Lanes.Test.DummyModel({name: 'start'})
17
+ view = Lanes.Test.makeView({
18
+ template: """
19
+ <div>
20
+ <input id="a" type="radio" name="name" value="one">One
21
+ <input id="b" type="radio" name="name" value="two">Two
22
+ <input id="c" type="radio" name="name" value="three">Three
23
+ </div>
24
+ """
25
+ }, { formBindings: true, model: model })
26
+ view.render()
27
+ .$("#b")
28
+ .attr('checked', true)
29
+ .trigger('change')
30
+ expect(model.name).toEqual('two')
31
+ model.name="three"
32
+ expect(view.$("input:checked").attr("id")).toEqual('c')