flipper-ui 0.2.0.beta2 → 0.2.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +12 -11
  3. data/README.md +5 -7
  4. data/examples/basic.ru +27 -26
  5. data/flipper-ui.gemspec +5 -3
  6. data/lib/flipper-ui.rb +1 -0
  7. data/lib/flipper/ui.rb +11 -2
  8. data/lib/flipper/ui/action.rb +45 -4
  9. data/lib/flipper/ui/actions/actors_gate.rb +48 -0
  10. data/lib/flipper/ui/actions/add_feature.rb +20 -0
  11. data/lib/flipper/ui/actions/boolean_gate.rb +26 -0
  12. data/lib/flipper/ui/actions/feature.rb +32 -0
  13. data/lib/flipper/ui/actions/features.rb +23 -3
  14. data/lib/flipper/ui/actions/file.rb +1 -1
  15. data/lib/flipper/ui/actions/gate.rb +11 -117
  16. data/lib/flipper/ui/actions/groups_gate.rb +43 -0
  17. data/lib/flipper/ui/actions/{index.rb → home.rb} +3 -3
  18. data/lib/flipper/ui/actions/percentage_of_actors_gate.rb +27 -0
  19. data/lib/flipper/ui/actions/percentage_of_time_gate.rb +27 -0
  20. data/lib/flipper/ui/actor.rb +13 -0
  21. data/lib/flipper/ui/assets/javascripts/application.coffee +0 -305
  22. data/lib/flipper/ui/assets/stylesheets/_bootstrap-compass.scss +9 -0
  23. data/lib/flipper/ui/assets/stylesheets/_bootstrap-mincer.scss +19 -0
  24. data/lib/flipper/ui/assets/stylesheets/_bootstrap-sprockets.scss +9 -0
  25. data/lib/flipper/ui/assets/stylesheets/_bootstrap.scss +50 -0
  26. data/lib/flipper/ui/assets/stylesheets/application.scss +33 -216
  27. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alerts.scss +73 -0
  28. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badges.scss +68 -0
  29. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
  30. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-groups.scss +243 -0
  31. data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +160 -0
  32. data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +269 -0
  33. data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +36 -0
  34. data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +69 -0
  35. data/lib/flipper/ui/assets/stylesheets/bootstrap/_component-animations.scss +37 -0
  36. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdowns.scss +214 -0
  37. data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +578 -0
  38. data/lib/flipper/ui/assets/stylesheets/bootstrap/_glyphicons.scss +305 -0
  39. data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +84 -0
  40. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
  41. data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +50 -0
  42. data/lib/flipper/ui/assets/stylesheets/bootstrap/_labels.scss +66 -0
  43. data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +124 -0
  44. data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +61 -0
  45. data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +39 -0
  46. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modals.scss +150 -0
  47. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +662 -0
  48. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navs.scss +242 -0
  49. data/lib/flipper/ui/assets/stylesheets/bootstrap/_normalize.scss +427 -0
  50. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pager.scss +54 -0
  51. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +88 -0
  52. data/lib/flipper/ui/assets/stylesheets/bootstrap/_panels.scss +265 -0
  53. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popovers.scss +135 -0
  54. data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +107 -0
  55. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress-bars.scss +87 -0
  56. data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-embed.scss +35 -0
  57. data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-utilities.scss +177 -0
  58. data/lib/flipper/ui/assets/stylesheets/bootstrap/_scaffolding.scss +162 -0
  59. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +234 -0
  60. data/lib/flipper/ui/assets/stylesheets/bootstrap/_theme.scss +273 -0
  61. data/lib/flipper/ui/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
  62. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +102 -0
  63. data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +298 -0
  64. data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +55 -0
  65. data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +866 -0
  66. data/lib/flipper/ui/assets/stylesheets/bootstrap/_wells.scss +29 -0
  67. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
  68. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
  69. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  70. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +52 -0
  71. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  72. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  73. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +88 -0
  74. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
  75. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  76. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  77. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  78. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
  79. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  80. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
  81. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  82. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  83. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
  84. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
  85. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
  86. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
  87. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  88. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  89. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
  90. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  91. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  92. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  93. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
  94. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  95. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +222 -0
  96. data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +446 -0
  97. data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +106 -0
  98. data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +36 -0
  99. data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +40 -0
  100. data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +96 -0
  101. data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +404 -0
  102. data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +10 -0
  103. data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +68 -0
  104. data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +20 -0
  105. data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +756 -0
  106. data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +69 -0
  107. data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +113 -0
  108. data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +53 -0
  109. data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +425 -0
  110. data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +32 -0
  111. data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +65 -0
  112. data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +255 -0
  113. data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +27 -0
  114. data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +92 -0
  115. data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +73 -0
  116. data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +34 -0
  117. data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +39 -0
  118. data/lib/flipper/ui/decorators/feature.rb +37 -4
  119. data/lib/flipper/ui/middleware.rb +12 -3
  120. data/lib/flipper/ui/public/css/application.css +2563 -144
  121. data/lib/flipper/ui/public/css/primer.css +1 -0
  122. data/lib/flipper/ui/public/css/primer/primer.css +1933 -0
  123. data/lib/flipper/ui/public/css/scss/primer.css +1933 -0
  124. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  125. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
  126. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  127. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  128. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  129. data/lib/flipper/ui/public/js/application.js +0 -539
  130. data/lib/flipper/ui/public/js/bootstrap-sprockets.js +12 -0
  131. data/lib/flipper/ui/public/js/bootstrap.js +2317 -0
  132. data/lib/flipper/ui/public/js/bootstrap.min.js +7 -0
  133. data/lib/flipper/ui/public/js/bootstrap/affix.js +162 -0
  134. data/lib/flipper/ui/public/js/bootstrap/alert.js +94 -0
  135. data/lib/flipper/ui/public/js/bootstrap/button.js +116 -0
  136. data/lib/flipper/ui/public/js/bootstrap/carousel.js +237 -0
  137. data/lib/flipper/ui/public/js/bootstrap/collapse.js +211 -0
  138. data/lib/flipper/ui/public/js/bootstrap/dropdown.js +161 -0
  139. data/lib/flipper/ui/public/js/bootstrap/modal.js +339 -0
  140. data/lib/flipper/ui/public/js/bootstrap/popover.js +108 -0
  141. data/lib/flipper/ui/public/js/bootstrap/scrollspy.js +172 -0
  142. data/lib/flipper/ui/public/js/bootstrap/tab.js +153 -0
  143. data/lib/flipper/ui/public/js/bootstrap/tooltip.js +476 -0
  144. data/lib/flipper/ui/public/js/bootstrap/transition.js +59 -0
  145. data/lib/flipper/ui/public/octicons/LICENSE.txt +9 -0
  146. data/lib/flipper/ui/public/octicons/README.md +1 -0
  147. data/lib/flipper/ui/public/octicons/octicons-local.ttf +0 -0
  148. data/lib/flipper/ui/public/octicons/octicons.css +236 -0
  149. data/lib/flipper/ui/public/octicons/octicons.eot +0 -0
  150. data/lib/flipper/ui/public/octicons/octicons.less +235 -0
  151. data/lib/flipper/ui/public/octicons/octicons.svg +200 -0
  152. data/lib/flipper/ui/public/octicons/octicons.ttf +0 -0
  153. data/lib/flipper/ui/public/octicons/octicons.woff +0 -0
  154. data/lib/flipper/ui/public/octicons/sprockets-octicons.scss +232 -0
  155. data/lib/flipper/ui/util.rb +4 -0
  156. data/lib/flipper/ui/version.rb +1 -1
  157. data/lib/flipper/ui/views/add_actor.erb +22 -0
  158. data/lib/flipper/ui/views/add_feature.erb +18 -0
  159. data/lib/flipper/ui/views/add_group.erb +31 -0
  160. data/lib/flipper/ui/views/feature.erb +209 -0
  161. data/lib/flipper/ui/views/features.erb +46 -0
  162. data/lib/flipper/ui/views/layout.erb +31 -149
  163. data/script/release +15 -0
  164. data/spec/flipper/ui/actions/actors_gate_spec.rb +68 -0
  165. data/spec/flipper/ui/actions/add_feature_spec.rb +17 -0
  166. data/spec/flipper/ui/actions/boolean_gate_spec.rb +41 -0
  167. data/spec/flipper/ui/actions/feature_spec.rb +59 -0
  168. data/spec/flipper/ui/actions/features_spec.rb +37 -0
  169. data/spec/flipper/ui/actions/file_spec.rb +43 -0
  170. data/spec/flipper/ui/actions/gate_spec.rb +24 -0
  171. data/spec/flipper/ui/actions/groups_gate_spec.rb +80 -0
  172. data/spec/flipper/ui/actions/home_spec.rb +16 -0
  173. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +40 -0
  174. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +39 -0
  175. data/spec/flipper/ui/decorators/feature_spec.rb +38 -1
  176. data/spec/flipper/ui/decorators/gate_spec.rb +1 -1
  177. data/spec/flipper/ui_spec.rb +18 -441
  178. data/spec/helper.rb +22 -7
  179. metadata +199 -52
  180. data/examples/flipper.html +0 -14
  181. data/examples/flipper.png +0 -0
  182. data/lib/flipper/ui/assets/javascripts/spine/ajax.coffee +0 -223
  183. data/lib/flipper/ui/assets/javascripts/spine/list.coffee +0 -43
  184. data/lib/flipper/ui/assets/javascripts/spine/local.coffee +0 -16
  185. data/lib/flipper/ui/assets/javascripts/spine/manager.coffee +0 -83
  186. data/lib/flipper/ui/assets/javascripts/spine/relation.coffee +0 -148
  187. data/lib/flipper/ui/assets/javascripts/spine/route.coffee +0 -146
  188. data/lib/flipper/ui/assets/javascripts/spine/spine.coffee +0 -542
  189. data/lib/flipper/ui/assets/javascripts/spine/version +0 -1
  190. data/lib/flipper/ui/public/css/images/animated-overlay.gif +0 -0
  191. data/lib/flipper/ui/public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  192. data/lib/flipper/ui/public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  193. data/lib/flipper/ui/public/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
  194. data/lib/flipper/ui/public/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  195. data/lib/flipper/ui/public/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  196. data/lib/flipper/ui/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  197. data/lib/flipper/ui/public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  198. data/lib/flipper/ui/public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  199. data/lib/flipper/ui/public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  200. data/lib/flipper/ui/public/css/images/ui-icons_222222_256x240.png +0 -0
  201. data/lib/flipper/ui/public/css/images/ui-icons_228ef1_256x240.png +0 -0
  202. data/lib/flipper/ui/public/css/images/ui-icons_ef8c08_256x240.png +0 -0
  203. data/lib/flipper/ui/public/css/images/ui-icons_ffd27a_256x240.png +0 -0
  204. data/lib/flipper/ui/public/css/images/ui-icons_ffffff_256x240.png +0 -0
  205. data/lib/flipper/ui/public/css/jquery-ui-1.10.3.slider.min.css +0 -5
  206. data/lib/flipper/ui/public/js/handlebars.js +0 -1992
  207. data/lib/flipper/ui/public/js/jquery-ui-1.10.3.slider.min.js +0 -6
  208. data/lib/flipper/ui/public/js/jquery.js +0 -9555
  209. data/lib/flipper/ui/public/js/jquery.min.js +0 -4
  210. data/lib/flipper/ui/public/js/jquery.min.map +0 -1
  211. data/lib/flipper/ui/public/js/spine/ajax.js +0 -320
  212. data/lib/flipper/ui/public/js/spine/list.js +0 -72
  213. data/lib/flipper/ui/public/js/spine/local.js +0 -29
  214. data/lib/flipper/ui/public/js/spine/manager.js +0 -157
  215. data/lib/flipper/ui/public/js/spine/relation.js +0 -260
  216. data/lib/flipper/ui/public/js/spine/route.js +0 -223
  217. data/lib/flipper/ui/public/js/spine/spine.js +0 -927
  218. data/lib/flipper/ui/views/index.erb +0 -9
