sudojs-rails 0.5.2 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6409eeebdaf24d9b416362ec4503acaf22089eeb
4
- data.tar.gz: a39ba527ca084cbaecf6678c8c2b6d9eb058819c
3
+ metadata.gz: b335124bd3f573c78ba8b97c203fd8c22aa9bbd2
4
+ data.tar.gz: 4ddebbc8b02899b70b745f4f5283e679a004beac
5
5
  SHA512:
6
- metadata.gz: e738a60eecd736a811536b5108fae2d48e33e0f4692682f283eebe31ac6e10459e248399918ed9f51cd64d089b05e80f6643e705ac6d7d88a808f6abe531681f
7
- data.tar.gz: c020fb704fbce01d0fc2e541f5d96ef861fa6699599555d9ba53d60f041823807ac624b138ec99190f1d452d4e25893488b83c0badb2055d7006b609e1117b45
6
+ metadata.gz: 817e532d80a8fcaf0d1578946dca62aa3af61e3c3d54ec3572153751c4a602e9135473a3a48af3aa048ef2edc1fbfcaa800a4fde6c9da458cf79dc7b89757295
7
+ data.tar.gz: f9e95e817a8053c93bca274bc5637d5d15125002027794f1e2083a79ee0b25323b7515c256400c2d031c8c0e8ae0ebd849a1a1cb8d7afe9eea156dd2f84d3a1c
@@ -24,15 +24,15 @@ module Sudojs
24
24
  'ViewController' => '_.ViewController'
25
25
  }
26
26
 
27
- @js_app_path = 'app/assets/javascripts/views/application'
28
- @css_app_path = 'app/assets/stylesheets/views/application'
29
- @js_model_path = 'app/assets/javascripts/models'
30
- @js_views_path = 'app/assets/javascripts/views'
31
- @css_views_path = 'app/assets/stylesheets/views'
27
+ @js_app_path = "#{path_prefix}app/assets/javascripts/views/application"
28
+ @css_app_path = "#{path_prefix}app/assets/stylesheets/views/application"
29
+ @js_model_path = "#{path_prefix}app/assets/javascripts/models"
30
+ @js_views_path = "#{path_prefix}app/assets/javascripts/views"
31
+ @css_views_path = "#{path_prefix}app/assets/stylesheets/views"
32
32
 
33
33
  # was the js_dir option passed
34
34
  if options[:js_dir] != ''
35
- @js_dir = "app/assets/javascripts/#{options[:js_dir]}"
35
+ @js_dir = "#{path_prefix}app/assets/javascripts/#{options[:js_dir]}"
36
36
  else
37
37
  @js_dir = nil
38
38
  end
@@ -70,7 +70,7 @@ module Sudojs
70
70
  @js_req = 'models'
71
71
  skip_css = true
72
72
  namespace = 'lib.models'
73
- when '_.View', '_.ViewController', 'DataView'
73
+ when '_.View', '_.ViewManager', 'DataView'
74
74
  @args = 'el, data'
75
75
  @js_path = @js_views_path
76
76
  @js_req = 'views'
@@ -127,8 +127,8 @@ module Sudojs
127
127
  # user passed option can take precedence
128
128
  req = "require #{@js_dir || @js_path}/#{@c_name}/#{@a_name}"
129
129
  end
130
- filename = "app/assets/javascripts/manifests/#{@c_name}.js"
131
- css_filename = "app/assets/stylesheets/manifests/#{@c_name}.css"
130
+ filename = "#{path_prefix}app/assets/javascripts/manifests/#{@c_name}.js"
131
+ css_filename = "#{path_prefix}app/assets/stylesheets/manifests/#{@c_name}.css"
132
132
 
133
133
  line = js_pre + req
134
134
  css_line = css_pre + req + "\n"
@@ -156,7 +156,7 @@ module Sudojs
156
156
  end
157
157
 
158
158
  def modify_view_if_exists
159
- filename = "app/views/#{@c_name}/#{@a_name}#{html_extension}"
159
+ filename = "#{path_prefix}app/views/#{@c_name}/#{@a_name}#{html_extension}"
160
160
  if File.exist? filename
161
161
  # TODO other pre-processors may need entries here
162
162
  if js_extension == '.js.coffee'
@@ -164,7 +164,7 @@ module Sudojs
164
164
  else
165
165
  comment = '//'
166
166
  end
