emerald-rails 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -1,6 +1,8 @@
1
- # Emerald::Rails
1
+ # emerald-rails gem
2
2
 
3
- TODO: Write a gem description
3
+ This gem integrates
4
+ [Emerald.js](https://github.com/kurko/emerald.js)
5
+ with your Rails application automagically.
4
6
 
5
7
  ## Installation
6
8
 
@@ -12,13 +14,15 @@ And then execute:
12
14
 
13
15
  $ bundle
14
16
 
15
- Or install it yourself as:
17
+ Then add this line to your Javascript manifest file (`application.js`)
18
+ before your own scripts:
16
19
 
17
- $ gem install emerald-rails
20
+ //= require emerald
18
21
 
19
22
  ## Usage
20
23
 
21
- TODO: Write usage instructions here
24
+ For instructions on how to use Emerald.js, visit its page,
25
+ [https://github.com/kurko/emerald.js](https://github.com/kurko/emerald.js).
22
26
 
23
27
  ## Contributing
24
28
 
@@ -27,3 +31,7 @@ TODO: Write usage instructions here
27
31
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
32
  4. Push to the branch (`git push origin my-new-feature`)
29
33
  5. Create new Pull Request
34
+
35
+ ##License
36
+
37
+ This software is released under the MIT License.
data/Rakefile CHANGED
@@ -4,6 +4,10 @@ desc "Downloads the latest stable Javascript file"
4
4
  task :stable do
5
5
  stable_url = "https://raw.github.com/kurko/emerald.js/master/build/stable.js"
6
6
  assets_dir = "app/assets/javascript"
7
- cmd = "( cd #{assets_dir} > /dev/null ; curl -O #{stable_url} ; )"
7
+
8
+ cmd = "cd #{assets_dir}"
9
+ cmd << " && curl -O #{stable_url}"
10
+ cmd << " && mv stable.js emerald.js"
11
+ cmd << " && cp emerald.js ../../../lib/generators/emerald/install/templates/emerald.js"
8
12
  exec cmd
9
13
  end
File without changes
@@ -5,7 +5,7 @@ require 'emerald-rails/version'
5
5
 
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "emerald-rails"
8
- gem.version = Emerald::Rails::VERSION
8
+ gem.version = EmeraldRails::VERSION
9
9
  gem.authors = ["Alexandre de Oliveira"]
10
10
  gem.email = ["chavedomundo@gmail.com"]
11
11
  gem.description = %q{Brings Emerald.js into your Rails app automagically}
@@ -1,5 +1,3 @@
1
- module Emerald
2
- module Rails
3
- VERSION = "0.0.2"
4
- end
1
+ module EmeraldRails
2
+ VERSION = "0.0.3"
5
3
  end
data/lib/emerald-rails.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  require "emerald-rails/version"
2
2
 
3
- module Emerald
4
- module Rails
5
- class Engine < ::Rails::Engine
6
- end
3
+ module EmeraldRails
4
+ class Engine < ::Rails::Engine
7
5
  end
8
6
  end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Copies emerald.js to app/assets/javascripts/ directory. Recommended for
3
+ whom is going to edit or debug the code file.
4
+
5
+ Example:
6
+ rails generate emerald:install
7
+
8
+ This will create:
9
+ app/assets/javascripts/emerald.js
@@ -0,0 +1,11 @@
1
+ module Emerald
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ def copy_emerald
7
+ copy_file "emerald.js", "app/assets/javascripts/emerald.js"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,308 @@
1
+ var Emerald = {
2
+ Version: "0.0.1",
3
+ Core: {},
4
+ Controller: {},
5
+ ActionView: {
6
+ Elements: {},
7
+ Events: {}
8
+ },
9
+ Model: {}
10
+ };
11
+
12
+ Emerald.ActionView.extend = function(actions){
13
+ // instance object to be returned
14
+ var instance = new Object;
15
+ var _this = this;
16
+ _this.actions = actions;
17
+
18
+ if (_this.actions.initialize) {
19
+ $(document).ready(function(){
20
+ _this.actions.initialize();
21
+ });
22
+ }
23
+
24
+ // initializes this View's elements
25
+ $(document).ready(function() {
26
+ Emerald.ActionView.Elements.bindToView();
27
+ Emerald.ActionView.Events.bindElementToViewAction(_this.actions);
28
+ });
29
+
30
+ // defines the method of the new view instance
31
+ for (action in actions) {
32
+ instance[action] = actions[action];
33
+ }
34
+
35
+ return instance;
36
+ }
37
+
38
+ Emerald.ActionView.Elements.bindToView = function() {
39
+ $("[data-view-action]").each(function(index, viewElement){
40
+ var elementsView = $(this).closest("[data-view]").data("view");
41
+ viewElement.setAttribute('extendsView', elementsView);
42
+ });
43
+ }
44
+
45
+ Emerald.ActionView.Elements.dataFieldsSelector = function(){
46
+ var selector = "";
47
+ selector+= "input[type='text'], ";
48
+ selector+= "input[type='radio']:checked";
49
+ return selector;
50
+ }
51
+
52
+ Emerald.ActionView.Elements.dataFields = function(){
53
+ var selectors = this.dataFieldsSelector();
54
+ return $(selectors);
55
+ }
56
+
57
+ Emerald.ActionView.Events.bindElementToViewAction = function(viewActions) {
58
+ $('[data-view-action]').each(function(index, viewElement){
59
+ var _event = viewElement.getAttribute('data-event');
60
+ var _viewAction = viewElement.getAttribute('data-view-action');
61
+
62
+ _event = Emerald.ActionView.Events.defineDefaultEvent(viewElement, _event);
63
+
64
+ var dataFieldSelector = "";
65
+ dataFieldSelector+= "input[type='text'][data-view-action='"+_viewAction+"'], ";
66
+ dataFieldSelector+= "input[type='radio'][data-view-action='"+_viewAction+"']:checked";
67
+
68
+ $(this).on(_event, function(e){
69
+ var dataFields = $(dataFieldSelector);
70
+ viewActions[_viewAction](e, dataFields);
71
+ });
72
+ });
73
+ }
74
+
75
+ Emerald.ActionView.Events.defineDefaultEvent = function(domElement, _event) {
76
+ if (_event)
77
+ return _event;
78
+ else
79
+ return 'keyup';
80
+ }
81
+
82
+ Emerald.Controller.extend = function(actions){
83
+ var instance = new Object;
84
+ var _this = this;
85
+ _this.actions = actions;
86
+
87
+ // defines the method of the new controller instance
88
+ for (action in actions) {
89
+ instance[action] = actions[action];
90
+ }
91
+
92
+ instance.params = function(domElements){
93
+ var params = new Object;
94
+
95
+ for (i = 0; i < domElements.length; i++) {
96
+ var element = domElements[i];
97
+ params[element.name] = element.value;
98
+ }
99
+
100
+ return params;
101
+ }
102
+
103
+ instance.persistView = true;
104
+
105
+ instance.persistViewCallback = function(JSON, observerObject) {
106
+ if (!observerObject)
107
+ observerObject = Emerald.Model.Observer;
108
+
109
+ if (this.persistView)
110
+ observerObject.update(JSON);
111
+
112
+ return true;
113
+ }
114
+
115
+ return instance;
116
+ }
117
+
118
+ Emerald.Model.extend = function(properties) {
119
+ var instance = new Object;
120
+ var _this = this;
121
+ this.properties = properties;
122
+
123
+ // defines the method of the new view instance
124
+ for (property in properties) {
125
+ instance[property] = properties[property];
126
+ }
127
+
128
+ // runs initialization on startup
129
+ if (this.properties.initialize) {
130
+ $(document).ready(function(){ _this.properties.initialize(); });
131
+ }
132
+
133
+ // defines attrAccessible fields
134
+ Emerald.Model.Attributes.initAttrAccessible(instance, properties.attrAccessible);
135
+
136
+ instance.get = function(attribute) {
137
+ if (_this.properties[attribute])
138
+ return _this.properties[attribute];
139
+ else
140
+ return null;
141
+ }
142
+
143
+ instance.save = function(data, andCallbackController, persistenceObject) {
144
+ if (!persistenceObject)
145
+ persistenceObject = Emerald.Persistence;
146
+
147
+ // TODO verify that `data` fields are the ones listed in this.attrAccessible
148
+ return new persistenceObject(this).save(data, andCallbackController);
149
+ }
150
+
151
+ return instance;
152
+ }
153
+
154
+ Emerald.Model.Attributes = {}
155
+ Emerald.Model.Attributes.initAttrAccessible = function(model, attrAccessible) {
156
+ model.attributes = function() { return false; }
157
+ if (!attrAccessible)
158
+ return false;
159
+
160
+ var attributes = attrAccessible;
161
+ for (attribute in attributes) {
162
+ var attributeName = attributes[attribute];
163
+
164
+ // model method
165
+ if (!model[attributeName])
166
+ model[attributeName] = "";
167
+
168
+ // attributes hash
169
+ model.attributes = function(attributeName) {
170
+ var attributes = Emerald.Model.Attributes.getAttributes(model);
171
+
172
+ if (attributeName)
173
+ return attributes[attributeName];
174
+ else
175
+ return attributes;
176
+ }
177
+ }
178
+
179
+ return true;
180
+ }
181
+
182
+ Emerald.Model.Attributes.getAttributes = function(model) {
183
+ var attributesValues = {}
184
+ if (!model.attrAccessible)
185
+ return attributesValues;
186
+
187
+ var attributes = model.attrAccessible;
188
+ for (attribute in attributes) {
189
+ var attributeName = attributes[attribute];
190
+
191
+ // model method
192
+ attributesValues[attributeName] = model[attributeName];
193
+ }
194
+ return attributesValues;
195
+ }
196
+
197
+ // Observes the whole document for [data-observe] elements. Whenever an Ajax
198
+ // call is made, the JSON response should be passed in to
199
+ //
200
+ // observer.update(response)
201
+ //
202
+ // It will update all the elements in the document with the JSON data.
203
+ //
204
+ // Example:
205
+ //
206
+ // JSON: {"item":{"name":"My item", "price":"US$40,00"}}
207
+ //
208
+ // Document:
209
+ //
210
+ // <span data-observe="item.name"></span>
211
+ // <span data-observe="item.price"></span>
212
+ //
213
+ // The first HTML element will be updated with "My item" automatically and
214
+ // the second, price, with "US$40,00".
215
+ //
216
+ Emerald.Model.Observer = {
217
+ update: function(jsonData){
218
+ $("[data-observe]").each(function(index){
219
+ var observing = $(this).data("observe");
220
+ var observedResources = observing.split(".");
221
+
222
+ var currentValue = jsonData;
223
+ $.each(observedResources, function(index, value){
224
+ if (currentValue[value] || typeof currentValue[value] == "string")
225
+ currentValue = currentValue[value];
226
+ else
227
+ return false;
228
+ });
229
+
230
+ switch (typeof currentValue) {
231
+ case "number":
232
+ case "bool":
233
+ case "string":
234
+ $(this).html(currentValue);
235
+ return true;
236
+ }
237
+
238
+ });
239
+
240
+ return true;
241
+ }
242
+ }
243
+
244
+ Emerald.Persistence = function(model, persistenceObject) {
245
+ var instance = new Object;
246
+
247
+ if (!persistenceObject)
248
+ persistenceObject = Emerald.Persistence;
249
+
250
+ instance.save = function(model, callbackController){
251
+ return persistenceObject.save(model, callbackController);
252
+ }
253
+
254
+ return instance;
255
+ }
256
+
257
+
258
+ Emerald.Persistence.save = function(model, callbackController) {
259
+ var instance = function() {
260
+ this.initialize = function(model) {
261
+ this.model = model;
262
+ return this;
263
+ }
264
+
265
+ this.save = function(model, controller) {
266
+ var attributes = this.model.attributes();
267
+
268
+ if (!attributes)
269
+ return false;
270
+
271
+ var _controller = controller;
272
+ var requestSpecs = Emerald.Persistence.saveRequest(model);
273
+
274
+ $.ajax(requestSpecs).done(function(jsonResponse) {
275
+ if (_controller)
276
+ _controller.persistViewCallback(jsonResponse);
277
+ }).fail(function(jsonResponse) {
278
+ if (_controller)
279
+ _controller.failedAjaxResponseCallback(jsonResponse);
280
+ });
281
+
282
+ return requestSpecs;
283
+ }
284
+
285
+ return this;
286
+ }
287
+
288
+ instance().initialize(model);
289
+ return instance().save(model, callbackController);
290
+ }
291
+
292
+ Emerald.Persistence.saveRequest = function(model) {
293
+ var attributes = model.attributes();
294
+
295
+ return {
296
+ url: model.route,
297
+ data: attributes,
298
+ type: Emerald.Persistence.saveRequestType(attributes),
299
+ dataType: "json"
300
+ }
301
+ }
302
+
303
+ Emerald.Persistence.saveRequestType = function(attributes) {
304
+ if (attributes["id"])
305
+ return "PUT";
306
+ else
307
+ return "POST";
308
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emerald-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -39,10 +39,13 @@ files:
39
39
  - LICENSE.txt
40
40
  - README.md
41
41
  - Rakefile
42
- - app/assets/javascript/stable.js
42
+ - app/assets/javascript/emerald.js
43
43
  - emerald-rails.gemspec
44
44
  - lib/emerald-rails.rb
45
45
  - lib/emerald-rails/version.rb
46
+ - lib/generators/emerald/install/USAGE
47
+ - lib/generators/emerald/install/install_generator.rb
48
+ - lib/generators/emerald/install/templates/emerald.js
46
49
  homepage: http://github.com/kurko/emerald-rails
47
50
  licenses: []
48
51
  post_install_message: