praxis 0.13.0 → 0.14.0
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.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +15 -2
- data/CHANGELOG.md +54 -1
- data/bin/praxis +49 -2
- data/lib/api_browser/Gruntfile.js +247 -90
- data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +19 -0
- data/lib/api_browser/app/bower_components/angular-mocks/README.md +57 -0
- data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +2193 -0
- data/lib/api_browser/app/bower_components/angular-mocks/bower.json +9 -0
- data/lib/api_browser/app/bower_components/angular-mocks/package.json +27 -0
- data/lib/api_browser/app/bower_components/angular/.bower.json +6 -5
- data/lib/api_browser/app/bower_components/angular/README.md +23 -4
- data/lib/api_browser/app/bower_components/angular/angular-csp.css +6 -0
- data/lib/api_browser/app/bower_components/angular/angular.js +2287 -1597
- data/lib/api_browser/app/bower_components/angular/angular.min.js +212 -205
- data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
- data/lib/api_browser/app/bower_components/angular/angular.min.js.map +3 -3
- data/lib/api_browser/app/bower_components/angular/bower.json +2 -1
- data/lib/api_browser/app/bower_components/angular/package.json +25 -0
- data/lib/api_browser/app/bower_components/showdown/.bower.json +39 -0
- data/lib/api_browser/app/bower_components/showdown/.jshintignore +2 -0
- data/lib/api_browser/app/bower_components/showdown/.travis.yml +8 -0
- data/lib/api_browser/app/bower_components/showdown/Gruntfile.js +100 -0
- data/lib/api_browser/app/bower_components/showdown/README.md +317 -0
- data/lib/api_browser/app/bower_components/showdown/bower.json +26 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.js +1606 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/github.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/github.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/prettify.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/prettify.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/table.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/table.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/twitter.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/twitter.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/license.txt +34 -0
- data/lib/api_browser/app/bower_components/showdown/package.json +47 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/github.js +25 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/prettify.js +29 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/table.js +106 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/twitter.js +42 -0
- data/lib/api_browser/app/bower_components/showdown/src/ng-showdown.js +150 -0
- data/lib/api_browser/app/bower_components/showdown/src/showdown.js +1454 -0
- data/lib/api_browser/app/index.html +6 -4
- data/lib/api_browser/app/js/app.js +1 -2
- data/lib/api_browser/app/js/controllers/action.js +4 -4
- data/lib/api_browser/app/js/controllers/controller.js +1 -1
- data/lib/api_browser/app/js/controllers/menu.js +5 -3
- data/lib/api_browser/app/js/controllers/type.js +5 -5
- data/lib/api_browser/app/js/directives/attribute_description.js +5 -5
- data/lib/api_browser/app/js/directives/attribute_table.js +1 -1
- data/lib/api_browser/app/js/directives/attribute_table_row.js +2 -2
- data/lib/api_browser/app/js/directives/no_container.js +1 -1
- data/lib/api_browser/app/js/directives/request_body.js +5 -5
- data/lib/api_browser/app/js/directives/request_headers.js +3 -6
- data/lib/api_browser/app/js/directives/request_parameters.js +3 -6
- data/lib/api_browser/app/js/directives/type_label.js +4 -5
- data/lib/api_browser/app/js/factories/Documentation.js +4 -4
- data/lib/api_browser/app/js/factories/PayloadTemplates.js +2 -2
- data/lib/api_browser/app/js/factories/TypeTemplates.js +3 -3
- data/lib/api_browser/app/js/filters/markdown.js +6 -0
- data/lib/api_browser/app/js/filters/resource_name.js +2 -2
- data/lib/api_browser/app/sass/modules/_header.scss +2 -7
- data/lib/api_browser/app/sass/{main.scss → praxis.scss} +0 -0
- data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +370 -367
- data/lib/api_browser/app/views/action.html +2 -2
- data/lib/api_browser/app/views/controller.html +2 -2
- data/lib/api_browser/app/views/directives/attribute_description.html +1 -1
- data/lib/api_browser/app/views/layout.html +2 -11
- data/lib/api_browser/app/views/navbar.html +9 -0
- data/lib/api_browser/app/views/resource/_actions.html +1 -1
- data/lib/api_browser/app/views/type.html +2 -2
- data/lib/api_browser/app/views/type/_details.html +2 -1
- data/lib/api_browser/bower.json +5 -0
- data/lib/api_browser/package.json +18 -7
- data/lib/praxis.rb +8 -3
- data/lib/praxis/action_definition.rb +28 -6
- data/lib/praxis/api_definition.rb +30 -2
- data/lib/praxis/api_general_info.rb +36 -0
- data/lib/praxis/bootloader.rb +1 -0
- data/lib/praxis/collection.rb +34 -0
- data/lib/praxis/controller.rb +7 -0
- data/lib/praxis/dispatcher.rb +3 -0
- data/lib/praxis/links.rb +2 -8
- data/lib/praxis/media_type.rb +6 -24
- data/lib/praxis/media_type_collection.rb +6 -2
- data/lib/praxis/plugin_concern.rb +2 -1
- data/lib/praxis/request.rb +24 -15
- data/lib/praxis/request_stages/request_stage.rb +19 -4
- data/lib/praxis/request_stages/validate_params_and_headers.rb +1 -1
- data/lib/praxis/request_stages/validate_payload.rb +1 -1
- data/lib/praxis/resource_definition.rb +45 -10
- data/lib/praxis/response_definition.rb +46 -27
- data/lib/praxis/restful_doc_generator.rb +94 -7
- data/lib/praxis/simple_media_type.rb +2 -9
- data/lib/praxis/stage.rb +1 -4
- data/lib/praxis/tasks/api_docs.rb +51 -19
- data/lib/praxis/tasks/routes.rb +19 -15
- data/lib/praxis/types/media_type_common.rb +31 -0
- data/lib/praxis/types/multipart.rb +4 -4
- data/lib/praxis/version.rb +1 -1
- data/praxis.gemspec +2 -2
- data/spec/api_browser/factories/documentation_spec.js +50 -0
- data/spec/api_browser/filters/attribute_name_spec.js +23 -0
- data/spec/functional_spec.rb +62 -10
- data/spec/praxis/action_definition_spec.rb +12 -4
- data/spec/praxis/api_definition_spec.rb +159 -0
- data/spec/praxis/api_general_info_spec.rb +36 -0
- data/spec/praxis/bootloader_spec.rb +10 -1
- data/spec/praxis/media_type_collection_spec.rb +46 -53
- data/spec/praxis/media_type_spec.rb +6 -6
- data/spec/praxis/request_stage_spec.rb +7 -2
- data/spec/praxis/request_stages_validate_spec.rb +12 -7
- data/spec/praxis/resource_definition_spec.rb +62 -0
- data/spec/praxis/response_definition_spec.rb +26 -16
- data/spec/praxis/stage_spec.rb +4 -8
- data/spec/praxis/types/collection_spec.rb +144 -0
- data/spec/spec_app/app/controllers/instances.rb +8 -2
- data/spec/spec_app/design/api.rb +11 -0
- data/spec/spec_app/design/media_types/instance.rb +12 -0
- data/spec/spec_app/design/media_types/volume.rb +9 -2
- data/spec/spec_app/design/media_types/volume_snapshot.rb +9 -6
- data/spec/spec_app/design/resources/instances.rb +25 -10
- data/spec/support/spec_media_types.rb +1 -1
- data/spec/support/spec_resource_definitions.rb +2 -0
- data/tasks/thor/app.rb +15 -10
- data/tasks/thor/example.rb +115 -115
- data/tasks/thor/templates/generator/empty_app/.gitignore +2 -0
- data/tasks/thor/templates/generator/empty_app/docs/app.js +1 -0
- data/tasks/thor/templates/generator/empty_app/docs/styles.scss +3 -0
- metadata +50 -9
- data/lib/api_browser/app/css/main.css +0 -4511
- data/lib/praxis/types/collection.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 969f34805663e8986a5ac60e86216c3139324d98
|
4
|
+
data.tar.gz: 8fb76988854889627663ff66874ecb1a8f4549b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 228bc86fd20fef3ad70b282519266378b6f90333e36438923b5a5ed8c416ccacf7d5ac4444bab3d675a2bdd210a3cb89a62090d3ce780d2a5c62cc9c848216d1
|
7
|
+
data.tar.gz: b355e2bd55fe51389ba695d8348303560208d960694f8832d74ebf59942b3e9088cf757c48ae37109b975d6dac238815f15528457c32655c2baa3c3c9b7cf290
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.5
|
data/.travis.yml
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
language: ruby
|
2
2
|
cache: bundler
|
3
3
|
rvm:
|
4
|
-
- "2.1.
|
5
|
-
|
4
|
+
- "2.1.5"
|
5
|
+
node_js:
|
6
|
+
- "0.10"
|
7
|
+
branches:
|
8
|
+
only:
|
9
|
+
- master
|
10
|
+
before_install:
|
11
|
+
- cd lib/api_browser
|
12
|
+
- npm install
|
13
|
+
- cd ../..
|
14
|
+
script:
|
15
|
+
- bundle exec rspec spec
|
16
|
+
- cd lib/api_browser
|
17
|
+
- npm test
|
18
|
+
- cd ../..
|
data/CHANGELOG.md
CHANGED
@@ -2,8 +2,60 @@
|
|
2
2
|
|
3
3
|
## next
|
4
4
|
|
5
|
-
## 0.
|
5
|
+
## 0.14.0
|
6
|
+
|
7
|
+
* Adds features for customizing and exporting the Doc browser, namely the following changes:
|
8
|
+
1. All doc browser stuff is now centralised under the `praxis:docs` namespace.
|
9
|
+
2. The doc browser requires node.js. (TODO: add this to the docs PR)
|
10
|
+
3. `rake praxis:docs:generate` generates the JSON schema files. `rake praxis:api_docs` is now an alias of this with the idea that `rake praxis:api_docs` will be deprecated.
|
11
|
+
4. `rake praxis:docs:preview` will open a browser window with the doc browser. It will refresh automatically when the design files change as well as when any customisations change.
|
12
|
+
5. `rake praxis:docs:build` will generate a fully built static version of the app in `docs/output`. This can then be put on S3 or GH pages and should work.
|
13
|
+
6. The default app generator will now generate a docs directory with some files to get you started.
|
14
|
+
7. Any `.js` file in the `docs` directory will be included in the doc browser. Angular's dependency injection allows users to override any service or controller as needed.
|
15
|
+
8. The default `docs/styles.scss` simply `@import 'praxis'`. However this means the user can override any of bootstraps variables allowing for easy theme customisation. Rules etc. can now also be overridden.
|
16
|
+
9. Any templates defined in `docs/views` take precedence over those defined in the doc browser. This means the user can easily customise parts of the app, while leaving the rest up to us.
|
17
|
+
10. Any changes to the above customisations will be automatically reloaded on save.
|
18
|
+
* First pass at describing (and doc-generating) API global information
|
19
|
+
* Inside a `Praxis::ApiDefinition.define` block one can now specify a few things about the API by using:
|
20
|
+
* info("1.0") `<block>` - Which will apply to a particular version only
|
21
|
+
* info `<block>` - Which will be inherited by any existing API version
|
22
|
+
* The current pieces of information that can be defined in the block are: `name`, `title`, `description` and `basepath`. See [this](https://github.com/rightscale/praxis/blob/master/spec/spec_app/design/api.rb) for details
|
23
|
+
* NOTE: This information is output to the JSON files, BUT not used in the doc browser yet.
|
24
|
+
* Changed the doc generation and browser to use "ids" instead of "names" for routes and generated files.
|
25
|
+
* Currently, "ids" are generated using dashes instead of double colons (instead of random ids). This closes issue #31.
|
26
|
+
* Added the definition and handling of canonical urls for API resources
|
27
|
+
* One can now specify which action URL should be considered as the canonical resource href:
|
28
|
+
* by using `canonical_path <action_name>` at the top of the resource definition class
|
29
|
+
* See the [instances](https://github.com/rightscale/praxis/blob/master/spec/spec_app/design/resources/instances.rb) resource definition for an example.
|
30
|
+
* With a canonical href defined, one can then both generate and parse them by using:
|
31
|
+
* `.to_href(<named arguments hash>) => <href String>`
|
32
|
+
* `.parse_href( <href String> ) => < named arguments hash >`. Note: The returned arguments are properly typed-coerced.
|
33
|
+
* These helpers can be accessed from:
|
34
|
+
* the `definition` object in the controller instance (i.e., `self.definition.to_href(id: 1). )
|
35
|
+
* or through the class-level methods in the resource definition (i.e. `MyApiResource.parse_href("/my_resource/1")` )
|
36
|
+
* Hooked up rake tasks into the `praxis` binary for convenience. In particular
|
37
|
+
* praxis routes [json]
|
38
|
+
* praxis docs [browser]
|
39
|
+
* praxis console
|
40
|
+
* Added `MediaTypeCommon` module, which contains the `identifier`, `description`, and `describe` methods formerly found in `MediaType`. This is now the module used for checking whether a given class should be included in generated documentation, or is valid for use in a `ResponseDefinition`
|
41
|
+
* Improved `Praxis::Collection.of` when used with MediaTypes
|
42
|
+
* It will now define an inner `<media_type>::Collection` type that is an `Attributor::Collection` of the MediaType that also will include the `MediaTypeCommon` module.
|
43
|
+
* By default, Praxis will take the identifier of the parent `MediaType` and append a `collection=true` suffix to it.
|
44
|
+
* Fixed `ResponseDefinition` Content-Type validation to properly handle parameters (i.e., "application/json;collection=true").
|
45
|
+
* Note: For "index" type actions, this now means Praxis will properly validate any 'collection=true' parameter specified in the `ResponseDefintion` and set by the controller.
|
46
|
+
* Deprecated `MediaTypeCollection`. Please define separate classes and attributes for "collection" and "summary" uses.
|
47
|
+
* Improved code for stages
|
48
|
+
* `setup!` is no longer called within the `run` default code of a stage
|
49
|
+
* removed unnecessary raise error when substages are empty (while not common it can be possible, and totally valid)
|
50
|
+
* Add `Response` to supported classes in `PluginConcern`
|
51
|
+
* Fix doc generation to use `ids` for top-level types (rather than names) so they are correctly linkable.
|
52
|
+
* Doc Browser: Added support for Markdown rendering of descriptions (for resources, media_types, attributes, etc...)
|
53
|
+
* Added test framework for the doc browser. Run the tests with `grunt test` from lib/api_browser.
|
54
|
+
* Enhanced the `praxis:docs:preview` rake task with an optional port parameter
|
55
|
+
* Fixed praxis:routes rake task to support actions that do not have routes defined
|
56
|
+
* Added `:source` to `ActionDefinition` parameter descriptions with the value of either 'url' or 'query' to denote where the parameter is (typically) extracted from. Note: not currently shown in doc browser.
|
6
57
|
|
58
|
+
## 0.13.0
|
7
59
|
* Added `nodoc!` method to `ActionDefinition`, `ResourceDefinition` to hide actions and resources from the generated documentation.
|
8
60
|
* Default HTTP responses:
|
9
61
|
* Added descriptions
|
@@ -24,6 +76,7 @@
|
|
24
76
|
* This is not compatible if it also wants to use the `links` DSL.
|
25
77
|
|
26
78
|
|
79
|
+
|
27
80
|
## 0.11.2
|
28
81
|
|
29
82
|
* The Doc Browser will now not change the menu when refreshing.
|
data/bin/praxis
CHANGED
@@ -2,12 +2,59 @@
|
|
2
2
|
|
3
3
|
require 'bundler'
|
4
4
|
|
5
|
+
Bundler.setup :default, :test
|
6
|
+
Bundler.require :default, :test
|
7
|
+
|
8
|
+
|
9
|
+
if ["routes","docs","console"].include? ARGV[0]
|
10
|
+
require 'rake'
|
11
|
+
require 'praxis'
|
12
|
+
require 'praxis/tasks'
|
13
|
+
|
14
|
+
case ARGV[0]
|
15
|
+
when "routes"
|
16
|
+
Rake::Task['praxis:routes'].invoke(ARGV[1])
|
17
|
+
when "docs"
|
18
|
+
task_name = case ARGV[1]
|
19
|
+
when nil,'browser'
|
20
|
+
'praxis:docs:preview'
|
21
|
+
when 'generate'
|
22
|
+
'praxis:docs:generate'
|
23
|
+
when 'package'
|
24
|
+
'praxis:docs:build'
|
25
|
+
end
|
26
|
+
# task_name = ARGV[1] == 'browser' ? 'praxis:doc_browser' : 'praxis:api_docs'
|
27
|
+
Rake::Task[task_name].invoke
|
28
|
+
when "console"
|
29
|
+
Rake::Task['praxis:console'].invoke
|
30
|
+
end
|
31
|
+
exit 0
|
32
|
+
end
|
33
|
+
# Thor tasks
|
5
34
|
path_to_praxis = File.expand_path(File.dirname(File.dirname(__FILE__)))
|
6
35
|
path_to_loader = '%s/tasks/loader.thor' % path_to_praxis
|
7
36
|
|
8
37
|
load path_to_loader
|
9
38
|
|
10
39
|
class PraxisGenerator < Thor
|
40
|
+
|
41
|
+
# Include a few fake thor action descriptions (for the rake tasks above) so they can show up in the same usage messages
|
42
|
+
desc "routes [json]", "Prints the route table of the application. Defaults to table format, but can produce json"
|
43
|
+
def routes
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "docs [generate|browser|package]", <<-EOF
|
47
|
+
Generates API documentation and a Web App to inspect it
|
48
|
+
generate - Generates the JSON docs
|
49
|
+
browser - (default) Generates JSON docs, and automatically starts a Web app to browse them.
|
50
|
+
package - Generates JSON docs, and neatly packages all the necessary static files ready for exporting the browsing app.
|
51
|
+
EOF
|
52
|
+
def docs
|
53
|
+
end
|
54
|
+
|
55
|
+
desc "console", "Open a console to the application, with its environment loaded"
|
56
|
+
def console
|
57
|
+
end
|
11
58
|
|
12
59
|
# Simple helper to go get the existing description for the real action
|
13
60
|
# Usage must still be provided rather than retrieved (since it is not a
|
@@ -33,7 +80,7 @@ class PraxisGenerator < Thor
|
|
33
80
|
def generate(app_name)
|
34
81
|
warn "This is a deprecated method.\nTo generate a hello world example, please use:\n praxis example #{app_name} "
|
35
82
|
end
|
83
|
+
|
36
84
|
end
|
37
|
-
|
38
|
-
|
85
|
+
|
39
86
|
PraxisGenerator.start(ARGV)
|
@@ -3,13 +3,24 @@ module.exports = function(grunt) {
|
|
3
3
|
require('load-grunt-tasks')(grunt);
|
4
4
|
|
5
5
|
// Time how long tasks take. Can help when optimizing build times
|
6
|
-
|
6
|
+
try {
|
7
|
+
require('time-grunt')(grunt);
|
8
|
+
} catch(e) {
|
9
|
+
|
10
|
+
}
|
11
|
+
|
12
|
+
var userDocsPath = process.env.USER_DOCS_PATH,
|
13
|
+
buildPath = userDocsPath + '/output',
|
14
|
+
browserPort = process.env.DOC_PORT || '9090';
|
15
|
+
|
16
|
+
var cssOutput = {};
|
17
|
+
cssOutput[buildPath + '/css/main.css'] = userDocsPath + '/styles.scss';
|
7
18
|
|
8
19
|
grunt.initConfig({
|
9
20
|
// web server for development
|
10
21
|
connect: {
|
11
22
|
options: {
|
12
|
-
port:
|
23
|
+
port: browserPort,
|
13
24
|
hostname: '0.0.0.0'
|
14
25
|
},
|
15
26
|
livereload: {
|
@@ -17,6 +28,7 @@ module.exports = function(grunt) {
|
|
17
28
|
livereload: 9091,
|
18
29
|
open: true,
|
19
30
|
base: [
|
31
|
+
userDocsPath,
|
20
32
|
'.tmp',
|
21
33
|
'.data',
|
22
34
|
'app'
|
@@ -25,77 +37,38 @@ module.exports = function(grunt) {
|
|
25
37
|
},
|
26
38
|
dist: {
|
27
39
|
options: {
|
28
|
-
base: ['.data',
|
40
|
+
base: ['.data', buildPath]
|
29
41
|
}
|
30
42
|
}
|
31
43
|
},
|
32
44
|
|
33
45
|
clean: {
|
34
|
-
|
46
|
+
serve: {
|
35
47
|
files: [{
|
36
48
|
dot: true,
|
37
49
|
src: [
|
38
|
-
'.tmp'
|
39
|
-
'dist/*',
|
40
|
-
'!dist/.git*'
|
50
|
+
'.tmp'
|
41
51
|
]
|
42
52
|
}]
|
43
|
-
}
|
44
|
-
},
|
45
|
-
|
46
|
-
// Watches files for changes
|
47
|
-
watch: {
|
48
|
-
// Reload stuff when the grunt file changes
|
49
|
-
config: {
|
50
|
-
files: ['Gruntfile.js'],
|
51
|
-
tasks: 'prep',
|
52
|
-
options: {
|
53
|
-
reload: true
|
54
|
-
}
|
55
|
-
},
|
56
|
-
|
57
|
-
// Updates index.html for any file added or removed
|
58
|
-
scripts: {
|
59
|
-
files: ['app/js/**/*.js'],
|
60
|
-
tasks: 'fileblocks:scripts',
|
61
|
-
options: { livereload: 9091 }
|
62
|
-
},
|
63
|
-
|
64
|
-
// Updates index.html for any bower component added or removed
|
65
|
-
bowerComponents: {
|
66
|
-
files: ['app/bower_components/**/*'],
|
67
|
-
tasks: 'wiredep',
|
68
|
-
options: { livereload: 9091 }
|
69
53
|
},
|
70
|
-
|
71
|
-
// Rebuild the stylesheets for any SASS file changed
|
72
|
-
sass: {
|
73
|
-
files: [
|
74
|
-
'app/sass/**/*.scss',
|
75
|
-
'app/bower_components/**/*.scss'
|
76
|
-
],
|
77
|
-
tasks: 'sass',
|
78
|
-
options: { livereload: 9091 }
|
79
|
-
},
|
80
|
-
|
81
|
-
// Watches files that don't need processing
|
82
|
-
other: {
|
83
|
-
files: [
|
84
|
-
'app/css/*.css',
|
85
|
-
"app/index.html",
|
86
|
-
"app/views/**/*.html"
|
87
|
-
],
|
54
|
+
dist: {
|
88
55
|
options: {
|
89
|
-
|
90
|
-
}
|
56
|
+
force: true,
|
57
|
+
},
|
58
|
+
files: [{
|
59
|
+
dot: true,
|
60
|
+
src: [
|
61
|
+
'.tmp',
|
62
|
+
buildPath
|
63
|
+
]
|
64
|
+
}]
|
91
65
|
}
|
92
66
|
},
|
93
|
-
|
94
67
|
// Automatically inject Bower components into the app
|
95
68
|
wiredep: {
|
96
69
|
app: {
|
97
|
-
src: '
|
98
|
-
ignorePath:
|
70
|
+
src: '.tmp/index.html',
|
71
|
+
ignorePath: /(..\/)?app\//,
|
99
72
|
// We do not use bootstrap's JS code, also the SASS styles are included by our style sheet
|
100
73
|
exclude: [/bootstrap-sass/]
|
101
74
|
}
|
@@ -104,13 +77,34 @@ module.exports = function(grunt) {
|
|
104
77
|
// Automatically inject the JS files into the app
|
105
78
|
fileblocks: {
|
106
79
|
options: { removeFiles: true },
|
107
|
-
|
80
|
+
dist: {
|
81
|
+
src: 'app/index.html',
|
82
|
+
dest: '.tmp/index.html',
|
83
|
+
blocks: {
|
84
|
+
scripts: {
|
85
|
+
cwd: 'app',
|
86
|
+
// This ensures app.js comes first so the angular module is declared
|
87
|
+
src: ['js/app.js', 'js/**/*.js']
|
88
|
+
},
|
89
|
+
userscripts: {
|
90
|
+
// cwd: userDocsPath,
|
91
|
+
src: [userDocsPath + '/app.js', userDocsPath + '/**/*.js', '!' + userDocsPath + '/output/**/*.js']
|
92
|
+
}
|
93
|
+
}
|
94
|
+
},
|
95
|
+
|
96
|
+
serve: {
|
108
97
|
src: 'app/index.html',
|
98
|
+
dest: '.tmp/index.html',
|
109
99
|
blocks: {
|
110
100
|
scripts: {
|
111
101
|
cwd: 'app',
|
112
102
|
// This ensures app.js comes first so the angular module is declared
|
113
103
|
src: ['js/app.js', 'js/**/*.js']
|
104
|
+
},
|
105
|
+
userscripts: {
|
106
|
+
cwd: userDocsPath,
|
107
|
+
src: ['app.js', '**/*.js', '!output/**/*.js']
|
114
108
|
}
|
115
109
|
}
|
116
110
|
}
|
@@ -121,29 +115,28 @@ module.exports = function(grunt) {
|
|
121
115
|
server: {
|
122
116
|
options: {
|
123
117
|
sourceComments: 'map',
|
124
|
-
sourceMap: '
|
118
|
+
sourceMap: __dirname + '/.tmp/css/main.css.map',
|
119
|
+
includePaths: ['app/sass']
|
125
120
|
},
|
126
121
|
files: {
|
127
|
-
'
|
122
|
+
'.tmp/css/main.css': userDocsPath + '/styles.scss'
|
128
123
|
}
|
129
124
|
},
|
130
125
|
dist: {
|
131
126
|
options: {
|
132
|
-
sourceComments: 'none'
|
127
|
+
sourceComments: 'none',
|
128
|
+
includePaths: ['app/sass']
|
133
129
|
},
|
134
|
-
files:
|
135
|
-
'dist/css/main.css': 'app/sass/main.scss'
|
136
|
-
}
|
130
|
+
files: cssOutput
|
137
131
|
}
|
138
132
|
},
|
139
133
|
|
140
134
|
cssmin: {
|
141
135
|
dist: {
|
142
|
-
files: {
|
143
|
-
'
|
144
|
-
|
145
|
-
|
146
|
-
}
|
136
|
+
files: [{
|
137
|
+
src: buildPath + '/css/main.css',
|
138
|
+
dest: buildPath + '/css/main.css'
|
139
|
+
}]
|
147
140
|
}
|
148
141
|
},
|
149
142
|
|
@@ -152,7 +145,7 @@ module.exports = function(grunt) {
|
|
152
145
|
files: [{
|
153
146
|
expand: true,
|
154
147
|
cwd: '.tmp/concat/scripts',
|
155
|
-
src: '
|
148
|
+
src: '*.js',
|
156
149
|
dest: '.tmp/concat/scripts'
|
157
150
|
}]
|
158
151
|
}
|
@@ -161,8 +154,8 @@ module.exports = function(grunt) {
|
|
161
154
|
filerev: {
|
162
155
|
dist: {
|
163
156
|
src: [
|
164
|
-
'
|
165
|
-
'
|
157
|
+
buildPath + '/scripts/*.js',
|
158
|
+
buildPath + '/css/*.css'
|
166
159
|
]
|
167
160
|
}
|
168
161
|
},
|
@@ -179,16 +172,27 @@ module.exports = function(grunt) {
|
|
179
172
|
removeScriptTypeAttributes: true,
|
180
173
|
removeStyleLinkTypeAttributes: true
|
181
174
|
},
|
182
|
-
module: 'docBrowser',
|
183
175
|
bootstrap: function(module, script) {
|
184
176
|
return 'angular.module("' + module + '").run(function($templateCache){' + script + '});';
|
185
177
|
},
|
186
|
-
usemin: 'dist/scripts/scripts.js'
|
187
178
|
},
|
188
179
|
dist: {
|
189
180
|
cwd: 'app',
|
190
181
|
src: 'views/**/*.html',
|
191
|
-
dest: '.tmp/templates.js'
|
182
|
+
dest: '.tmp/templates.js',
|
183
|
+
options: {
|
184
|
+
usemin: buildPath + '/scripts/praxis.js',
|
185
|
+
module: 'PraxisDocBrowser',
|
186
|
+
}
|
187
|
+
},
|
188
|
+
userScripts: {
|
189
|
+
cwd: userDocsPath,
|
190
|
+
src: 'views/**/*.html',
|
191
|
+
dest: '.tmp/usertemplates.js',
|
192
|
+
options: {
|
193
|
+
usemin: buildPath + '/scripts/docs.js',
|
194
|
+
module: 'DocBrowser',
|
195
|
+
}
|
192
196
|
}
|
193
197
|
},
|
194
198
|
|
@@ -198,10 +202,25 @@ module.exports = function(grunt) {
|
|
198
202
|
expand: true,
|
199
203
|
dot: true,
|
200
204
|
cwd: 'app',
|
201
|
-
dest:
|
205
|
+
dest: buildPath,
|
206
|
+
src: [
|
207
|
+
'*.{ico,png,txt}'
|
208
|
+
]
|
209
|
+
}, {
|
210
|
+
expand: true,
|
211
|
+
dot: true,
|
212
|
+
cwd: '.tmp',
|
213
|
+
dest: buildPath,
|
202
214
|
src: [
|
203
|
-
'
|
204
|
-
|
215
|
+
'index.html'
|
216
|
+
]
|
217
|
+
}, {
|
218
|
+
expand: true,
|
219
|
+
dot: true,
|
220
|
+
cwd: userDocsPath,
|
221
|
+
dest: buildPath,
|
222
|
+
src: [
|
223
|
+
'api/**'
|
205
224
|
]
|
206
225
|
}]
|
207
226
|
}
|
@@ -211,36 +230,146 @@ module.exports = function(grunt) {
|
|
211
230
|
// concat, minify and revision files. Creates configurations in memory so
|
212
231
|
// additional tasks can operate on them
|
213
232
|
useminPrepare: {
|
214
|
-
html: '
|
233
|
+
html: '.tmp/index.html',
|
215
234
|
options: {
|
216
|
-
dest:
|
235
|
+
dest: buildPath
|
217
236
|
}
|
218
237
|
},
|
219
238
|
|
220
239
|
// Performs rewrites based on rev and the useminPrepare configuration
|
221
240
|
usemin: {
|
222
|
-
html: ['
|
223
|
-
css: ['
|
241
|
+
html: [buildPath + '/index.html'],
|
242
|
+
css: [buildPath + '/css/{,*/}*.css'],
|
243
|
+
options: {
|
244
|
+
assetsDirs: [buildPath]
|
245
|
+
}
|
246
|
+
},
|
247
|
+
|
248
|
+
karma: {
|
224
249
|
options: {
|
225
|
-
|
250
|
+
files: [
|
251
|
+
'node_modules/quick_check/dist/jasmine-quick-check.js',
|
252
|
+
'app/bower_components/jquery/dist/jquery.js',
|
253
|
+
'app/bower_components/angular/angular.js',
|
254
|
+
'app/bower_components/lodash/dist/lodash.compat.js',
|
255
|
+
'app/bower_components/angular-ui-router/release/angular-ui-router.js',
|
256
|
+
'app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js',
|
257
|
+
'app/bower_components/angular-sanitize/angular-sanitize.js',
|
258
|
+
'app/bower_components/angular-mocks/angular-mocks.js',
|
259
|
+
'app/js/app.js', 'app/js/**/*.js', '.tmp/templates.js', '../../spec/api_browser/**/*.js'
|
260
|
+
],
|
261
|
+
frameworks: ['jasmine'],
|
262
|
+
reporters: ['dots'],
|
263
|
+
},
|
264
|
+
unit: {
|
265
|
+
browsers: ['PhantomJS'],
|
266
|
+
singleRun: true
|
267
|
+
}
|
268
|
+
},
|
269
|
+
|
270
|
+
jshint: {
|
271
|
+
src: ['app/js/**/*.js', '../../spec/api_browser/**/*.js'],
|
272
|
+
options: {
|
273
|
+
bitwise: true,
|
274
|
+
immed: true,
|
275
|
+
newcap: false,
|
276
|
+
noarg: true,
|
277
|
+
noempty: true,
|
278
|
+
nonew: true,
|
279
|
+
trailing: true,
|
280
|
+
boss: true,
|
281
|
+
eqnull: true,
|
282
|
+
expr: true,
|
283
|
+
laxbreak: true,
|
284
|
+
loopfunc: true,
|
285
|
+
sub: true,
|
286
|
+
undef: true,
|
287
|
+
unused: true,
|
288
|
+
browser: true,
|
289
|
+
quotmark: true,
|
290
|
+
indent: 2,
|
291
|
+
jasmine: true,
|
292
|
+
globals: {
|
293
|
+
"angular": false,
|
294
|
+
"app": true,
|
295
|
+
"_": false,
|
296
|
+
"$": false,
|
297
|
+
"jQuery": false,
|
298
|
+
"Showdown": false,
|
299
|
+
"inject": false,
|
300
|
+
"qc": false
|
301
|
+
}
|
226
302
|
}
|
227
303
|
}
|
228
304
|
});
|
229
305
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
]);
|
306
|
+
grunt.registerTask('runGenerator', function() {
|
307
|
+
var exec = require('child_process').exec;
|
308
|
+
var done = this.async();
|
309
|
+
exec('bundle exec rake praxis:docs:generate', {cwd: userDocsPath + '/../'}, done);
|
310
|
+
});
|
236
311
|
|
237
312
|
grunt.registerTask('serve', function(target) {
|
238
313
|
if (target === 'dist') {
|
239
314
|
return grunt.task.run(['build', 'connect:dist:keepalive']);
|
240
315
|
}
|
241
316
|
|
317
|
+
grunt.config.merge({
|
318
|
+
watch: {
|
319
|
+
// Updates index.html for any file added or removed
|
320
|
+
scripts: {
|
321
|
+
files: ['app/js/**/*.js', userDocsPath + '/**/*.js'],
|
322
|
+
tasks: 'fileblocks:serve',
|
323
|
+
options: { livereload: 9091 }
|
324
|
+
},
|
325
|
+
|
326
|
+
// Updates index.html for any bower component added or removed
|
327
|
+
bowerComponents: {
|
328
|
+
files: ['app/bower_components/**/*', userDocsPath + '/bower_components/**/*'],
|
329
|
+
tasks: 'wiredep',
|
330
|
+
options: { livereload: 9091 }
|
331
|
+
},
|
332
|
+
|
333
|
+
// Rebuild the stylesheets for any SASS file changed
|
334
|
+
sass: {
|
335
|
+
files: [
|
336
|
+
'app/sass/**/*.scss',
|
337
|
+
'app/bower_components/**/*.scss',
|
338
|
+
userDocsPath + '/**/*.scss'
|
339
|
+
],
|
340
|
+
tasks: 'sass',
|
341
|
+
options: { livereload: 9091 }
|
342
|
+
},
|
343
|
+
|
344
|
+
data: {
|
345
|
+
files: [
|
346
|
+
userDocsPath + '/../design/**/*.rb'
|
347
|
+
],
|
348
|
+
tasks: 'runGenerator',
|
349
|
+
options: { livereload: 9091 }
|
350
|
+
},
|
351
|
+
|
352
|
+
// Watches files that don't need processing
|
353
|
+
other: {
|
354
|
+
files: [
|
355
|
+
'app/css/*.css',
|
356
|
+
"app/index.html",
|
357
|
+
"app/views/**/*.html",
|
358
|
+
userDocsPath + '/views/**/*.html'
|
359
|
+
],
|
360
|
+
options: {
|
361
|
+
livereload: 9091
|
362
|
+
}
|
363
|
+
}
|
364
|
+
}
|
365
|
+
});
|
366
|
+
|
367
|
+
|
242
368
|
grunt.task.run([
|
243
|
-
'
|
369
|
+
'clean:serve',
|
370
|
+
'fileblocks:serve',
|
371
|
+
'wiredep',
|
372
|
+
'sass:server',
|
244
373
|
'connect:livereload',
|
245
374
|
'watch'
|
246
375
|
]);
|
@@ -248,7 +377,9 @@ module.exports = function(grunt) {
|
|
248
377
|
|
249
378
|
grunt.registerTask('build', [
|
250
379
|
'clean:dist',
|
251
|
-
'
|
380
|
+
'fileblocks:dist',
|
381
|
+
'wiredep',
|
382
|
+
'sass:dist',
|
252
383
|
'useminPrepare',
|
253
384
|
'ngtemplates',
|
254
385
|
'concat',
|
@@ -260,5 +391,31 @@ module.exports = function(grunt) {
|
|
260
391
|
'usemin'
|
261
392
|
]);
|
262
393
|
|
394
|
+
grunt.registerTask('test', function() {
|
395
|
+
grunt.config.set('watch', {
|
396
|
+
tests: {
|
397
|
+
files: [
|
398
|
+
'app/js/**',
|
399
|
+
'../../spec/api_browser/**'
|
400
|
+
],
|
401
|
+
tasks: ['jshint:src', 'karma:unit'],
|
402
|
+
options: {
|
403
|
+
atBegin: true
|
404
|
+
}
|
405
|
+
}
|
406
|
+
});
|
407
|
+
|
408
|
+
grunt.task.run([
|
409
|
+
'ngtemplates:dist',
|
410
|
+
'watch:tests'
|
411
|
+
]);
|
412
|
+
});
|
413
|
+
|
414
|
+
grunt.registerTask('ci', [
|
415
|
+
'ngtemplates:dist',
|
416
|
+
'jshint:src',
|
417
|
+
'karma:unit'
|
418
|
+
]);
|
419
|
+
|
263
420
|
grunt.registerTask("default", ["serve"]);
|
264
421
|
};
|