167
- note = "#{comment} Optional invocation of your new Class.\n#{comment} Place this into a jQuery document ready block."
167
+ note = "#{comment} Optional invocation of your new Class.\n#{comment} Place this into a $ document ready block."
168
168
  content = "\n#{note}\n#{comment} #{@path_to_object}.#{@a_camel} = new #{@path_to_object}.#{@a_pascal}(#{@args});"
169
169
  append_to_file filename, content
170
170
  end
@@ -14,6 +14,10 @@ module Sudojs
14
14
  CFG['js_extension']
15
15
  end
16
16
 
17
+ def path_prefix
18
+ CFG['path_prefix']
19
+ end
20
+
17
21
  # do not create any files for (s)css
18
22
  def skip_css?
19
23
  CFG['skip_css']
@@ -1,6 +1,7 @@
1
1
  module Sudojs
2
2
  module Generators
3
3
  class InstallGenerator < Rails::Generators::Base
4
+
4
5
  source_root File.expand_path('../templates', __FILE__)
5
6
 
6
7
  class_option :html_extension, :type => :string, :aliases => '--html_extension', :default => '.erb',
@@ -11,9 +12,13 @@ module Sudojs
11
12
 
12
13
  class_option :css_extension, :type => :string, :default => '.css', :aliases => '--css_extension',
13
14
  :desc => 'Which css extension to use'
15
+
14
16
  class_option :skip_css, :type => :boolean, :aliases => '--skip-css', :default => false,
15
17
  :desc => 'Skip the generation of any css files along with js'
16
18
 
19
+ class_option :path_prefix, :type => :string, :aliases => '--path_prefix', :default => '',
20
+ :desc => 'prefix a path to the default rails app type `app/assets/...`'
21
+
17
22
  def create_yaml
18
23
  if options[:skip_css]
19
24
  @skip_css = 'true'
@@ -25,8 +30,8 @@ module Sudojs
25
30
 
26
31
  def create_dir_structure
27
32
  %W{manifests models views}.each do |dir|
28
- directory = "app/assets/javascripts/#{dir}"
29
- css_directory = "app/assets/stylesheets/#{dir}"
33
+ directory = "#{options[:path_prefix]}app/assets/javascripts/#{dir}"
34
+ css_directory = "#{options[:path_prefix]}app/assets/stylesheets/#{dir}"
30
35
  unless File.directory? directory
31
36
  empty_directory directory
32
37
  end
@@ -38,22 +43,22 @@ module Sudojs
38
43
  end
39
44
  end
40
45
  # place the application/ in the views/
41
- empty_directory 'app/assets/javascripts/views/application'
42
- empty_directory 'app/assets/stylesheets/views/application'
46
+ empty_directory "#{options[:path_prefix]}app/assets/javascripts/views/application"
47
+ empty_directory "#{options[:path_prefix]}app/assets/stylesheets/views/application"
43
48
  end
44
49
 
45
50
  def place_install_files
46
- copy_file 'app_manifest.js', 'app/assets/javascripts/manifests/application.js'
51
+ copy_file 'app_manifest.js', "#{options[:path_prefix]}app/assets/javascripts/manifests/application.js"
47
52
  unless options[:skip_css]
48
- copy_file 'app_manifest.css', 'app/assets/stylesheets/manifests/application.css'
53
+ copy_file 'app_manifest.css', "#{options[:path_prefix]}app/assets/stylesheets/manifests/application.css"
49
54
  end
50
55
 
51
56
  # TODO templates for other javascript pre-processors
52
57
  if options[:js_extension] == '.coffee'
53
- copy_file 'namespace.coffee', "app/assets/javascripts/views/application/page.js.coffee"
58
+ copy_file 'namespace.coffee', "#{options[:path_prefix]}app/assets/javascripts/views/application/page.js.coffee"
54
59
  else
55
60
  # for now any other js flavor gets the baseline .js
56
- copy_file 'namespace.js', "app/assets/javascripts/views/application/page.js#{options[:js_extension] if options[:js_extension] != '.js'}"
61
+ copy_file 'namespace.js', "#{options[:path_prefix]}app/assets/javascripts/views/application/page.js#{options[:js_extension] if options[:js_extension] != '.js'}"
57
62
  end
58
63
 
59
64
  end
@@ -3,4 +3,4 @@
3
3
  //
4
4
  //= require sudojs/zepto