@@ -1,260 +0,0 @@
1
- (function() {
2
- var Collection, Instance, Singleton, Spine, isArray, require, singularize, underscore,
3
- __hasProp = {}.hasOwnProperty,
4
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
5
-
6
- Spine = this.Spine || require('spine');
7
-
8
- isArray = Spine.isArray;
9
-
10
- require = this.require || (function(value) {
11
- return eval(value);
12
- });
13
-
14
- Collection = (function(_super) {
15
-
16
- __extends(Collection, _super);
17
-
18
- function Collection(options) {
19
- var key, value;
20
- if (options == null) {
21
- options = {};
22
- }
23
- for (key in options) {
24
- value = options[key];
25
- this[key] = value;
26
- }
27
- }
28
-
29
- Collection.prototype.all = function() {
30
- var _this = this;
31
- return this.model.select(function(rec) {
32
- return _this.associated(rec);
33
- });
34
- };
35
-
36
- Collection.prototype.first = function() {
37
- return this.all()[0];
38
- };
39
-
40
- Collection.prototype.last = function() {
41
- var values;
42
- values = this.all();
43
- return values[values.length - 1];
44
- };
45
-
46
- Collection.prototype.find = function(id) {
47
- var records,
48
- _this = this;
49
- records = this.select(function(rec) {
50
- return ("" + rec.id) === ("" + id);
51
- });
52
- if (!records[0]) {
53
- throw new Error("\"" + this.model.className + "\" model could not find a record for the ID \"" + id + "\"");
54
- }
55
- return records[0];
56
- };
57
-
58
- Collection.prototype.findAllByAttribute = function(name, value) {
59
- var _this = this;
60
- return this.model.select(function(rec) {
61
- return _this.associated(rec) && rec[name] === value;
62
- });
63
- };
64
-
65
- Collection.prototype.findByAttribute = function(name, value) {
66
- return this.findAllByAttribute(name, value)[0];
67
- };
68
-
69
- Collection.prototype.select = function(cb) {
70
- var _this = this;
71
- return this.model.select(function(rec) {
72
- return _this.associated(rec) && cb(rec);
73
- });
74
- };
75
-
76
- Collection.prototype.refresh = function(values) {
77
- var record, records, _i, _j, _len, _len1, _ref;
78
- _ref = this.all();
79
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
80
- record = _ref[_i];
81
- delete this.model.records[record.id];
82
- }
83
- records = this.model.fromJSON(values);
84
- if (!isArray(records)) {
85
- records = [records];
86
- }
87
- for (_j = 0, _len1 = records.length; _j < _len1; _j++) {
88
- record = records[_j];
89
- record.newRecord = false;
90
- record[this.fkey] = this.record.id;
91
- this.model.records[record.id] = record;
92
- }
93
- return this.model.trigger('refresh', this.model.cloneArray(records));
94
- };
95
-
96
- Collection.prototype.create = function(record) {
97
- record[this.fkey] = this.record.id;
98
- return this.model.create(record);
99
- };
100
-
101
- Collection.prototype.associated = function(record) {
102
- return record[this.fkey] === this.record.id;
103
- };
104
-
105
- return Collection;
106
-
107
- })(Spine.Module);
108
-
109
- Instance = (function(_super) {
110
-
111
- __extends(Instance, _super);
112
-
113
- function Instance(options) {
114
- var key, value;
115
- if (options == null) {
116
- options = {};
117
- }
118
- for (key in options) {
119
- value = options[key];
120
- this[key] = value;
121
- }
122
- }
123
-
124
- Instance.prototype.exists = function() {
125
- return this.record[this.fkey] && this.model.exists(this.record[this.fkey]);
126
- };
127
-
128
- Instance.prototype.update = function(value) {
129
- if (!(value instanceof this.model)) {
130
- value = new this.model(value);
131
- }
132
- if (value.isNew()) {
133
- value.save();
134
- }
135
- return this.record[this.fkey] = value && value.id;
136
- };
137
-
138
- return Instance;
139
-
140
- })(Spine.Module);
141
-
142
- Singleton = (function(_super) {
143
-
144
- __extends(Singleton, _super);
145
-
146
- function Singleton(options) {
147
- var key, value;
148
- if (options == null) {
149
- options = {};
150
- }
151
- for (key in options) {
152
- value = options[key];
153
- this[key] = value;
154
- }
155
- }
156
-
157
- Singleton.prototype.find = function() {
158
- return this.record.id && this.model.findByAttribute(this.fkey, this.record.id);
159
- };
160
-
161
- Singleton.prototype.update = function(value) {
162
- if (!(value instanceof this.model)) {
163
- value = this.model.fromJSON(value);
164
- }
165
- value[this.fkey] = this.record.id;
166
- return value.save();
167
- };
168
-
169
- return Singleton;
170
-
171
- })(Spine.Module);
172
-
173
- singularize = function(str) {
174
- return str.replace(/s$/, '');
175
- };
176
-
177
- underscore = function(str) {
178
- return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\d])([A-Z])/g, '$1_$2').replace(/-/g, '_').toLowerCase();
179
- };
180
-
181
- Spine.Model.extend({
182
- hasMany: function(name, model, fkey) {
183
- var association;
184
- if (fkey == null) {
185
- fkey = "" + (underscore(this.className)) + "_id";
186
- }
187
- association = function(record) {
188
- if (typeof model === 'string') {
189
- model = require(model);
190
- }
191
- return new Collection({
192
- name: name,
193
- model: model,
194
- record: record,
195
- fkey: fkey
196
- });
197
- };
198
- return this.prototype[name] = function(value) {
199
- if (value != null) {
200
- association(this).refresh(value);
201
- }
202
- return association(this);
203
- };
204
- },
205
- belongsTo: function(name, model, fkey) {
206
- var association;
207
- if (fkey == null) {
208
- fkey = "" + (singularize(name)) + "_id";
209
- }
210
- association = function(record) {
211
- if (typeof model === 'string') {
212
- model = require(model);
213
- }
214
- return new Instance({
215
- name: name,
216
- model: model,
217
- record: record,
218
- fkey: fkey
219
- });
220
- };
221
- this.prototype[name] = function(value) {
222
- if (value != null) {
223
- association(this).update(value);
224
- }
225
- return association(this).exists();
226
- };
227
- return this.attributes.push(fkey);
228
- },
229
- hasOne: function(name, model, fkey) {
230
- var association;
231
- if (fkey == null) {
232
- fkey = "" + (underscore(this.className)) + "_id";
233
- }
234
- association = function(record) {
235
- if (typeof model === 'string') {
236
- model = require(model);
237
- }
238
- return new Singleton({
239
- name: name,
240
- model: model,
241
- record: record,
242
- fkey: fkey
243
- });
244
- };
245
- return this.prototype[name] = function(value) {
246
- if (value != null) {
247
- association(this).update(value);
248
- }
249
- return association(this).find();
250
- };
251
- }
252
- });
253
-
254
- Spine.Collection = Collection;
255
-
256
- Spine.Singleton = Singleton;
257
-
258
- Spine.Instance = Instance;
259
-
260
- }).call(this);
@@ -1,223 +0,0 @@
1
- (function() {
2
- var $, Spine, escapeRegExp, hashStrip, namedParam, splatParam,
3
- __hasProp = {}.hasOwnProperty,
4
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
5
- __slice = [].slice;
6
-
7
- Spine = this.Spine || require('spine');
8
-
9
- $ = Spine.$;
10
-
11
- hashStrip = /^#*/;
12
-
13
- namedParam = /:([\w\d]+)/g;
14
-
15
- splatParam = /\*([\w\d]+)/g;
16
-
17
- escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g;
18
-
19
- Spine.Route = (function(_super) {
20
- var _ref;
21
-
22
- __extends(Route, _super);
23
-
24
- Route.extend(Spine.Events);
25
-
26
- Route.historySupport = ((_ref = window.history) != null ? _ref.pushState : void 0) != null;
27
-
28
- Route.routes = [];
29
-
30
- Route.options = {
31
- trigger: true,
32
- history: false,
33
- shim: false
34
- };
35
-
36
- Route.add = function(path, callback) {
37
- var key, value, _results;
38
- if (typeof path === 'object' && !(path instanceof RegExp)) {
39
- _results = [];
40
- for (key in path) {
41
- value = path[key];
42
- _results.push(this.add(key, value));
43
- }
44
- return _results;
45
- } else {
46
- return this.routes.push(new this(path, callback));
47
- }
48
- };
49
-
50
- Route.setup = function(options) {
51
- if (options == null) {
52
- options = {};
53
- }
54
- this.options = $.extend({}, this.options, options);
55
- if (this.options.history) {
56
- this.history = this.historySupport && this.options.history;
57
- }
58
- if (this.options.shim) {
59
- return;
60
- }
61
- if (this.history) {
62
- $(window).bind('popstate', this.change);
63
- } else {
64
- $(window).bind('hashchange', this.change);
65
- }
66
- return this.change();
67
- };
68
-
69
- Route.unbind = function() {
70
- if (this.options.shim) {
71
- return;
72
- }
73
- if (this.history) {
74
- return $(window).unbind('popstate', this.change);
75
- } else {
76
- return $(window).unbind('hashchange', this.change);
77
- }
78
- };
79
-
80
- Route.navigate = function() {
81
- var args, lastArg, options, path;
82
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
83
- options = {};
84
- lastArg = args[args.length - 1];
85
- if (typeof lastArg === 'object') {
86
- options = args.pop();
87
- } else if (typeof lastArg === 'boolean') {
88
- options.trigger = args.pop();
89
- }
90
- options = $.extend({}, this.options, options);
91
- path = args.join('/');
92
- if (this.path === path) {
93
- return;
94
- }
95
- this.path = path;
96
- this.trigger('navigate', this.path);
97
- if (options.trigger) {
98
- this.matchRoute(this.path, options);
99
- }
100
- if (options.shim) {
101
- return;
102
- }
103
- if (this.history) {
104
- return history.pushState({}, document.title, this.path);
105
- } else {
106
- return window.location.hash = this.path;
107
- }
108
- };
109
-
110
- Route.getPath = function() {
111
- var path;
112
- path = window.location.pathname;
113
- if (path.substr(0, 1) !== '/') {
114
- path = '/' + path;
115
- }
116
- return path;
117
- };
118
-
119
- Route.getHash = function() {
120
- return window.location.hash;
121
- };
122
-
123
- Route.getFragment = function() {
124
- return this.getHash().replace(hashStrip, '');
125
- };
126
-
127
- Route.getHost = function() {
128
- return (document.location + '').replace(this.getPath() + this.getHash(), '');
129
- };
130
-
131
- Route.change = function() {
132
- var path;
133
- path = this.history ? this.getPath() : this.getFragment();
134
- if (path === this.path) {
135
- return;
136
- }
137
- this.path = path;
138
- return this.matchRoute(this.path);
139
- };
140
-
141
- Route.matchRoute = function(path, options) {
142
- var route, _i, _len, _ref1;
143
- _ref1 = this.routes;
144
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
145
- route = _ref1[_i];
146
- if (!(route.match(path, options))) {
147
- continue;
148
- }
149
- this.trigger('change', route, path);
150
- return route;
151
- }
152
- };
153
-
154
- function Route(path, callback) {
155
- var match;
156
- this.path = path;
157
- this.callback = callback;
158
- this.names = [];
159
- if (typeof path === 'string') {
160
- namedParam.lastIndex = 0;
161
- while ((match = namedParam.exec(path)) !== null) {
162
- this.names.push(match[1]);
163
- }
164
- splatParam.lastIndex = 0;
165
- while ((match = splatParam.exec(path)) !== null) {
166
- this.names.push(match[1]);
167
- }
168
- path = path.replace(escapeRegExp, '\\$&').replace(namedParam, '([^\/]*)').replace(splatParam, '(.*?)');
169
- this.route = new RegExp("^" + path + "$");
170
- } else {
171
- this.route = path;
172
- }
173
- }
174
-
175
- Route.prototype.match = function(path, options) {
176
- var i, match, param, params, _i, _len;
177
- if (options == null) {
178
- options = {};
179
- }
180
- match = this.route.exec(path);
181
- if (!match) {
182
- return false;
183
- }
184
- options.match = match;
185
- params = match.slice(1);
186
- if (this.names.length) {
187
- for (i = _i = 0, _len = params.length; _i < _len; i = ++_i) {
188
- param = params[i];
189
- options[this.names[i]] = param;
190
- }
191
- }
192
- return this.callback.call(null, options) !== false;
193
- };
194
-
195
- return Route;
196
-
197
- })(Spine.Module);
198
-
199
- Spine.Route.change = Spine.Route.proxy(Spine.Route.change);
200
-
201
- Spine.Controller.include({
202
- route: function(path, callback) {
203
- return Spine.Route.add(path, this.proxy(callback));
204
- },
205
- routes: function(routes) {
206
- var key, value, _results;
207
- _results = [];
208
- for (key in routes) {
209
- value = routes[key];
210
- _results.push(this.route(key, value));
211
- }
212
- return _results;
213
- },
214
- navigate: function() {
215
- return Spine.Route.navigate.apply(Spine.Route, arguments);
216
- }
217
- });
218
-
219
- if (typeof module !== "undefined" && module !== null) {
220
- module.exports = Spine.Route;
221
- }
222
-
223
- }).call(this);