angularjs-rails-resource 1.0.0.pre.2 → 1.0.0.pre.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +57 -1
- data/Gruntfile.js +51 -36
- data/README.md +203 -68
- data/bower.json +2 -2
- data/changelog.js +206 -0
- data/karma.conf.js +2 -1
- data/lib/angularjs-rails-resource/version.rb +1 -1
- data/package.json +9 -3
- data/test/unit/angularjs/rails/extensions/snapshotsSpec.js +428 -0
- data/test/unit/angularjs/rails/resourceProviderSpec.js +20 -0
- data/test/unit/angularjs/rails/resourceSpec.js +173 -50
- data/vendor/assets/javascripts/angularjs/rails/resource/extensions/snapshots.js +117 -0
- data/vendor/assets/javascripts/angularjs/rails/resource/resource.js +239 -52
- data/vendor/assets/javascripts/angularjs/rails/resource/serialization.js +4 -4
- data/vendor/assets/javascripts/angularjs/rails/resource/utils/inflector.js +1 -1
- data/vendor/assets/javascripts/angularjs/rails/resource/utils/injector.js +21 -4
- data/vendor/assets/javascripts/angularjs/rails/resource/utils/url_builder.js +1 -2
- metadata +7 -6
- data/angularjs-rails-resource.js +0 -1117
- data/angularjs-rails-resource.min.js +0 -7
- data/angularjs-rails-resource.zip +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7ce09b68d048977e8091b90cd120e0f7836f183
|
4
|
+
data.tar.gz: 2c0eb42c1684eb64a5fd58e80a7adc8fed7e4e2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eb139ae046e2756eba924f354fbc386d752994ce43bbb67f5696f5c8567cc5ac49a125c7b687079c4766bce508dbd67dbc9c86097647e502daaf00952b01677
|
7
|
+
data.tar.gz: 56415e2fc32de4a5bd82db9cf0ece3ab680aa583bbb61a5df39bd2f8d14c95a2e74b3028c877da15f6fe648a86f6977937d1be9188d3971a4437d0ba295d3bf3
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,7 +3,9 @@
|
|
3
3
|
## Bug Fixes
|
4
4
|
|
5
5
|
## Features
|
6
|
-
- Added <code>configure</code> to allow changing configuration options after the resource has been initially configured.
|
6
|
+
- Added <code>configure</code> function to allow changing configuration options after the resource has been initially configured.
|
7
|
+
- Separated out RailsResource into separate service to allow subclassing without using the factories.
|
8
|
+
- Added snapshot and rollback extension, be sure to check the [README](README.md#serializers) for details.
|
7
9
|
|
8
10
|
## Breaking Changes
|
9
11
|
- <code>railsResourceFactoryProvider</code> settings have been moved to <code>RailsResourceProvider</code>
|
@@ -13,6 +15,60 @@
|
|
13
15
|
- <code>enableRootWrapping</code> was renamed <code>rootWrapping</code>
|
14
16
|
- <code>rootName</code> was renamed <code>name</code>
|
15
17
|
- <code>rootPluralName</code> was renamed <code>pluralName</code>
|
18
|
+
- Query parameters were not underscored previously. We are now underscoring parameters by default.
|
19
|
+
The configuration option <code>underscoreParams</code> can be set to false to disable the renaming.
|
20
|
+
|
21
|
+
<a name="1.0.0-pre.3"></a>
|
22
|
+
# 1.0.0-pre.3
|
23
|
+
## Features
|
24
|
+
- Added mixin capability, see [README](README.md#mixins) for details
|
25
|
+
- Added snapshot and rollback extension, see [README](README.md#serializers) for details.
|
26
|
+
- Added <code>underscoreParams</code> configuration option to allow turning off parameter underscore renaming.
|
27
|
+
|
28
|
+
## Breaking Changes
|
29
|
+
- Query parameters were not underscored previously. We are now underscoring parameters by default.
|
30
|
+
The configuration option <code>underscoreParams</code> can be set to false to disable the renaming.
|
31
|
+
|
32
|
+
<a name="1.0.0-pre.2"></a>
|
33
|
+
# 1.0.0-pre.2
|
34
|
+
## Bug Fixes
|
35
|
+
- Support submitting array data (#85)
|
36
|
+
|
37
|
+
<a name="1.0.0-pre.1"></a>
|
38
|
+
# 1.0.0-pre.1
|
39
|
+
## Bug Fixes
|
40
|
+
|
41
|
+
## Features
|
42
|
+
- Added <code>configure</code> function to allow changing configuration options after the resource has been initially configured.
|
43
|
+
- Separated out RailsResource into separate service to allow subclassing without using the factories.
|
44
|
+
|
45
|
+
## Breaking Changes
|
46
|
+
- <code>railsResourceFactoryProvider</code> settings have been moved to <code>RailsResourceProvider</code>
|
47
|
+
- <code>wrapData</code> config option has been renamed <code>rootWrapping</code>
|
48
|
+
- All resource settings are now stored under the <code>config</code> property on the resource and should be modified using the <code>configure</code> function.
|
49
|
+
- The following resource settings have been renamed:
|
50
|
+
- <code>enableRootWrapping</code> was renamed <code>rootWrapping</code>
|
51
|
+
- <code>rootName</code> was renamed <code>name</code>
|
52
|
+
- <code>rootPluralName</code> was renamed <code>pluralName</code>
|
53
|
+
- Query parameters were not underscored previously. We are now underscoring parameters by default.
|
54
|
+
The configuration option <code>underscoreParams</code> can be set to false to disable the renaming.
|
55
|
+
- Replaced <code>railsRootWrappingTransformer</code> and <code>railsRootWrappingInterceptor</code> with <code>railsRootWrapper</code>
|
56
|
+
that has wrap & unwrap methods. This eliminates the need for using promises during resource construction to handle unwrapping
|
57
|
+
data passed into the constructor.
|
58
|
+
- Resource constructor no longer executes response interceptors. If you need to customize the constructor you should look
|
59
|
+
at using subclassing instead.
|
60
|
+
- <code>processResponse</code>, <code>transformData</code>, <code>callInterceptors</code> have all been removed as part of rewriting
|
61
|
+
the request / response handling.
|
62
|
+
|
63
|
+
<a name="0.2.5"></a>
|
64
|
+
# 0.2.5
|
65
|
+
## Bug Fixes
|
66
|
+
- Support submitting array data (#85)
|
67
|
+
|
68
|
+
<a name="0.2.4"></a>
|
69
|
+
# 0.2.4
|
70
|
+
## Bug Fixes
|
71
|
+
- Fix mapped name behavior when using serializer default exclusion (#81)
|
16
72
|
|
17
73
|
<a name="0.2.3"></a>
|
18
74
|
# 0.2.3
|
data/Gruntfile.js
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
module.exports = function(grunt) {
|
2
|
-
|
3
2
|
var path = require('path');
|
4
3
|
|
5
4
|
var srcFolder = 'vendor/assets/javascripts/angularjs/rails/resource/',
|
6
5
|
srcFiles = ["index.js", "utils/**/*.js", "serialization.js", "resource.js"].map(function(glob) {
|
7
6
|
return srcFolder + glob;
|
7
|
+
}),
|
8
|
+
extensionFiles = ["extensions/**/*.js"].map(function(glob) {
|
9
|
+
return srcFolder + glob;
|
8
10
|
});
|
9
11
|
|
10
12
|
grunt.initConfig({
|
11
13
|
pkg: grunt.file.readJSON('package.json'),
|
14
|
+
|
12
15
|
meta: {
|
13
16
|
banner: '/**\n' +
|
14
17
|
' * <%= pkg.description %>\n' +
|
@@ -17,9 +20,21 @@ module.exports = function(grunt) {
|
|
17
20
|
' * @author <%= pkg.author %>\n' +
|
18
21
|
' */\n'
|
19
22
|
},
|
23
|
+
|
20
24
|
dirs: {
|
21
|
-
dest: '
|
25
|
+
dest: 'build'
|
26
|
+
},
|
27
|
+
|
28
|
+
clean: ['<%= dirs.dest %>'],
|
29
|
+
|
30
|
+
copy: {
|
31
|
+
extensions: {
|
32
|
+
files: [
|
33
|
+
{expand: true, flatten: true, src: extensionFiles, dest: '<%= dirs.dest %>/extensions'}
|
34
|
+
]
|
35
|
+
}
|
22
36
|
},
|
37
|
+
|
23
38
|
concat: {
|
24
39
|
options: {
|
25
40
|
banner: "<%= meta.banner %>"
|
@@ -30,25 +45,35 @@ module.exports = function(grunt) {
|
|
30
45
|
options: {
|
31
46
|
process: function(src, filepath) {
|
32
47
|
return src.replace(/^\/\/= require.*\n/gm, '');
|
33
|
-
}
|
34
|
-
}
|
48
|
+
}
|
49
|
+
}
|
35
50
|
}
|
36
51
|
},
|
37
|
-
|
38
|
-
|
52
|
+
|
53
|
+
compress: {
|
54
|
+
dist: {
|
55
|
+
options: {
|
56
|
+
archive: '<%= dirs.dest %>/angularjs-rails-resource.zip'
|
57
|
+
},
|
58
|
+
files: [
|
59
|
+
{expand: true, cwd: '<%= dirs.dest %>', src: ['**/*.js']}
|
60
|
+
]
|
61
|
+
}
|
39
62
|
},
|
63
|
+
|
40
64
|
uglify: {
|
41
65
|
options: {
|
42
66
|
banner: "<%= meta.banner %>"
|
43
67
|
},
|
44
68
|
dist: {
|
45
|
-
files:
|
46
|
-
'<%= dirs.dest
|
47
|
-
|
69
|
+
files: [
|
70
|
+
{expand: true, cwd: '<%= dirs.dest %>', src: ['**/*.js'], dest: '<%= dirs.dest %>', ext: '.min.js'}
|
71
|
+
]
|
48
72
|
}
|
49
73
|
},
|
74
|
+
|
50
75
|
jshint: {
|
51
|
-
files: ['gruntfile.js'],
|
76
|
+
files: ['gruntfile.js'].concat(srcFiles),
|
52
77
|
options: {
|
53
78
|
// options here to override JSHint defaults
|
54
79
|
globals: {
|
@@ -56,9 +81,19 @@ module.exports = function(grunt) {
|
|
56
81
|
}
|
57
82
|
}
|
58
83
|
},
|
84
|
+
|
59
85
|
watch: {
|
60
86
|
files: ['<%= jshint.files %>'],
|
61
|
-
tasks: ['jshint'
|
87
|
+
tasks: ['jshint']
|
88
|
+
},
|
89
|
+
|
90
|
+
bump: {
|
91
|
+
options: {
|
92
|
+
files: ['package.json', 'bower.json'],
|
93
|
+
commit: false,
|
94
|
+
createTag: false,
|
95
|
+
push: false
|
96
|
+
}
|
62
97
|
}
|
63
98
|
});
|
64
99
|
|
@@ -66,30 +101,10 @@ module.exports = function(grunt) {
|
|
66
101
|
grunt.loadNpmTasks('grunt-contrib-jshint');
|
67
102
|
grunt.loadNpmTasks('grunt-contrib-watch');
|
68
103
|
grunt.loadNpmTasks('grunt-contrib-concat');
|
69
|
-
grunt.loadNpmTasks('grunt-
|
70
|
-
|
71
|
-
grunt.
|
72
|
-
|
73
|
-
// Provides the "bump" task.
|
74
|
-
grunt.registerTask('bump', 'Increment version number', function() {
|
75
|
-
var versionType = grunt.option('type');
|
76
|
-
function bumpVersion(version, versionType) {
|
77
|
-
var type = {patch: 2, minor: 1, major: 0},
|
78
|
-
parts = version.split('.'),
|
79
|
-
idx = type[versionType || 'patch'];
|
80
|
-
parts[idx] = parseInt(parts[idx], 10) + 1;
|
81
|
-
while(++idx < parts.length) { parts[idx] = 0; }
|
82
|
-
return parts.join('.');
|
83
|
-
}
|
84
|
-
var version;
|
85
|
-
function updateFile(file) {
|
86
|
-
var json = grunt.file.readJSON(file);
|
87
|
-
version = json.version = bumpVersion(json.version, versionType || 'patch');
|
88
|
-
grunt.file.write(file, JSON.stringify(json, null, ' '));
|
89
|
-
}
|
90
|
-
updateFile('package.json');
|
91
|
-
updateFile('bower.json');
|
92
|
-
grunt.log.ok('Version bumped to ' + version);
|
93
|
-
});
|
104
|
+
grunt.loadNpmTasks('grunt-contrib-copy');
|
105
|
+
grunt.loadNpmTasks('grunt-contrib-clean');
|
106
|
+
grunt.loadNpmTasks('grunt-contrib-compress');
|
107
|
+
grunt.loadNpmTasks('grunt-bump');
|
94
108
|
|
109
|
+
grunt.registerTask('default', ['jshint', 'clean', 'concat', 'copy', 'uglify', 'compress']);
|
95
110
|
};
|
data/README.md
CHANGED
@@ -26,18 +26,13 @@ Book.query({title: 'Moby Dick'}).then(function (books) {
|
|
26
26
|
You can inject the <code>railsSerializerProvider</code> into your application config function and override the <code>underscore</code>
|
27
27
|
and <code>camelize</code> functions:
|
28
28
|
````javascript
|
29
|
-
angular.module('app').config(function
|
30
|
-
railsSerializerProvider.
|
31
|
-
|
32
|
-
return name;
|
33
|
-
}).
|
34
|
-
camelize(function (name) {
|
35
|
-
return name;
|
36
|
-
});
|
37
|
-
});
|
29
|
+
angular.module('app').config(["railsSerializerProvider", function(railsSerializerProvider) {
|
30
|
+
railsSerializerProvider.underscore(angular.identity).camelize(angular.identity);
|
31
|
+
}]);
|
38
32
|
````
|
39
33
|
|
40
34
|
## Installation
|
35
|
+
### Rails Asset Pipeline
|
41
36
|
Add this line to your application's Gemfile to use the latest stable version:
|
42
37
|
```ruby
|
43
38
|
gem 'angularjs-rails-resource', '~> 0.2.3'
|
@@ -47,6 +42,19 @@ Include the javascript somewhere in your asset pipeline:
|
|
47
42
|
```javascript
|
48
43
|
//= require angularjs/rails/resource
|
49
44
|
```
|
45
|
+
|
46
|
+
To add extensions just add additional requires:
|
47
|
+
```javascript
|
48
|
+
//= require angularjs/rails/resource/extensions/snapshots
|
49
|
+
```
|
50
|
+
|
51
|
+
### Standalone
|
52
|
+
If you aren't using the Rails asset pipeline you can download the combined
|
53
|
+
[angularjs-rails-resource.js](https://github.com/FineLinePrototyping/dist-angularjs-rails-resource/blob/master/angularjs-rails-resource.js)
|
54
|
+
or [angularjs-rails-resource.min.js](https://github.com/FineLinePrototyping/dist-angularjs-rails-resource/blob/master/angularjs-rails-resource.min.js).
|
55
|
+
|
56
|
+
You can also use [Bower](http://bower.io/) to install <code>angularjs-rails-resource</code>.
|
57
|
+
|
50
58
|
## Branching and Versioning
|
51
59
|
As much as possible we will try to adhere to the [SemVer](http://semver.org/) guidelines on release numbering.
|
52
60
|
|
@@ -57,35 +65,71 @@ Release branches should remain stable but it is always best to rely on the ruby
|
|
57
65
|
## Changes
|
58
66
|
Make sure to check the [CHANGELOG](CHANGELOG.md) for any breaking changes between releases.
|
59
67
|
|
60
|
-
## Dependencies
|
61
|
-
Since this is an [AngularJS](http://angularjs.org) module it of course depends on that but more specifically the it depends on the following AngularJS services:
|
62
|
-
|
63
|
-
* [$http](http://docs.angularjs.org/api/ng.$http)
|
64
|
-
* [$q](http://docs.angularjs.org/api/ng.$q)
|
65
|
-
* [$injector](http://docs.angularjs.org/api/AUTO.$injector)
|
66
|
-
* [$interpolate](http://docs.angularjs.org/api/ng.$interpolate)
|
67
|
-
|
68
68
|
## Usage
|
69
|
-
There are a lot of different ways that you can use the resources and we try not to force you into any specific pattern
|
69
|
+
There are a lot of different ways that you can use the resources and we try not to force you into any specific pattern.
|
70
|
+
All of the functionality is packed in an AngularJS module named "rails" so make sure that your modules depend on that module
|
71
|
+
for the dependency injection to work properly.
|
70
72
|
|
71
73
|
There are more examples available in [EXAMPLES.md](EXAMPLES.md).
|
72
74
|
|
75
|
+
### Defining Resources
|
76
|
+
There are multiple ways that you can set up define new resources in your application.
|
77
|
+
|
78
|
+
#### railsResourceFactory
|
79
|
+
Similar to $resource, we provide a <code>railsResourceFactory(config)</code> function that takes a config object with the configuration
|
80
|
+
settings for the new resource. The factory function returns a new class that is extended from RailsResource.
|
73
81
|
|
74
|
-
### Basic Example
|
75
|
-
In order to create a Book resource, we would first define the factory within a module.
|
76
82
|
```javascript
|
77
83
|
angular.module('book.services', ['rails']);
|
78
84
|
angular.module('book.services').factory('Book', ['railsResourceFactory', function (railsResourceFactory) {
|
79
|
-
return railsResourceFactory({
|
85
|
+
return railsResourceFactory({
|
86
|
+
url: '/books',
|
87
|
+
name: 'book'
|
88
|
+
});
|
80
89
|
}]);
|
81
90
|
```
|
82
|
-
|
91
|
+
|
92
|
+
#### RailsResource extension
|
93
|
+
We also expose the RailsResource as base class that you can extend to create your own resource classes. Extending the RailsResource class
|
94
|
+
directly gives you a bit more flexibility to add custom constructor code. There are probably ten different ways to extend the class but
|
95
|
+
the two that we intend to be used are through CoffeeScript or through the same logic that the factory function uses.
|
96
|
+
|
97
|
+
##### CoffeeScript
|
98
|
+
To allow better integration with CoffeeScript, we expose the RailsResource as a base class that can be extended to create
|
99
|
+
resource classes. When extending RailsResource you should use the <code>@configure</code> function to set configuration
|
100
|
+
properties for the resource. You can call <code>@configure</code> multiple times to set additional properties as well.
|
101
|
+
|
102
|
+
````coffeescript
|
103
|
+
class Book extends RailsResource
|
104
|
+
@configure url: '/books', name: 'book'
|
105
|
+
|
106
|
+
class Encyclopedia extends Book
|
107
|
+
@configure url: '/encyclopedias', name: 'encyclopedia'
|
108
|
+
````
|
109
|
+
|
110
|
+
##### JavaScript
|
111
|
+
Since the purpose of exposing the RailsResource was to allow for CoffeeScript users to create classes from it the JavaScript way
|
112
|
+
is basically just the same as the generated CoffeeScript code. The <code>RailsResource.extendTo</code> function is a modification
|
113
|
+
of the <code>__extends</code> function that CoffeeScript generates.
|
114
|
+
|
115
|
+
````javascript
|
116
|
+
function Resource() {
|
117
|
+
Resource.__super__.constructor.apply(this, arguments);
|
118
|
+
}
|
119
|
+
|
120
|
+
RailsResource.extendTo(Resource);
|
121
|
+
Resource.configure(config);
|
122
|
+
````
|
123
|
+
|
124
|
+
### Using Resources
|
83
125
|
```javascript
|
84
126
|
angular.module('book.controllers').controller('BookShelfCtrl', ['$scope', 'Book', function ($scope, Book) {
|
85
127
|
$scope.searching = true;
|
86
128
|
// Find all books matching the title
|
87
|
-
$scope.books = Book.query({
|
88
|
-
|
129
|
+
$scope.books = Book.query({
|
130
|
+
title: title
|
131
|
+
});
|
132
|
+
$scope.books.then(function (results) {
|
89
133
|
$scope.searching = false;
|
90
134
|
}, function (error) {
|
91
135
|
$scope.searching = false;
|
@@ -98,12 +142,17 @@ angular.module('book.controllers').controller('BookShelfCtrl', ['$scope', 'Book'
|
|
98
142
|
});
|
99
143
|
|
100
144
|
// Create a book and save it
|
101
|
-
new Book({
|
145
|
+
new Book({
|
146
|
+
title: 'Gardens of the Moon',
|
147
|
+
author: 'Steven Erikson',
|
148
|
+
isbn: '0-553-81957-7'
|
149
|
+
}).create();
|
102
150
|
}]);
|
103
151
|
```
|
104
152
|
|
105
|
-
###
|
106
|
-
When defining a resource, you can pass a custom [serializer](#serializers) using the <code>serializer</code> configuration option
|
153
|
+
### Custom Serialization
|
154
|
+
When defining a resource, you can pass a custom [serializer](#serializers) using the <code>serializer</code> configuration option to
|
155
|
+
alter the behavior of the object serialization.
|
107
156
|
```javascript
|
108
157
|
Author = railsResourceFactory({
|
109
158
|
url: '/authors',
|
@@ -117,7 +166,7 @@ Author = railsResourceFactory({
|
|
117
166
|
```
|
118
167
|
You can also specify a serializer as a factory and inject it as a dependency.
|
119
168
|
```javascript
|
120
|
-
angular.module('rails').factory('BookSerializer', function(railsSerializer) {
|
169
|
+
angular.module('rails').factory('BookSerializer', function (railsSerializer) {
|
121
170
|
return railsSerializer(function () {
|
122
171
|
this.exclude('publicationDate', 'relatedBooks');
|
123
172
|
this.rename('ISBN', 'isbn');
|
@@ -134,47 +183,14 @@ Book = railsResourceFactory({
|
|
134
183
|
name: 'book',
|
135
184
|
serializer: 'BookSerializer'
|
136
185
|
});
|
137
|
-
|
138
186
|
```
|
139
|
-
## Resource Creation
|
140
|
-
There are multiple ways that you can set up new resources in your application.
|
141
|
-
|
142
|
-
### railsResourceFactory
|
143
|
-
Similar to $resource, we provide a <code>railsResourceFactory(config)</code> function that takes a config object with the configuration
|
144
|
-
settings for the new resource. The factory function returns a new class that is extended from RailsResource.
|
145
|
-
|
146
|
-
### RailsResource extension
|
147
|
-
We also expose the RailsResource as base class that you can extend to create your own resource classes. Extending the RailsResource class
|
148
|
-
directly gives you a bit more flexibility to add custom constructor code. There are probably ten different ways to extend the class but
|
149
|
-
the two that we intend to be used are through CoffeeScript or through the same logic that the factory function uses.
|
150
|
-
|
151
|
-
#### CoffeeScript
|
152
|
-
````coffeescript
|
153
|
-
class Book extends RailsResource
|
154
|
-
@configure url: '/books', name: 'book'
|
155
187
|
|
156
|
-
class Encyclopedia extends Book
|
157
|
-
@configure url: '/encyclopedias', name: 'encyclopedia'
|
158
|
-
````
|
159
|
-
|
160
|
-
#### JavaScript
|
161
|
-
Since the purpose of exposing the RailsResource was to allow for CoffeeScript users to create classes from it the JavaScript way
|
162
|
-
is basically just the same as the generated CoffeeScript code. The <code>RailsResource.extend</code> function is a modification
|
163
|
-
of the <code>__extends</code> function that CoffeeScript generates.
|
164
|
-
|
165
|
-
````javascript
|
166
|
-
function Resource() {
|
167
|
-
Resource.__super__.constructor.apply(this, arguments);
|
168
|
-
}
|
169
|
-
|
170
|
-
RailsResource.extend(Resource);
|
171
|
-
Resource.configure(config);
|
172
|
-
````
|
173
188
|
|
174
189
|
### Config Options
|
175
190
|
|
176
191
|
The following configuration options are available for customizing resources. Each of the configuration options can be passed as part of an object
|
177
|
-
to the <code>railsResourceFactory</code> function or to the resource's <code>configure</code> function.
|
192
|
+
to the <code>railsResourceFactory</code> function or to the resource's <code>configure</code> function. The <code>configure</code> function
|
193
|
+
defined on the resource can be called multiple times to adjust properties as needed.
|
178
194
|
|
179
195
|
* **url** - This is the url of the service. See [Resource URLs](#resource-urls) below for more information.
|
180
196
|
* **rootWrapping** - (Default: true) Turns on/off root wrapping on JSON (de)serialization.
|
@@ -186,8 +202,9 @@ to the <code>railsResourceFactory</code> function or to the resource's <code>con
|
|
186
202
|
* **Accept** - application/json
|
187
203
|
* **Content-Type** - application/json
|
188
204
|
* **defaultParams** *(optional)* - If the resource expects a default set of query params on every call you can specify them here.
|
205
|
+
* **underscoreParams** *(optional)* - Controls whether or not query parameters are converted from camel case to underscore.
|
189
206
|
* **updateMethod** *(optional)* - Allows overriding the default HTTP method (PUT) used for update. Valid values are "post", "put", or "patch".
|
190
|
-
* **serializer** *(optional)* - Allows specifying a custom [serializer](#serializers)
|
207
|
+
* **serializer** *(optional)* - Allows specifying a custom [serializer](#serializers) to configure custom serialization options.
|
191
208
|
* **requestTransformers** *(optional) - See [Transformers / Interceptors](#transformers--interceptors)
|
192
209
|
* **responseInterceptors** *(optional)* - See [Transformers / Interceptors](#transformers--interceptors)
|
193
210
|
* **afterResponseInterceptors** *(optional)* - See [Transformers / Interceptors](#transformers--interceptors)
|
@@ -200,10 +217,11 @@ For example, you should specify "publishingCompany" and "publishingCompanies" in
|
|
200
217
|
The individual resource configuration takes precedence over application-wide default configuration values.
|
201
218
|
Each configuration option listed is exposed as a method on the provider that takes the configuration value as the parameter and returns the provider to allow method chaining.
|
202
219
|
|
203
|
-
* rootWrapping - {function(boolean):
|
204
|
-
* httpConfig - {function(object):
|
205
|
-
* defaultParams - {function(object):
|
206
|
-
*
|
220
|
+
* rootWrapping - {function(boolean):RailsResourceProvider}
|
221
|
+
* httpConfig - {function(object):RailsResourceProvider}
|
222
|
+
* defaultParams - {function(object):RailsResourceProvider}
|
223
|
+
* underscoreParams - {function(boolean):RailsResourceProvider}
|
224
|
+
* updateMethod - {function(boolean):RailsResourceProvider}
|
207
225
|
|
208
226
|
For example, to turn off the root wrapping application-wide and set the update method to PATCH:
|
209
227
|
|
@@ -247,6 +265,10 @@ RailsResources have the following class methods available.
|
|
247
265
|
|
248
266
|
* configure(options) - Change one or more configuration option for a resource.
|
249
267
|
|
268
|
+
* extendTo(child) - Modifies the child to be a subclass of a RailsResource. This can be used to create multiple levels of inheritance. See [RailsResource extension](#RailsResource-extension) for more information
|
269
|
+
|
270
|
+
* include(...module) - Includes a mixin module into the resource. See [Mixins](#mixins) for more information
|
271
|
+
|
250
272
|
* setUrl(url) - Updates the url for the resource, same as calling <code>configure({url: url})</code>
|
251
273
|
|
252
274
|
* $url(context, path) - Returns the resource URL using the given context with the optional path appended if provided.
|
@@ -441,6 +463,119 @@ The resource also exposes a class method <code>afterResponse(fn)</code> that acc
|
|
441
463
|
to the list of after response interceptors for the resource class. Functions added with <code>afterResponse</code> don't need to know anything about promises since they are automatically wrapped
|
442
464
|
as an interceptor.
|
443
465
|
|
466
|
+
## Mixins
|
467
|
+
The ability to add a [Mixin](http://en.wikipedia.org/wiki/Mixin) to a RailsResource is modeled after the example code in
|
468
|
+
in the [Classes](http://arcturo.github.io/library/coffeescript/03_classes.html) chapter of [The Little Book on CoffeeScript](http://arcturo.github.io/library/coffeescript/index.html).
|
469
|
+
|
470
|
+
RailsResource provides two methods:
|
471
|
+
* **extend** - Add class properties / methods to the resource
|
472
|
+
* **include** - Add instance properties / methods to the resource prototype chain
|
473
|
+
|
474
|
+
When you call <code>extend</code> or <code>include</code> the mixin will be added to the resource. If your mixin provides
|
475
|
+
one of the callback methods (<code>extended</code> or <code>included</code>) then those methods will be called when the mixin
|
476
|
+
is added. One additional change from the normal mixin behavior is that your mixins can implement an additional <code>configure</code>
|
477
|
+
function that will be called whenever the resource's <code>configure</code> function is called. That way the mixin can provide
|
478
|
+
additional configuration options.
|
479
|
+
|
480
|
+
## Extensions
|
481
|
+
Extensions are provided [mixins](#mixins) that follow specific naming pattern to make it easier to include them by a shortened name.
|
482
|
+
|
483
|
+
The available extension names are:
|
484
|
+
* [snapshots](#snapshots) - RailsResourceSnapshotsMixin
|
485
|
+
|
486
|
+
To include an extension, you have to first include the extension in your project.
|
487
|
+
You then need to add the extension to the in one of the following ways to RailsResource:
|
488
|
+
|
489
|
+
### Application-wide Resource Extensions
|
490
|
+
<code>RailsResourceProvider.extensions</code> - adds the extension to all RailsResources within the application.
|
491
|
+
````javascript
|
492
|
+
app.config(function (RailsResourceProvider) {
|
493
|
+
RailsResourceProvider.extensions('snapshots');
|
494
|
+
});
|
495
|
+
````
|
496
|
+
|
497
|
+
### Per-Resource Extensions
|
498
|
+
#### Configuration Option
|
499
|
+
The <code>extensions</code> configuration option adds the extension to a single RailsResource
|
500
|
+
|
501
|
+
##### JavaScript
|
502
|
+
````javascript
|
503
|
+
Book = railsResourceFactory({
|
504
|
+
url: '/books',
|
505
|
+
name: 'book',
|
506
|
+
extensions: ['snapshots']
|
507
|
+
});
|
508
|
+
````
|
509
|
+
##### CoffeeScript
|
510
|
+
````coffeescript
|
511
|
+
class Book extends RailsResource
|
512
|
+
@configure url: '/books', name: 'book', extensions: ['snapshots']
|
513
|
+
````
|
514
|
+
|
515
|
+
#### RailsResource.extend
|
516
|
+
RailsResource.extend - explicitly include the extension as a module
|
517
|
+
|
518
|
+
##### JavaScript
|
519
|
+
````javascript
|
520
|
+
Book = railsResourceFactory({ url: '/books', name: 'book' });
|
521
|
+
// by name
|
522
|
+
Book.extend('RailsResourceSnapshotsMixin');
|
523
|
+
// or by injected reference
|
524
|
+
Book.extend(RailsResourceSnapshotsMixin);
|
525
|
+
````
|
526
|
+
|
527
|
+
##### CoffeeScript
|
528
|
+
|
529
|
+
````coffeescript
|
530
|
+
class Book extends RailsResource
|
531
|
+
@configure url: '/books', name: 'book'
|
532
|
+
@extend 'RailsResourceSnapshotsMixin'
|
533
|
+
````
|
534
|
+
|
535
|
+
### Snapshots
|
536
|
+
Snapshots allow you to save off the state of the resource at a specific point in time and if need be roll back to one of the
|
537
|
+
saved snapshots and yes, you can create as many snapshots as you want.
|
538
|
+
|
539
|
+
Snapshots serialize the resource instance and save off a copy of the serialized data in the <code>$snapshots</code> array on the instance.
|
540
|
+
If you use a custom serialization options to control what is sent to the server you may want to consider whether or not you want to use
|
541
|
+
different serialization options. If so, you can specify an specific serializer for snapshots using the <code>snapshotSerializer</code> configuration
|
542
|
+
option.
|
543
|
+
|
544
|
+
Calling <code>save</code>, <code>create</code>, <code>update</code>, or <code>delete</code>/<code>remove</code> on a resource instance
|
545
|
+
will remove all snapshots when the operation completes successfully.
|
546
|
+
|
547
|
+
#### Configuration Options
|
548
|
+
* **snapshotSerializer** *(optional)* - Allows specifying a custom [serializer](#serializers) to configure custom serialization options specific to [snapshot and rollback](#snapshots).
|
549
|
+
|
550
|
+
|
551
|
+
#### Creating Snapshots
|
552
|
+
Creating a snapshot is easy, just call the <code>snapshot</code> function. You can pass an optional callback function to <code>snapshot</code> to perform
|
553
|
+
additional custom operations after the rollback is complete. The callback function is specific to each snapshot version created so make sure you pass it every
|
554
|
+
time if it's a callback you always want called.
|
555
|
+
|
556
|
+
#### Rolling back
|
557
|
+
So you want to undo changes to the resource? There are two methods you can use to roll back the resource to a previous snapshot version <code>rollback</code>
|
558
|
+
and <code>rollbackTo</code>. Each method will:
|
559
|
+
* Deserialize the snapshot data and update the resource instance with the new data.
|
560
|
+
* Remove all snapshots newer than the version being rolled back to.
|
561
|
+
* Call the rollback callback if it was specified on the <code>snapshot</code> in the context of the resource instance.
|
562
|
+
|
563
|
+
##### rollback
|
564
|
+
<code>rollback(numVersions)</code> allows you to roll back the resource. If you do not specify <code>numVersions</code> then a resource is rolled back to the last
|
565
|
+
snapshot version. <code>numVersions</code> can be used to roll back further than the last snapshot version based on the following rules:
|
566
|
+
|
567
|
+
* When <code>numVersions</code> is undefined or 0 then a single version is rolled back.
|
568
|
+
* When <code>numVersions</code> exceeds the stored number of snapshots then the resource is rolled back to the first snapshot version.
|
569
|
+
* When <code>numVersions</code> is less than 0 then the resource is rolled back to the first snapshot version.
|
570
|
+
* Otherwise, <code>numVersions</code> represents the nth version from the last snapshot version (similar to calling rollback <code>numVersions</code> times).
|
571
|
+
|
572
|
+
##### rollbackTo
|
573
|
+
<code>rollbackTo(snapshotVersion)</code> allows you to roll back the resource to a specific snapshot version.
|
574
|
+
|
575
|
+
* When <code>snapshotVersion</code> is greater than the number of versions then the last snapshot version will be used.
|
576
|
+
* When <code>snapshotVersion</code> is less than 0 then the resource will be rolled back to the first version.
|
577
|
+
* Otherwise, the resource will be rolled back to the specific version specified.
|
578
|
+
|
444
579
|
## Tests
|
445
580
|
The tests are written using [Jasmine](http://pivotal.github.com/jasmine/) and are run using [Karma](https://github.com/karma-runner/karma).
|
446
581
|
|