5
5
  //= require sudojs/sudo
6
- //= require views/application/page
6
+ //= require views/application/namespaces
@@ -2,7 +2,6 @@
2
2
  window.lib = {}
3
3
 
4
4
  window.page =
5
- descriptors: [],
6
5
  models: new _.Container(),
7
- templates: new _.Container()
6
+ templates: {}
8
7
 
@@ -2,7 +2,6 @@
2
2
  window.lib = {};
3
3
 
4
4
  window.page = {
5
- descriptors: [],
6
5
  models: new _.Container(),
7
- templates: new _.Container()
6
+ templates: {}
8
7
  };
@@ -9,3 +9,6 @@ skip_css: <%= @skip_css %>
9
9
 
10
10
  # sass/less/...?
11
11
  css_extension: .css<%= options[:css_extension] if options[:css_extension] != '.css'%>
12
+
13
+ # custom project directory structure?
14
+ path_prefix: <%= options[:path_prefix] %>
@@ -1,3 +1,3 @@
1
1
  module Sudojs
2
- VERSION = '0.5.2'
2
+ VERSION = '0.5.3'
3
3
  end
@@ -519,7 +519,7 @@ sudo.Container.prototype.send = function send(/*args*/) {
519
519
  else if(typeof args[0] === 'string') meth = args.shift();
520
520
  // less common but viable options
521
521
  if(!meth) {
522
- // passed as a jquery custom data attr bound in events
522
+ // passed as a custom data attr bound in events
523
523
  meth = 'data' in args[0] ? args[0].data.sendMethod :
524
524
  // passed in a hash from something or not passed at all
525
525
  args[0].sendMethod || void 0;
@@ -547,12 +547,12 @@ sudo.Container.prototype.send = function send(/*args*/) {
547
547
  // based on the `tagName` (`div` by default). Specify `className`, `id` (or other attributes if desired)
548
548
  // as an (optional) `attributes` object literal on the `data` arg.
549
549
  //
550
- // The view object uses jquery for dom manipulation
551
- // and event delegation etc... A jquerified `this` reference is located
550
+ // The view object uses zepto for dom manipulation
551
+ // and event delegation etc... A querified `this` reference is located
552
552
  // at `this.$el` and `this.$` scopes queries to this objects `el`, i.e it's
553
553
  // a shortcut for `this.$el.find(selector)`
554
554
  //
555
- // `param` {string|element|jQuery} `el`. Otional el for the View instance.
555
+ // `param` {string|element|Query} `el`. Otional el for the View instance.
556
556
  // `param` {Object} `data`. Optional data object-literal which becomes the initial state
557
557
  // of a new model located at `this.model`. Also can be a reference to an existing sudo.Model instance
558
558
  //
@@ -597,7 +597,7 @@ sudo.View.prototype._normalizedEl_ = function _normalizedEl_(el) {
597
597
  if(typeof el === 'string') {
598
598
  return $(el);
599
599
  } else {
600
- // Passed an already `jquerified` Element?
600
+ // Passed an already `querified` Element?
601
601
  // It will have a length of 1 if so.
602
602
  return el.length ? el : $(el);
603
603
  }
@@ -623,7 +623,7 @@ sudo.View.prototype.resignPremier = function resignPremier(cb) {
623
623
  sudo.View.prototype.role = 'view';
624
624
  // ###setEl
625
625
  // A view must have an element, set that here.
626
- // Stores a jquerified object as `this.$el` the raw
626
+ // Stores a querified object as `this.$el` the raw
627
627
  // node is always then available as `this.$el[0]`.
628
628
  //
629
629
  // `param` {string=|element} `el`
@@ -644,135 +644,11 @@ sudo.View.prototype.setEl = function setEl(el) {
644
644
  // Return a single Element matching `sel` scoped to this View's el.
645
645
  // This is an alias to `this.$el.find(sel)`.
646
646
  //
647
- // `param` {string} `sel`. A jQuery compatible selector
648
- // `returns` {jQuery} A 'jquerified' result matching the selector
647
+ // `param` {string} `sel`. A Query compatible selector
648
+ // `returns` {Query} A 'querified' result matching the selector
649
649
  sudo.View.prototype.$ = function(sel) {
650
650
  return this.$el.find(sel);
651
651
  };
652
- // ##ViewController Class Object
653
-
654
- // ViewControllers were designed for Rails projects for 2 specific use-cases:
655
- //
656
- // 1. ViewControllers can instantiate any `descriptors` found in their model
657
- // when constructing, adding them as `child` objects. Why? Sometimes a 'partial' will
658
- // need to define a javascript object that should, by design, be the child of a parent View
659
- // that is itself defined on the Rails view that owns the 'partial'. Since any JS introduced
660
- // by a partial will be parsed before the JS on its parent Rails View this usually isn't possible.
661
- // Our solution? Pushing `Descriptor objects` (see docs) into an array (somewhere in your namespace) from a
662
- // 'partial' and then passing a reference to that array into the ViewController as 'descriptors'
663
- // in its optional data argument when instantiated. The ViewController will then iterate over those
664
- // and instantiate them, adding them as children as it goes (also setting up any stated observers)
665
- //
666
- // 2. ViewControllers also abstract away connecting UJS style events by allowing the developer to
667
- // pass in the name(s) of any desired UJS events to observe: `ujsEvent: ajax:success` for example,
668
- // and expect that a method named onAjaxSuccess, if present on the ViewController, will be called
669
- // with the arguments returned by the UJS plugin*
670
- //
671
- // `param` {string|element} `el`. Otional el for the View instance.
672
- // `param` {object} `data`. Optional data object.
673
- //
674
- // `see` sudo.View.
675
- //
676
- // `constructor`
677
- sudo.ViewController = function(el, data) {
678
- sudo.View.call(this, el, data);
679
- // map the names of events to methods we expect to proxy to
680
- this.eventMap = {
681
- 'ajax:before': 'onAjaxBefore',
682
- 'ajax:beforeSend': 'onAjaxBeforeSend',
683
- 'ajax:success': 'onAjaxSuccess',
684
- 'ajax:error': 'onAjaxError',
685
- 'ajax:complete': 'onAjaxComplete',
686
- 'ajax:aborted:required': 'onAjaxAbortedRequired',
687
- 'ajax:aborted:file': 'onAjaxAbortedFile'
688
- };
689
- // can be called again if mapping changes...
690
- if(data) {
691
- this.doMapping();
692
- if('descriptor' in data) this.instantiateChildren([data.descriptor]);
693
- else if('descriptors' in data) this.instantiateChildren();
694
- }
695
- if(this.role === 'viewController') this.init();
696
- };
697
- // ViewController inherits from View.
698
- // `private`
699
- sudo.inherit(sudo.View, sudo.ViewController);
700
- // ###doMapping
701
- //
702
- // assign the proxy mapping for events. This can be called at any time
703
- // if the listened for events change
704
- //
705
- // `returns` {Object} `this`
706
- sudo.ViewController.prototype.doMapping = function() {
707
- // either a single event or an array of them
708
- var i,
709
- toMap = this.model.data.ujsEvent || this.model.data.ujsEvents;
710
- if(toMap) {
711
- if(typeof toMap === 'string') this._mapEvent_(toMap);
712
- else {
713
- for(i = 0; i < toMap.length; i++) {
714
- this._mapEvent_(toMap[i]);
715
- }
716
- }
717
- }
718
- return this;
719
- };
720
- // ###_handleObserve_
721
- // Helper for instantiateChildren
722
- // `private`
723
- sudo.ViewController.prototype._handleObserve_ = function _handleObserve_(obs, c) {
724
- var obj = obs.object ? this._objectForPath_(obs.object) : this.model;
725
- obj.observe(c[obs.cb].bind(c));
726
- };
727
- // ###instantiateChildren
728
- // instantiate the children described in the passed in array or the `descriptors` array
729
- // set in this object's data store
730
- //
731
- // `returns` {object} `this`
732
- sudo.ViewController.prototype.instantiateChildren = function instantiateChildren(ary) {
733
- var i, j, curr, c, d = ary || this.model.data.descriptors;
734
- for(i = 0; i < d.length; i++) {
735
- curr = d[i];
736
- c = new curr.is_a(curr.el, curr.data);
737
- this.addChild(c, curr.name);
738
- // handle any observe(s)
739
- if('observe' in curr) {
740
- this._handleObserve_(curr.observe, c);
741
- }
742
- else if('observes' in curr) {
743
- for(j = 0; j < curr.observes.length; j++) {
744
- this._handleObserve_(curr.observes[j], c);
745
- }
746
- }
747
- }
748
- return this;
749
- };
750
- // ###_mapEvent_
751
- // Maps the ajax:event names to methods
752
- // `private`
753
- sudo.ViewController.prototype._mapEvent_ = function _mapEvent_(name) {
754
- // because the signatures vary we need specific methods
755
- this.$el.on(name, this[this.eventMap[name]].bind(this));
756
- };
757
- // ###_objectForPath_
758
- // The objects used for callbacks and connections need to be
759
- // looked-up via a key-path like address as they likely will not exist
760
- // when viewController's are instantiated.
761
- // `private`
762
- sudo.ViewController.prototype._objectForPath_ = function _objectForPath_(path) {
763
- return sudo.getPath(path, window);
764
- };
765
- // Virtual methods to override in your child classes for
766
- // any events you chose to listen for
767
- sudo.ViewController.prototype.onAjaxAbortedFile = $.noop;
768
- sudo.ViewController.prototype.onAjaxAbortedRequired = $.noop;
769
- sudo.ViewController.prototype.onAjaxBefore = $.noop;
770
- sudo.ViewController.prototype.onAjaxBeforeSend = $.noop;
771
- sudo.ViewController.prototype.onAjaxComplete = $.noop;
772
- sudo.ViewController.prototype.onAjaxSuccess = $.noop;
773
- sudo.ViewController.prototype.onAjaxError = $.noop;
774
- // `private`
775
- sudo.ViewController.prototype.role = 'viewController';
776
652
  // ###Templating
777
653
 
778
654
  // Allow the default {{ js code }}, {{= key }}, and {{- escape stuff }}
@@ -925,7 +801,7 @@ sudo.DataView.prototype.addedToParent = function(parent) {
925
801
  // there may not be yet as some get added later by a ViewController
926
802
  sudo.DataView.prototype.build = function build() {
927
803
  var t;
928
- if(!(t = this.model.data.template)) return;
804
+ if(!(t = this.model.data.template)) return this;
929
805
  if(typeof t === 'string') t = sudo.template(t);
930
806
  this.$el.html(t(this.model.data));
931
807
  this.built = true;
@@ -1387,165 +1263,6 @@ sudo.extensions.observable = {
1387
1263
  return this.deliverChangeRecords();
1388
1264
  }
1389
1265
  };
1390
- // ##Bindable Extension Object
1391
-
1392
- // Bindable methods allow various properties and attributes of
1393
- // a sudo Class Object to be synchronized with the data contained
1394
- // in a changeRecord recieved via observe().
1395
- //
1396
- // `namespace`
1397
- sudo.extensions.bindable = {
1398
- // List of attributes - $.attr() to be used.
1399
- //
1400
- // `private`
1401
- _attr_: {
1402
- accesskey: true,
1403
- align: true,
1404
- alt: true,
1405
- contenteditable: true,
1406
- draggable: true,
1407
- href: true,
1408
- label: true,
1409
- name: true,
1410
- rel: true,
1411
- src: true,
1412
- tabindex: true,
1413
- title: true
1414
- },
1415
- // Some bindings defer to jQuery.css() to be bound.
1416
- //
1417
- // `private`
1418
- _css_: {
1419
- display: true,
1420
- visibility: true
1421
- },
1422
- // ###_handleAttr_
1423
- // bind the jQuery prop() method to this object, now exposed
1424
- // by this name, matching passed `bindings` arguments.
1425
- //
1426
- // `param` {string} `meth` The name of the method to be bound
1427
- // `returns` {Object} `this`
1428
- // `private`
1429
- _handleAttr_: function _handleAttr_(meth) {
1430
- this[meth] = function(obj) {
1431
- if(obj.name === meth) this.$el.attr(meth, obj.object[obj.name]);
1432
- return this;
1433
- };
1434
- return this;
1435
- },
1436
- // ###_handleCss_
1437
- // bind the jQuery css() method to this object, now exposed
1438
- // by this name, matching passed `bindings` arguments.
1439
- //
1440
- // `param` {string} `meth` The name of the method to be bound
1441
- // `returns` {Object} `this`
1442
- // `private`
1443
- _handleCss_: function _handleCss_(meth) {
1444
- this[meth] = function(obj) {
1445
- if(obj.name === meth) this.$el.css(meth, obj.object[obj.name]);
1446
- return this;
1447
- };
1448
- return this;
1449
- },
1450
- // ###_handleData_
1451
- // bind the jQuery data() method to this object, now exposed
1452
- // by this name, matching passed `bindings` arguments.
1453
- //
1454
- // `param` {string} `meth` The name of the method to be bound
1455
- // `returns` {Object} `this`
1456
- // `private`
1457
- _handleData_: function _handleData_(meth) {
1458
- this[meth] = function(obj) {
1459
- if(obj.name === meth) {
1460
- this.$el.data(obj.object[obj.name].key, obj.object[obj.name].value);
1461
- return this;
1462
- }
1463
- };
1464
- return this;
1465
- },
1466
- // ###_handleProp_
1467
- // bind the jQuery attr() method to this object, now exposed
1468
- // by this name, matching passed `bindings` arguments.
1469
- //
1470
- // NOTE: If more than 1 data-* attribute is desired you must
1471
- // set those up manually as <obj>.data({..}) is what will be
1472
- // constructed via this method.
1473
- //
1474
- // `param` {string} `meth` The name of the method to be bound.
1475
- // `returns` {Object} `this`
1476
- // `private`
1477
- _handleProp_: function _handleProp_(meth) {
1478
- this[meth] = function(obj) {
1479
- if(obj.name === meth) this.$el.prop(meth, obj.object[obj.name]);
1480
- return this;
1481
- };
1482
- return this;
1483
- },
1484
- // ###_handleSpec_
1485
- // bind the jQuery shorthand methods to this object matching
1486
- // passed `bindings` arguments.
1487
- //
1488
- // `param` {string} `meth` The name of the method to be bound.
1489
- // `returns` {Object} `this`
1490
- // `private`
1491
- _handleSpec_: function _handleSpec_(meth) {
1492
- this[meth] = function(obj) {
1493
- if(obj.name === meth) this.$el[meth](obj.object[obj.name]);
1494
- return this;
1495
- };
1496
- return this;
1497
- },
1498
- // List of properties - $.prop() to be used.
1499
- //
1500
- // `private`
1501
- _prop_: {
1502
- checked: true,
1503
- defaultValue: true,
1504
- disabled: true,
1505
- location: true,
1506
- multiple: true,
1507
- readOnly: true,
1508
- selected: true
1509
- },
1510
- // ###_setBinding_
1511
- // Given a single explicit binding, create it. Called from
1512
- // _setbindings_ as a convenience for normalizing the
1513
- // single vs. multiple bindings scenario
1514
- //
1515
- // `param` {string} `b` The binding.
1516
- // `private`
1517
- _setBinding_: function _setBinding_(b) {
1518
- if(b in this._spec_) return this[this._spec_[b]](b);
1519
- if(b in this._css_) return this._handleCss_(b);
1520
- if(b in this._attr_) return this._handleAttr_(b);
1521
- if(b in this._prop_) return this._handleProp_(b);
1522
- },
1523
- // ###setBindings
1524
- // Inspect the binding (in the single-bound use case), or the
1525
- // bindings Array in this Object's data store and
1526
- // create the bound functions expected.
1527
- //
1528
- // `returns` {Object} `this`
1529
- setBindings: function setBindings() {
1530
- var d = this.model.data, b, i;
1531
- // handle the single binding use case
1532
- if((b = d.binding)) return this._setBinding_(b);
1533
- if(!(b = d.bindings)) return this;
1534
- for(i = 0; i < b.length; i++) {
1535
- this._setBinding_(b[i]);
1536
- }
1537
- return this;
1538
- },
1539
- // `Special` binding cases. jQuery shorthand methods to be used.
1540
- //
1541
- // `private`
1542
- _spec_: {
1543
- data: '_handleData_',
1544
- html: '_handleSpec_',
1545
- text: '_handleSpec_',
1546
- val: '_handleSpec_'
1547
- }
1548
- };
1549
1266
  // ##Listener Extension Object
1550
1267
 
1551
1268
  // Handles event binding/unbinding via an events array in the form:
@@ -1644,7 +1361,7 @@ sudo.extensions.persistable = {
1644
1361
  // state of the model on the server and set it here (via a success callback).
1645
1362
  //
1646
1363
  // `param` {object} `params` Hash of options for the XHR call
1647
- // `returns` {object} The jQuery XHR object
1364
+ // `returns` {object} The XHR object
1648
1365
  create: function create(params) {
1649
1366
  return this._sendData_('POST', params);
1650
1367
  },
@@ -1653,7 +1370,7 @@ sudo.extensions.persistable = {
1653
1370
  // Delete this model on the server
1654
1371
  //
1655
1372
  // `param` {object} `params` Optional hash of options for the XHR
1656
- // `returns` {object} jqXhr
1373
+ // `returns` {object} Xhr
1657
1374
  destroy: function destroy(params) {
1658
1375
  return this._sendData_('DELETE', params);
1659
1376
  },
@@ -1670,10 +1387,15 @@ sudo.extensions.persistable = {
1670
1387
  opts.url || (opts.url = this.url(opts.baseUrl));
1671
1388
  opts.type || (opts.type = meth);
1672
1389
  opts.dataType || (opts.dataType = 'json');
1390
+ var isJson = opts.dataType === 'json';
1391
+ // by default turn off the global ajax triggers as all data
1392
+ // should flow thru the models to their observers
1393
+ opts.global || (opts.global = false);
1673
1394
  // the default success callback is to set the data returned from the server
1674
1395
  // or just the status as `ajaxStatus` if no data was returned
1675
- opts.success || (opts.success = function(data, status, jqXhr) {
1676
- data ? this.sets(data) : this.set('ajaxStatus', status);
1396
+ opts.success || (opts.success = function(data, status, xhr) {
1397
+ data ? this.sets((isJson && typeof data === 'string') ? JSON.parse(data) : data) :
1398
+ this.set('ajaxStatus', status);
1677
1399
  }.bind(this));
1678
1400
  // allow the passed in params to override any set in this model's `ajax` options
1679
1401
  return params ? $.extend(opts, params) : opts;
@@ -1689,7 +1411,7 @@ sudo.extensions.persistable = {
1689
1411
  //
1690
1412
  // `param` {object} `params`. Optional info for the XHR call. If
1691
1413
  // present will override any set in this model's `ajax` options object.
1692
- // `returns` {object} The jQuery XHR object
1414
+ // `returns` {object} The XHR object
1693
1415
  read: function read(params) {
1694
1416
  return $.ajax(this._normalizeParams_('GET', null, params));
1695
1417
  },
@@ -1699,7 +1421,7 @@ sudo.extensions.persistable = {
1699
1421
  // or has been loaded/refreshed from the server.
1700
1422
  //
1701
1423
  // `param` {object} `params` Hash of options for the XHR call
1702
- // `returns` {object} The jQuery XHR object
1424
+ // `returns` {object} The XHR object
1703
1425
  save: function save(params) {
1704
1426
  return ('id' in this.data) ? this.update(params) : this.create(params);
1705
1427
  },
@@ -1707,11 +1429,15 @@ sudo.extensions.persistable = {
1707
1429
  // The Create, Update and Patch methods all send data to the server,
1708
1430
  // varying only in their HTTP method. Abstracted logic is here.
1709
1431
  //
1710
- // `returns` {object} jqXhr
1432
+ // `returns` {object} Xhr
1711
1433
  _sendData_: function _sendData_(meth, params) {
1712
1434
  opts = $.extend({}, this.data.ajax);
1713
1435
  opts.contentType || (opts.contentType = 'application/json');
1714
1436
  opts.data || (opts.data = this.data);
1437
+ // assure that, in the default json case, opts.data is json
1438
+ if(opts.contentType === 'application/json' && (typeof opts.data !== 'string')) {
1439
+ opts.data = JSON.stringify(opts.data);
1440
+ }
1715
1441
  // non GET requests do not 'processData'
1716
1442
  if(!('processData' in opts)) opts.processData = false;
1717
1443
  return $.ajax(this._normalizeParams_(meth, opts, params));
@@ -1727,7 +1453,7 @@ sudo.extensions.persistable = {
1727
1453
  // or use the `save()` method (that does check).
1728
1454
  //
1729
1455
  // `param` {object} `params` Optional hash of options for the XHR
1730
- // `returns` {object|bool} the jqXhr if called false if not
1456
+ // `returns` {object|bool} the Xhr if called false if not
1731
1457
  update: function update(params) {
1732
1458
  return this._sendData_((this.data.ajax.patch || params && params.patch) ?
1733
1459
  'PATCH' : 'PUT', params);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sudojs-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - robrobbins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-28 00:00:00.000000000 Z
11
+ date: 2013-08-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Install the latest versions of sudo.js and provide generators for fast
14
14
  and easy use.