From 8ff4b4fa039cd49cd4c0add234c93dd2adc4f733 Mon Sep 17 00:00:00 2001 From: Lucas Dohmen Date: Wed, 19 Nov 2014 15:26:42 +0100 Subject: [PATCH 1/4] Foxx Generator 0.5 is now part of the ArangoDB standard library --- js/node/node_modules/foxx_generator/.jshintrc | 84 +++++ .../node_modules/foxx_generator/.npmignore | 3 + js/node/node_modules/foxx_generator/LICENSE | 202 ++++++++++++ js/node/node_modules/foxx_generator/README.md | 163 ++++++++++ .../foxx_generator/foxx_generator.js | 54 ++++ .../foxx_generator/condition_not_fulfilled.js | 13 + .../foxx_generator/configure_states.js | 103 ++++++ .../foxx_generator/construct_route.js | 52 +++ .../foxx_generator/foxx_generator/context.js | 34 ++ .../foxx_generator/documentation.js | 19 ++ .../foxx_generator/foxx_generator/graph.js | 125 +++++++ .../foxx_generator/foxx_generator/model.js | 18 ++ .../foxx_generator/relation_repository.js | 48 +++ .../foxx_generator/foxx_generator/reporter.js | 13 + .../foxx_generator/repository_with_graph.js | 48 +++ .../foxx_generator/foxx_generator/siren.js | 304 ++++++++++++++++++ .../foxx_generator/foxx_generator/state.js | 203 ++++++++++++ .../foxx_generator/state_factory.js | 32 ++ .../foxx_generator/foxx_generator/strategy.js | 27 ++ .../foxx_generator/transition.js | 54 ++++ .../foxx_generator/transition_factory.js | 62 ++++ .../foxx_generator/vertex_not_found.js | 12 + .../foxx_generator/wrap_service_action.js | 53 +++ .../node_modules/foxx_generator/package.json | 34 ++ .../foxx_generator/screenshots/overview.png | Bin 0 -> 107433 bytes .../foxx_generator/screenshots/try_it_out.png | Bin 0 -> 53911 bytes js/node/package.json | 1 + 27 files changed, 1761 insertions(+) create mode 100644 js/node/node_modules/foxx_generator/.jshintrc create mode 100644 js/node/node_modules/foxx_generator/.npmignore create mode 100644 js/node/node_modules/foxx_generator/LICENSE create mode 100644 js/node/node_modules/foxx_generator/README.md create mode 100644 js/node/node_modules/foxx_generator/foxx_generator.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/condition_not_fulfilled.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/configure_states.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/construct_route.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/context.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/documentation.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/graph.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/model.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/relation_repository.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/reporter.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/repository_with_graph.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/siren.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/state.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/state_factory.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/strategy.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/transition.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/transition_factory.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/vertex_not_found.js create mode 100644 js/node/node_modules/foxx_generator/foxx_generator/wrap_service_action.js create mode 100644 js/node/node_modules/foxx_generator/package.json create mode 100644 js/node/node_modules/foxx_generator/screenshots/overview.png create mode 100644 js/node/node_modules/foxx_generator/screenshots/try_it_out.png diff --git a/js/node/node_modules/foxx_generator/.jshintrc b/js/node/node_modules/foxx_generator/.jshintrc new file mode 100644 index 0000000000..d19dfe9189 --- /dev/null +++ b/js/node/node_modules/foxx_generator/.jshintrc @@ -0,0 +1,84 @@ +{ + "maxerr" : 50, // {int} Maximum error before stopping + + // Enforcing + "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) + "camelcase" : true, // true: Identifiers must be in camelCase + "curly" : true, // true: Require {} for every new block or scope + "eqeqeq" : true, // true: Require triple equals (===) for comparison + "freeze" : true, // true: prohibits overwriting prototypes of native objects such as Array, Date etc. + "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() + "immed" : true, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` + "indent" : 2, // {int} Number of spaces to use for indentation + "latedef" : true, // true: Require variables/functions to be defined before being used + "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()` + "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` + "noempty" : true, // true: Prohibit use of empty blocks + "nonbsp" : true, // true: Prohibit "non-breaking whitespace" characters. + "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment) + "plusplus" : false, // true: Prohibit use of `++` & `--` + "quotmark" : "single", // Quotation mark consistency: + // false : do nothing (default) + // true : ensure whatever is used is consistent + // "single" : require single quotes + // "double" : require double quotes + "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) + "unused" : "vars", // "vars": Require all defined variables be used, but not parameters + "strict" : true, // true: Requires all functions run in ES5 Strict Mode + "maxparams" : false, // {int} Max number of formal params allowed per function + "maxdepth" : 2, // {int} Max depth of nested blocks (within functions) + "maxstatements" : false, // {int} Max number statements per function + "maxcomplexity" : 5, // {int} Max cyclomatic complexity per function + "maxlen" : 120, // {int} Max number of characters per line + + // Relaxing + "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) + "boss" : false, // true: Tolerate assignments where comparisons would be expected + "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. + "eqnull" : false, // true: Tolerate use of `== null` + "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) + "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) + "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) + // (ex: `for each`, multiple try/catch, function expression…) + "evil" : false, // true: Tolerate use of `eval` and `new Function()` + "expr" : false, // true: Tolerate `ExpressionStatement` as Programs + "funcscope" : false, // true: Tolerate defining variables inside control statements + "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict') + "iterator" : false, // true: Tolerate using the `__iterator__` property + "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block + "laxbreak" : false, // true: Tolerate possibly unsafe line breakings + "laxcomma" : false, // true: Tolerate comma-first style coding + "loopfunc" : false, // true: Tolerate functions being defined in loops + "multistr" : false, // true: Tolerate multi-line strings + "noyield" : false, // true: Tolerate generator functions with no yield statement in them. + "notypeof" : false, // true: Tolerate invalid typeof operator values + "proto" : false, // true: Tolerate using the `__proto__` property + "scripturl" : false, // true: Tolerate script-targeted URLs + "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` + "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation + "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` + "validthis" : false, // true: Tolerate using this in a non-constructor function + + // Environments + "browser" : false, // Web Browser (window, document, etc) + "browserify" : false, // Browserify (node.js code in the browser) + "couch" : false, // CouchDB + "devel" : false, // Development/debugging (alert, confirm, etc) + "dojo" : false, // Dojo Toolkit + "jasmine" : false, // Jasmine + "jquery" : false, // jQuery + "mocha" : false, // Mocha + "mootools" : false, // MooTools + "node" : true, // Node.js + "nonstandard" : false, // Widely adopted globals (escape, unescape, etc) + "prototypejs" : false, // Prototype and Scriptaculous + "qunit" : false, // QUnit + "rhino" : false, // Rhino + "shelljs" : false, // ShellJS + "worker" : false, // Web Workers + "wsh" : false, // Windows Scripting Host + "yui" : false, // Yahoo User Interface + + // Custom Globals + "globals" : {} // additional predefined global variables +} diff --git a/js/node/node_modules/foxx_generator/.npmignore b/js/node/node_modules/foxx_generator/.npmignore new file mode 100644 index 0000000000..f928a64038 --- /dev/null +++ b/js/node/node_modules/foxx_generator/.npmignore @@ -0,0 +1,3 @@ +.DS_STORE +node_modules +npm-debug.log diff --git a/js/node/node_modules/foxx_generator/LICENSE b/js/node/node_modules/foxx_generator/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/js/node/node_modules/foxx_generator/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/js/node/node_modules/foxx_generator/README.md b/js/node/node_modules/foxx_generator/README.md new file mode 100644 index 0000000000..0ab1dcfb84 --- /dev/null +++ b/js/node/node_modules/foxx_generator/README.md @@ -0,0 +1,163 @@ +# FoxxGenerator + +FoxxGenerator is a declarative JavaScript framework that allows developers to describe the API in terms of the domain using statecharts. This declarative approach is based upon a combination of Richardson and Amundsen's design approach described in their book [RESTful Web APIs](http://restfulwebapis.com), Eric Evans' ideas from his book [domain driven design](http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215) and the Harel's statecharts introduced in his paper *Statecharts: A Visual Formalism For Complex Systems*. + +To create an API with FoxxGenerator, first draw a statechart that represents your API. In this statechart, your states can have one of the following types: + +* Entity: This state represents something that has an identity and an arbitrary number of (optionally nested) attributes. +* Repository: A repository can store entities. +* Service: A service can do something. What it can do is defined via a JavaScript function that you can define. A service does not have a state. + +Connect these states with transitions. When you have modeled your statechart in a way that it can fulfill all your use cases, it is time to classify your transitions. For every transition you have to decide which of the following type it follows: + +* `follow`: This is a transition that you can just follow from one state to the next. +* `connect`: This is a point of extension where you can create a transition at runtime. In order to be able to follow this transition, you have to add a `follow` transition as well. +* `disconnect`: With this transition you can remove a transition created with `connect`. +* `modify`: This is a transition that can only be created from an entity to itself. It is used to modify the state of this entity. + +You can now translate this annotated statechart into the DSL of FoxxGenerator to create your API. + +## Setting up a Foxx application with FoxxGenerator. + +First, create a Foxx application as described in [Foxx's manual](http://docs.arangodb.org/Foxx/README.html). In the folder of your Foxx app, you can now install FoxxGenerator with `npm install foxx_generator`. In the same way you would add a controller to your Foxx application, you can now add a FoxxGenerator to your application: In the file that would normally contain your FoxxController, add the following: + +```js +var FoxxGenerator = require('foxx_generator').Generator, + Joi = require('joi'), + generator; + +generator = new FoxxGenerator('name_of_your_app', { + // To learn more about media types, see below + mediaType: 'application/vnd.siren+json', + applicationContext: applicationContext, +}); + +// Insert transition definitions here + +// Insert states here + +generator.generate(); +``` + +For more information on how to choose a media type, see the section about Media types. Now you can define the transitions you used in your statechart and then add the states and the transitions between them. + +## Defining the transitions + +Every transition needs the following attributes: + +* A name for the transition that you can use when you want to add a transition of this type. +* `type`: One of the types described above. +* `to`: Is the target of this transition one or more states? For a `connect` transition this for example determines if you can only connect one state to it or more than that. Acceptable values are `one` and `many`. + +You can also add a documentation block (a JavaScript comment starting with `/**`) that will be used for the documentation. The first line should be a short summary, all other lines will be used for a long description. An example for that would be the following transition definition: + +```js +/** Show details for a particular item + * + * Show all information about this particular item. + */ +generator.defineTransition('showDetail', { + type: 'follow', + to: 'one' +}); +``` + +For a `connect` and `disconnect` transition you additionally have to determine which `follow` transition can be used to follow the created transition. This is done with `as` and the name of the transition. + +You can also add `parameters` to the transition, if in the transition process you need additional information from the user of the API. Each of the parameters needs to be a value object defined with [Joi](https://github.com/hapijs/joi). For example: + +```js +/** Modify the title of the entity + * + */ +generator.defineTransition('changeTitle', { + type: 'modify', + to: 'one', + + parameters: { + title: Joi.string() + } +}); +``` + +You can also define a `condition` for a transition. This is a JavaScript function that takes the parameters of the HTTP request as its argument and returns either true or false. If it is true, the transition can be executed. If it is false, the transition can not be executed and the link to execute it will be hidden from the representation. This can for example be used for user authorization. + +## Adding states and transitions + +Now you can add states and transitions to your API. Every state has a name, a type and a number of outgoing transitions. The type is one of the above described ones – either `entity`, `repository` or `service`. Every transition needs information about where it leads to and via which transition type. The transition type needs to be defined as described above. Simple example: + +```js +generator.addState('ideas', { + type: 'repository', + contains: 'idea', + + transitions: [ + { to: 'idea', via: 'showDetail' } + ] +}); +``` + +Some states take additional information: Entities need to know which repository they are contained in (via `containedIn`) and repositories need to know which entities they contain (via `contains`). + +### Entity + +An entity can be `parameterized` (by setting its attribute `parameterized` to `true`) which means that there is not only one state of that type, but there can be an arbitrary amount – each of them is identified by a parameter. This is usually the case with entities that are stored in a repository. + +It also takes an object of attributes which describe the representation of the entity. Each of the attributes needs to be a value object defined with [Joi](https://github.com/hapijs/joi). + +Example for an entity: + +```js +generator.addState('idea', { + type: 'entity', + parameterized: true, + containedIn: 'ideas', + + attributes: { + description: Joi.string().required(), + title: Joi.string().required() + }, + + transitions: [ + { to: 'idea', via: 'relatedIdea' } + ] +}); +``` + +### Service + +A service needs to describe what it does, this is done with an `action` which is a function that takes a request and a response in the [same way that a FoxxController route does](http://docs.arangodb.org/Foxx/FoxxController.html). The default HTTP verb for a service is a `post`, it can be changed by setting the `verb`. Example: + +```js +generator.addState('title', { + type: 'service', + verb: 'get', + + action: function (req, res) { + var entity = req.params('entity'); + res.json({ title: entity.get('title') }); + } +}); +``` + +## Media types + +FoxxGenerator currently only supports [siren](https://github.com/kevinswiber/siren) which is a media type without application semantics. Use the media type `application/vnd.siren+json`. We plan to support HAL with an extension for forms in the near future. + +## Interactive Documentation + +During your development, FoxxGenerator will generate an interactive documentation alongside the API. You can use this in an iterative development style to check after each step if the API is as you expected it to be. The documentation allows you to try out each of the generated endpoints. The API documentation can be found in the admin interface of ArangoDB and looks a little like this: + +![Overview](screenshots/overview.png) + +If you click on one of the routes, you can try it out: + +![Try it out](screenshots/try_it_out.png) + +## Examples + +* An example for a Siren API generated with FoxxGenerator can be found [here](https://github.com/moonglum/siren) + +## Linting + +To check the project for linting errors, run `npm run jshint`. diff --git a/js/node/node_modules/foxx_generator/foxx_generator.js b/js/node/node_modules/foxx_generator/foxx_generator.js new file mode 100644 index 0000000000..b4502e6884 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator.js @@ -0,0 +1,54 @@ +(function () { + 'use strict'; + var Foxx = require('org/arangodb/foxx'), + _ = require('underscore'), + Graph = require('./foxx_generator/graph').Graph, + Generator, + StateFactory = require('./foxx_generator/state_factory').StateFactory, + TransitionFactory = require('./foxx_generator/transition_factory').TransitionFactory, + configureStates = require('./foxx_generator/configure_states').configureStates, + mediaTypes; + + mediaTypes = { + 'application/vnd.siren+json': require('./foxx_generator/siren').mediaType + }; + + Generator = function (name, options) { + var applicationContext = options.applicationContext, + graph = new Graph(name, applicationContext), + strategies = mediaTypes[options.mediaType].strategies; + + this.controller = new Foxx.Controller(applicationContext, options); + + this.states = {}; + this.transitions = []; + + this.stateFactory = new StateFactory(graph, this.transitions, this.states); + this.transitionFactory = new TransitionFactory(applicationContext, graph, this.controller, strategies); + }; + + _.extend(Generator.prototype, { + addStartState: function (opts) { + var name = '', + options = _.defaults({ type: 'start', controller: this.controller }, opts); + + this.states[name] = this.stateFactory.create(name, options); + }, + + addState: function (name, opts) { + this.states[name] = this.stateFactory.create(name, opts); + }, + + defineTransition: function (name, opts) { + this.transitions[name] = this.transitionFactory.create(name, opts); + }, + + generate: function () { + configureStates(this.states); + _.each(this.states, function (state) { state.prepareTransitions(this.transitions, this.states); }, this); + _.each(this.states, function (state) { state.applyTransitions(); }, this); + } + }); + + exports.Generator = Generator; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/condition_not_fulfilled.js b/js/node/node_modules/foxx_generator/foxx_generator/condition_not_fulfilled.js new file mode 100644 index 0000000000..49591725d2 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/condition_not_fulfilled.js @@ -0,0 +1,13 @@ +(function () { + 'use strict'; + var ConditionNotFulfilled; + + ConditionNotFulfilled = function (msg) { + this.name = 'ConditionNotFulfilled'; + this.msg = msg; + }; + + ConditionNotFulfilled.prototype = Error.prototype; + + exports.ConditionNotFulfilled = ConditionNotFulfilled; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/configure_states.js b/js/node/node_modules/foxx_generator/foxx_generator/configure_states.js new file mode 100644 index 0000000000..dcbd6e9ceb --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/configure_states.js @@ -0,0 +1,103 @@ +(function () { + 'use strict'; + var _ = require('underscore'), + R = require('ramda'), + Repository = require('./repository_with_graph').RepositoryWithGraph, + Model = require('./model').Model, + configureStates, + typeIs, + determineSuperstate, + prepareStartState, + prepareServiceState, + determinePrefix, + prependPrefix, + appendIdPlaceholder, + isParameterized, + hasUrlTemplate, + appendIdPlaceholderForParameterizedState, + determineUrlTemplate, + determineUrlTemplateIfNotDetermined, + prepareEntityState, + prepareRepositoryState, + copyInfoFromRepositoryState; + + typeIs = R.curry(function (type, state) { + return state.type === type; + }); + + determineSuperstate = R.curry(function (states, state) { + if (state.superstate) { + state.superstate = states[state.superstate]; + } + }); + + prepareStartState = R.curry(R.func('setAsStart')); + prepareServiceState = R.curry(R.func('addService')); + + determinePrefix = function (state) { + var prefix = '/'; + + if (state.superstate) { + // First determine the entire chain + determineUrlTemplateIfNotDetermined(state.superstate); + prefix = state.superstate.urlTemplate + '/'; + } + + return prefix; + }; + + prependPrefix = function (state) { + state.urlTemplate = R.concat(determinePrefix(state), state.name); + return state; + }; + + appendIdPlaceholder = function(state) { + state.urlTemplate = R.concat(state.urlTemplate, '/:id'); + return state; + }; + + isParameterized = R.prop('parameterized'); + hasUrlTemplate = R.prop('urlTemplate'); + appendIdPlaceholderForParameterizedState = R.cond(isParameterized, appendIdPlaceholder, R.identity); + determineUrlTemplate = R.pipe(prependPrefix, appendIdPlaceholderForParameterizedState); + determineUrlTemplateIfNotDetermined = R.cond(hasUrlTemplate, R.identity, determineUrlTemplate); + + prepareEntityState = R.curry(function (states, entity) { + var repositoryState = states[entity.options.containedIn]; + entity.repositoryState = repositoryState; + entity.addModel(Model); + }); + + prepareRepositoryState = R.curry(function (states, repository) { + var entityState = states[repository.options.contains]; + repository.entityState = entityState; + repository.model = entityState.model; + repository.addRepository(Repository); + }); + + copyInfoFromRepositoryState = function (entity) { + var repositoryState = entity.repositoryState, + repository = repositoryState.repository; + entity.collectionName = repositoryState.collectionName; + entity.collection = repositoryState.collection; + entity.repository = repositoryState.repository; + repository.relations = entity.relations; + }; + + configureStates = function (states) { + var entities = _.filter(states, typeIs('entity')), + repositories = _.filter(states, typeIs('repository')), + services = _.filter(states, typeIs('service')), + starts = _.filter(states, typeIs('start')); + + _.each(states, determineSuperstate(states)); + _.each(states, determineUrlTemplateIfNotDetermined); + _.each(starts, prepareStartState); + _.each(services, prepareServiceState); + _.each(entities, prepareEntityState(states)); + _.each(repositories, prepareRepositoryState(states)); + _.each(entities, copyInfoFromRepositoryState); + }; + + exports.configureStates = configureStates; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/construct_route.js b/js/node/node_modules/foxx_generator/foxx_generator/construct_route.js new file mode 100644 index 0000000000..ba47b65d54 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/construct_route.js @@ -0,0 +1,52 @@ +(function () { + 'use strict'; + var Foxx = require('org/arangodb/foxx'), + ConditionNotFulfilled = require('./condition_not_fulfilled').ConditionNotFulfilled, + VertexNotFound = require('./vertex_not_found').VertexNotFound, + wrapServiceAction = require('./wrap_service_action').wrapServiceAction, + constructBodyParams, + joi = require('joi'), + constructRoute; + + constructBodyParams = function (relation) { + return Foxx.Model.extend({ schema: relation.parameters }); + }; + + constructRoute = function (opts) { + var route, + controller = opts.controller, + // from = opts.from, + // graph = opts.graph, + to = opts.to, + verb, + url = opts.url || to.urlTemplate, + action, + relation = opts.relation; + + if (to.type === 'service') { + verb = to.verb; + action = wrapServiceAction(to); + } else { + verb = opts.verb; + action = opts.action; + } + + route = controller[verb](url, action) + .errorResponse(VertexNotFound, 404, 'The vertex could not be found') + .errorResponse(ConditionNotFulfilled, 403, 'The condition could not be fulfilled') + .onlyIf(relation.condition) + .summary(relation.summary) + .notes(relation.notes); + + if (url.indexOf(':') > 0) { + route.pathParam('id', joi.string().description('ID of the entity')); + } + + if (opts.body) { + route.bodyParam(opts.body.name, 'TODO', constructBodyParams(relation)); + } + }; + + exports.constructRoute = constructRoute; +}()); + diff --git a/js/node/node_modules/foxx_generator/foxx_generator/context.js b/js/node/node_modules/foxx_generator/foxx_generator/context.js new file mode 100644 index 0000000000..313a3a354c --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/context.js @@ -0,0 +1,34 @@ +(function () { + 'use strict'; + var Context, + _ = require('underscore'), + extend = require('org/arangodb/extend').extend; + + /*jshint maxlen: 200 */ + Context = function (from, to, relation) { + from.relations.push(relation); + + this.from = from; + this.to = to; + this.relation = relation; + this.strategy = _.find(this.strategies, function (maybeStrategy) { + return maybeStrategy.executable(relation.type, from.type, to.type, relation.cardinality); + }); + + if (_.isUndefined(this.strategy)) { + require('console').log('Couldn\'t find a strategy for semantic %s from %s to %s (%s)', relation.type, from.type, to.type, relation.cardinality); + throw 'Could not find strategy'; + } + }; + /*jshint maxlen: 100 */ + + _.extend(Context.prototype, { + execute: function (controller, graph) { + this.strategy.execute(controller, graph, this.relation, this.from, this.to); + } + }); + + Context.extend = extend; + + exports.Context = Context; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/documentation.js b/js/node/node_modules/foxx_generator/foxx_generator/documentation.js new file mode 100644 index 0000000000..8a109b942c --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/documentation.js @@ -0,0 +1,19 @@ +(function () { + 'use strict'; + + var Documentation = function (applicationContext) { + this.summary = ''; + this.notes = ''; + + if (applicationContext.comments.length > 0) { + do { + this.summary = applicationContext.comments.shift(); + } while (this.summary === ''); + this.notes = applicationContext.comments.join('\n'); + } + + applicationContext.clearComments(); + }; + + exports.Documentation = Documentation; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/graph.js b/js/node/node_modules/foxx_generator/foxx_generator/graph.js new file mode 100644 index 0000000000..e17edb1553 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/graph.js @@ -0,0 +1,125 @@ +(function () { + 'use strict'; + var graphModule = require('org/arangodb/general-graph'), + ArangoError = require('internal').ArangoError, + _ = require('underscore'), + report = require('./reporter').report, + Graph, + VertexNotFound = require('./vertex_not_found').VertexNotFound, + tryAndHandleArangoError, + alreadyExists; + + tryAndHandleArangoError = function (func, errHandler) { + try { + func(); + } catch (e) { + if (e instanceof ArangoError) { + errHandler(); + } else { + throw e; + } + } + }; + + alreadyExists = function (type, name) { + return function () { + report('%s "%s" already added. Leaving it untouched.', type, name); + }; + }; + + Graph = function (name, appContext) { + var that = this; + this.appContext = appContext; + + tryAndHandleArangoError(function () { + that.graph = graphModule._graph(name); + }, function () { + that.graph = graphModule._create(name); + }); + }; + + _.extend(Graph.prototype, { + extendEdgeDefinitions: function (rawEdgeCollectionName, from, to) { + var vertexCollections, edgeCollectionName, edgeDefinition, graph; + edgeCollectionName = this.appContext.collectionName(rawEdgeCollectionName); + + if (from.type === 'entity' && to.type === 'entity' && from.collectionName && to.collectionName) { + vertexCollections = [ from.collectionName, to.collectionName ]; + edgeDefinition = graphModule._undirectedRelation(edgeCollectionName, vertexCollections); + graph = this.graph; + + tryAndHandleArangoError(function () { + graph._extendEdgeDefinitions(edgeDefinition); + }, alreadyExists('EdgeDefinition', edgeCollectionName)); + } else { + report('Invalid edge definition for "%s" and "%s"', from.collectionName, to.collectionName); + } + + return edgeCollectionName; + }, + + addVertexCollection: function (collectionName) { + var prefixedCollectionName = this.appContext.collectionName(collectionName), + graph = this.graph; + + tryAndHandleArangoError(function () { + graph._addVertexCollection(prefixedCollectionName, true); + }, alreadyExists('Collection', prefixedCollectionName)); + + return this.graph[prefixedCollectionName]; + }, + + neighbors: function (id, options) { + return this.graph._neighbors(id, options); + }, + + edges: function (id, options) { + return this.graph._vertices(id).edges().restrict(options.edgeCollectionRestriction).toArray(); + }, + + removeEdges: function (options) { + var graph = this.graph, + vertexId = options.vertexId, + edgeCollectionName = options.edgeCollectionName, + edges; + + edges = this.edges(vertexId, { + edgeCollectionRestriction: [edgeCollectionName], + }); + + _.each(edges, function (edge) { + graph[edgeCollectionName].remove(edge._id); + }); + }, + + checkIfVerticesExist: function (ids) { + if (!_.every(ids, this.hasVertex, this)) { + throw new VertexNotFound(); + } + }, + + hasVertex: function (id) { + return this.graph._vertices(id).count() > 0; + }, + + areConnected: function (sourceId, destinationId) { + return this.graph._edges([ + { _from: sourceId, _to: destinationId }, + { _from: destinationId, _to: sourceId } + ]).count() > 0; + }, + + createEdge: function (options) { + var sourceId = options.sourceId, + destinationId = options.destinationId, + edgeCollectionName = options.edgeCollectionName, + edgeCollection = this.graph[edgeCollectionName]; + + if (!this.areConnected(sourceId, destinationId)) { + edgeCollection.save(sourceId, destinationId, {}); + } + } + }); + + exports.Graph = Graph; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/model.js b/js/node/node_modules/foxx_generator/foxx_generator/model.js new file mode 100644 index 0000000000..e99e617f2d --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/model.js @@ -0,0 +1,18 @@ +(function () { + 'use strict'; + var Foxx = require('org/arangodb/foxx'), + Model; + + Model = Foxx.Model.extend({ + forClient: function () { + var properties = Foxx.Model.prototype.forClient.call(this); + + return { + properties: properties, + links: [] + }; + } + }); + + exports.Model = Model; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/relation_repository.js b/js/node/node_modules/foxx_generator/foxx_generator/relation_repository.js new file mode 100644 index 0000000000..09887cc62d --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/relation_repository.js @@ -0,0 +1,48 @@ +(function () { + 'use strict'; + var RelationRepository, + _ = require('underscore'); + + RelationRepository = function (from, to, relation, graph) { + this.edgeCollectionName = relation.edgeCollectionName; + this.fromId = function (key) { return from.collectionName + '/' + key; }; + this.toId = function (key) { return to.collectionName + '/' + key; }; + this.graph = graph; + }; + + _.extend(RelationRepository.prototype, { + replaceRelation: function (sourceKey, destinationKey) { + var sourceId = this.fromId(sourceKey), + destinationId = this.toId(destinationKey), + edgeCollectionName = this.edgeCollectionName, + graph = this.graph; + + graph.checkIfVerticesExist([destinationId, sourceId]); + graph.removeEdges({ vertexId: sourceId, edgeCollectionName: edgeCollectionName, throwError: false }); + graph.createEdge({ edgeCollectionName: edgeCollectionName, sourceId: sourceId, destinationId: destinationId }); + }, + + addRelations: function (sourceKey, destinationKeys) { + var sourceId = this.fromId(sourceKey), + destinationIds = _.map(destinationKeys, this.toId, this), + edgeCollectionName = this.edgeCollectionName, + graph = this.graph; + + graph.checkIfVerticesExist(_.union(sourceId, destinationIds)); + _.each(destinationIds, function (destinationId) { + graph.createEdge({ edgeCollectionName: edgeCollectionName, sourceId: sourceId, destinationId: destinationId }); + }); + }, + + deleteRelation: function (sourceKey) { + var sourceId = this.fromId(sourceKey), + edgeCollectionName = this.edgeCollectionName, + graph = this.graph; + + graph.checkIfVerticesExist([sourceId]); + graph.removeEdges({ vertexId: sourceId, edgeCollectionName: edgeCollectionName }); + } + }); + + exports.RelationRepository = RelationRepository; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/reporter.js b/js/node/node_modules/foxx_generator/foxx_generator/reporter.js new file mode 100644 index 0000000000..d47afcf834 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/reporter.js @@ -0,0 +1,13 @@ +(function () { + 'use strict'; + var report, + developmentMode = false; + + report = function () { + if (developmentMode) { + require('console').log.apply(this, arguments); + } + }; + + exports.report = report; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/repository_with_graph.js b/js/node/node_modules/foxx_generator/foxx_generator/repository_with_graph.js new file mode 100644 index 0000000000..2b92255371 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/repository_with_graph.js @@ -0,0 +1,48 @@ +(function () { + 'use strict'; + var Foxx = require('org/arangodb/foxx'), + _ = require('underscore'), + RepositoryWithGraph; + + RepositoryWithGraph = Foxx.Repository.extend({ + allWithNeighbors: function (options) { + var results = this.all(options); + _.each(results, function (result) { + this.addLinks(result); + }, this); + return results; + }, + + byIdWithNeighbors: function (key) { + var result = this.byId(key); + this.addLinks(result); + return result; + }, + + removeByKey: function (key) { + this.collection.remove(key); + }, + + addLinks: function (model) { + var links = {}, + graph = this.graph, + relations = _.filter(this.relations, function (relation) { return relation.type === 'follow'; }); + + _.each(relations, function (relation) { + var neighbors = graph.neighbors(model.get('_id'), { + edgeCollectionRestriction: [relation.edgeCollectionName] + }); + + if (relation.cardinality === 'one' && neighbors.length > 0) { + links[relation.name] = neighbors[0]._key; + } else if (relation.cardinality === 'many') { + links[relation.name] = _.pluck(neighbors, '_key'); + } + }); + + model.set('links', links); + } + }); + + exports.RepositoryWithGraph = RepositoryWithGraph; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/siren.js b/js/node/node_modules/foxx_generator/foxx_generator/siren.js new file mode 100644 index 0000000000..4fcd498a8d --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/siren.js @@ -0,0 +1,304 @@ +(function () { + 'use strict'; + var RelationRepository = require('./relation_repository').RelationRepository, + Strategy = require('./strategy').Strategy, + constructRoute = require('./construct_route').constructRoute, + ModifyAnEntity, + AddEntityToRepository, + ConnectRepoWithEntity, + ConnectStartWithRepository, + ConnectToService, + DisconnectTwoEntities, + DisconnectTwoEntitiesToMany, + ConnectEntityToService, + ConnectTwoEntities, + ConnectTwoEntitiesToMany, + FollowToEntity, + FollowToEntityToMany, + FollowFromRepositoryToService; + + ConnectEntityToService = Strategy.extend({ + type: 'follow', + from: 'entity', + to: 'service', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + constructRoute({ + controller: controller, + graph: graph, + from: from, + to: to, + relation: relation + }); + } + }); + + ModifyAnEntity = Strategy.extend({ + type: 'modify', + from: 'entity', + to: 'entity', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + constructRoute({ + controller: controller, + graph: graph, + verb: 'patch', + url: from.urlTemplate, + action: function (req, res) { + var id = req.params('id'), + patch = req.params(from.name), + result; + + from.repository.updateById(id, patch.forDB()); + result = from.repository.byIdWithNeighbors(id); + + res.json(result.forClient()); + }, + from: from, + to: to, + relation: relation, + body: from + }); + } + }); + + ConnectTwoEntities = Strategy.extend({ + type: 'connect', + from: 'entity', + to: 'entity', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + var relationRepository = new RelationRepository(from, to, relation, graph); + + constructRoute({ + controller: controller, + graph: graph, + verb: 'post', + url: from.urlForRelation(relation), + action: function (req, res) { + relationRepository.replaceRelation(req.params('id'), req.body()[relation.name]); + res.status(204); + }, + from: from, + to: to, + relation: relation + }); + } + }); + + ConnectTwoEntitiesToMany = Strategy.extend({ + type: 'connect', + from: 'entity', + to: 'entity', + cardinality: 'many', + + execute: function (controller, graph, relation, from, to) { + var relationRepository = new RelationRepository(from, to, relation, graph); + + constructRoute({ + controller: controller, + graph: graph, + verb: 'post', + url: from.urlForRelation(relation), + action: function (req, res) { + relationRepository.addRelations(req.params('id'), req.body()[relation.name]); + res.status(204); + }, + from: from, + to: to, + relation: relation + }); + } + }); + + DisconnectTwoEntities = Strategy.extend({ + type: 'disconnect', + from: 'entity', + to: 'entity', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + var relationRepository = new RelationRepository(from, to, relation, graph); + + constructRoute({ + controller: controller, + graph: graph, + verb: 'delete', + url: from.urlForRelation(relation), + action: function (req, res) { + relationRepository.deleteRelation(req.params('id')); + res.status(204); + }, + from: from, + to: to, + relation: relation + }); + } + }); + + DisconnectTwoEntitiesToMany = Strategy.extend({ + type: 'disconnect', + from: 'entity', + to: 'entity', + cardinality: 'many' + }); + + + FollowToEntity = Strategy.extend({ + type: 'follow', + from: 'entity', + to: 'entity', + cardinality: 'one' + }); + + FollowToEntityToMany = Strategy.extend({ + type: 'follow', + from: 'entity', + to: 'entity', + cardinality: 'many' + }); + + AddEntityToRepository = Strategy.extend({ + type: 'connect', + from: 'repository', + to: 'entity', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + from.addActionWithMethodForRelation('POST', relation); + + constructRoute({ + controller: controller, + graph: graph, + verb: 'post', + url: from.urlTemplate, + action: function (req, res) { + var data = {}, + model = req.params(to.name); + + data[to.name] = from.repository.save(model).forClient(); + res.status(201); + res.json(data); + }, + from: from, + to: to, + relation: relation, + body: to + }); + } + }); + + ConnectRepoWithEntity = Strategy.extend({ + type: 'follow', + from: 'repository', + to: 'entity', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + constructRoute({ + controller: controller, + graph: graph, + verb: 'get', + action: function (req, res) { + var id = req.params('id'), + entry = from.repository.byIdWithNeighbors(id); + + res.json(entry.forClient()); + }, + from: from, + to: to, + relation: relation + }); + + from.addLinkToEntities(relation, to); + } + }); + + ConnectStartWithRepository = Strategy.extend({ + type: 'follow', + from: 'start', + to: 'repository', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + from.addLinkViaTransitionTo(relation, to); + + constructRoute({ + controller: controller, + graph: graph, + verb: 'get', + action: function (req, res) { + res.json({ + properties: to.properties(), + entities: to.entities(), + links: to.filteredLinks(req), + actions: to.filteredActions(req) + }); + }, + from: from, + to: to, + relation: relation + }); + } + }); + + ConnectToService = Strategy.extend({ + type: 'follow', + from: 'start', + to: 'service', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + from.addLinkViaTransitionTo(relation, to); + + constructRoute({ + controller: controller, + graph: graph, + from: from, + to: to, + relation: relation, + body: to + }); + } + }); + + FollowFromRepositoryToService = Strategy.extend({ + type: 'follow', + from: 'repository', + to: 'service', + cardinality: 'one', + + execute: function (controller, graph, relation, from, to) { + from.addLinkViaTransitionTo(relation, to); + + constructRoute({ + controller: controller, + graph: graph, + from: from, + to: to, + relation: relation + }); + } + }); + + exports.mediaType = { + strategies: [ + new ModifyAnEntity(), + new ConnectTwoEntities(), + new DisconnectTwoEntities(), + new DisconnectTwoEntitiesToMany(), + new FollowToEntity(), + new FollowToEntityToMany(), + new AddEntityToRepository(), + new ConnectRepoWithEntity(), + new ConnectEntityToService(), + new ConnectToService(), + new ConnectTwoEntitiesToMany(), + new ConnectStartWithRepository(), + new FollowFromRepositoryToService() + ] + }; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/state.js b/js/node/node_modules/foxx_generator/foxx_generator/state.js new file mode 100644 index 0000000000..2a73022625 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/state.js @@ -0,0 +1,203 @@ +(function () { + 'use strict'; + + var stateTypes = ['entity', 'repository', 'service', 'start'], + extend = require('org/arangodb/extend').extend, + _ = require('underscore'), + constructFields, + State; + + constructFields = function (relation) { + return _.map(relation.parameters, function (joi, name) { + var fieldDescription = { name: name, type: joi._type }; + + if (!_.isNull(joi._description)) { + fieldDescription.description = joi._description; + } + + if (!_.isUndefined(joi._flags.default)) { + fieldDescription.value = joi._flags.default; + } + + return fieldDescription; + }); + }; + + State = function (name, graph, options) { + this.name = name; + this.graph = graph; + this.options = options; + this.parameterized = this.options.parameterized; + this.superstate = this.options.superstate; + this.type = this.options.type; + + if (!_.contains(stateTypes, this.type)) { + require('console').log('Unknown state type "' + options.type + '"'); + throw 'Unknown State Type'; + } + + this.links = []; + this.actions = []; + this.childLinks = []; + this.relations = []; + }; + + _.extend(State.prototype, { + prepareTransitions: function (definitions, states) { + this.transitions = _.map(this.options.transitions, function (transitionDescription) { + var transition = definitions[transitionDescription.via], + to = states[transitionDescription.to]; + + return { + transition: transition, + to: to + }; + }, this); + }, + + applyTransitions: function () { + _.each(this.transitions, function (transitionDescription) { + transitionDescription.transition.apply(this, transitionDescription.to); + }, this); + }, + + properties: function () { + return {}; + }, + + setAsStart: function () { + var that = this; + + this.options.controller.get('/', function (req, res) { + res.json({ + properties: {}, + links: that.filteredLinks(req), + actions: that.filteredActions(req) + }); + }).summary('Billboard URL') + .notes('This is the starting point for using the API'); + }, + + addRepository: function (Repository) { + this.collection = this.graph.addVertexCollection(this.name); + this.collectionName = this.collection.name(); + + this.repository = new Repository(this.collection, { + model: this.model, + graph: this.graph + }); + }, + + addModel: function (Model) { + this.model = Model.extend({ + schema: _.extend(this.options.attributes, { links: { type: 'object' } }) + }, { + state: this, + }); + }, + + addService: function () { + this.action = this.options.action; + this.verb = this.options.verb.toLowerCase(); + }, + + urlForEntity: function (selector) { + if (!this.parameterized) { + throw 'This is not a paremeterized state'; + } + + return this.urlTemplate.replace(':id', selector); + }, + + urlForRelation: function (relation) { + return this.urlTemplate + '/links/' + relation.name; + }, + + entities: function () { + var entities = []; + + if (this.type === 'repository') { + entities = _.map(this.repository.all(), function (entity) { + var result = entity.forClient(); + + _.each(this.childLinks, function (link) { + result.links.push({ + rel: link.rel, + href: link.target.urlForEntity(entity.get('_key')), + title: link.title + }); + }); + return result; + }, this); + } + + return entities; + }, + + filteredLinks: function (req) { + return _.filter(this.links, function (link) { + return link.precondition(req); + }); + }, + + filteredActions: function (req) { + return _.filter(this.actions, function (action) { + return action.precondition(req); + }); + }, + + addLink: function (rel, href, title, precondition) { + this.links.push({ + precondition: precondition, + rel: rel, + href: href, + title: title + }); + }, + + addLinkViaTransitionTo: function (relation, to) { + this.addLink([relation.name], to.urlTemplate, relation.summary, relation.precondition); + }, + + addLinkToEntities: function (relation, to) { + var rel = relation.name, + href = to.urlTemplate, + title = relation.summary, + target = to; + + this.childLinks.push({ + rel: rel, + href: href, + title: title, + target: target + }); + }, + + addAction: function (name, method, href, title, fields, precondition) { + this.actions.push({ + precondition: precondition, + name: name, + // class: ?, + method: method, + href: href, + title: title, + type: 'application/json', + fields: fields + }); + }, + + addActionWithMethodForRelation: function (method, relation) { + var name = relation.name, + urlTemplate = this.urlTemplate, + summary = relation.summary, + fields = constructFields(relation), + precondition = relation.precondition; + + this.addAction(name, method, urlTemplate, summary, fields, precondition); + } + }); + + State.extend = extend; + + exports.State = State; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/state_factory.js b/js/node/node_modules/foxx_generator/foxx_generator/state_factory.js new file mode 100644 index 0000000000..3b4b5b2e17 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/state_factory.js @@ -0,0 +1,32 @@ +(function () { + 'use strict'; + var _ = require('underscore'), + State = require('./state').State, + defaultsForStateOptions, + StateFactory; + + defaultsForStateOptions = { + parameterized: false, + superstate: false, + verb: 'post', + maxFailures: 1, + queue: 'defaultQueue' + }; + + StateFactory = function (graph, transitions, states) { + this.graph = graph; + this.transitions = transitions; + this.states = states; + }; + + _.extend(StateFactory.prototype, { + create: function (name, opts) { + var options = _.defaults(opts, defaultsForStateOptions), + state = new State(name, this.graph, options); + + return state; + } + }); + + exports.StateFactory = StateFactory; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/strategy.js b/js/node/node_modules/foxx_generator/foxx_generator/strategy.js new file mode 100644 index 0000000000..b7b64d1499 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/strategy.js @@ -0,0 +1,27 @@ +(function () { + 'use strict'; + var Strategy, + _ = require('underscore'), + extend = require('org/arangodb/extend').extend; + + Strategy = function () { + }; + + _.extend(Strategy.prototype, { + executable: function (type, from, to, cardinality) { + return type === this.type && from === this.from && to === this.to && cardinality === this.cardinality; + }, + + execute: function () { + require('console').log('Nothing to do for strategy type "%s" from "%s" to "%s" with cardinality "%s"', + this.type, + this.from, + this.to, + this.cardinality); + } + }); + + Strategy.extend = extend; + + exports.Strategy = Strategy; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/transition.js b/js/node/node_modules/foxx_generator/foxx_generator/transition.js new file mode 100644 index 0000000000..db915676e7 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/transition.js @@ -0,0 +1,54 @@ +(function () { + 'use strict'; + var extend = require('org/arangodb/extend').extend, + ConditionNotFulfilled = require('./condition_not_fulfilled').ConditionNotFulfilled, + _ = require('underscore'), + Transition; + + Transition = function (graph, controller) { + this.graph = graph; + this.controller = controller; + }; + + _.extend(Transition.prototype, { + extendEdgeDefinitions: function(from, to) { + var edgeCollectionName = this.collectionBaseName + '_' + from.name + '_' + to.name; + return this.graph.extendEdgeDefinitions(edgeCollectionName, from, to); + }, + + wrappedCondition: function () { + var condition = this.condition; + + return function (req) { + if (!condition(req)) { + throw new ConditionNotFulfilled('Condition was not fulfilled'); + } + }; + }, + + createContext: function(from, to) { + var context = new this.Context(from, to, { + name: this.relationName, + edgeCollectionName: this.extendEdgeDefinitions(from, to), + cardinality: this.cardinality, + type: this.type, + parameters: this.parameters, + summary: this.summary, + notes: this.notes, + condition: this.wrappedCondition(), + precondition: this.precondition, + to: to + }); + + return context; + }, + + apply: function (from, to) { + this.createContext(from, to).execute(this.controller, this.graph); + } + }); + + Transition.extend = extend; + + exports.Transition = Transition; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/transition_factory.js b/js/node/node_modules/foxx_generator/foxx_generator/transition_factory.js new file mode 100644 index 0000000000..f81825ae4a --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/transition_factory.js @@ -0,0 +1,62 @@ +(function () { + 'use strict'; + var _ = require('underscore'), + defaultsForTransitionOptions, + parseOptions, + Transition = require('./transition').Transition, + BaseContext = require('./context').Context, + Documentation = require('./documentation').Documentation; + + defaultsForTransitionOptions = { + type: 'follow', + to: 'one', + condition: function () { return true; } + }; + + parseOptions = function (name, opts, applicationContext) { + var options, + documentation = new Documentation(applicationContext); + + opts = opts || {}; + options = _.defaults(opts, defaultsForTransitionOptions); + options.precondition = options.precondition || options.condition; + + return _.extend(options, { + collectionBaseName: options.as || name, + relationName: name, + cardinality: options.to, + summary: documentation.summary, + notes: documentation.notes + }); + }; + + var TransitionFactory = function (applicationContext, graph, controller, strategies) { + this.applicationContext = applicationContext; + this.graph = graph; + this.controller = controller; + + var Context = BaseContext.extend({ + strategies: strategies + }); + + this.Transition = Transition.extend({ + Context: Context + }); + }; + + _.extend(TransitionFactory.prototype, { + create: function (name, opts) { + var Transition, + options = parseOptions(name, opts, this.applicationContext), + transition; + + Transition = this.Transition.extend(options); + + transition = new Transition(this.graph, this.controller); + + return transition; + } + }); + + exports.TransitionFactory = TransitionFactory; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/vertex_not_found.js b/js/node/node_modules/foxx_generator/foxx_generator/vertex_not_found.js new file mode 100644 index 0000000000..6bd6e12046 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/vertex_not_found.js @@ -0,0 +1,12 @@ +(function () { + 'use strict'; + var VertexNotFound; + + VertexNotFound = function () { + this.name = 'VertexNotFound'; + this.message = 'The vertex could not be found'; + }; + VertexNotFound.prototype = Error.prototype; + + exports.VertexNotFound = VertexNotFound; +}()); diff --git a/js/node/node_modules/foxx_generator/foxx_generator/wrap_service_action.js b/js/node/node_modules/foxx_generator/foxx_generator/wrap_service_action.js new file mode 100644 index 0000000000..16cbcfdb28 --- /dev/null +++ b/js/node/node_modules/foxx_generator/foxx_generator/wrap_service_action.js @@ -0,0 +1,53 @@ +(function () { + 'use strict'; + var wrapEntity, + wrapRepository, + selectByStateType, + wrapServiceAction; + + wrapEntity = function (state) { + return function (req) { + var id = req.params('id'); + return { + superstate: { + repository: state.repository, + entity: state.repository.byId(id) + } + }; + }; + }; + + wrapRepository = function (state) { + return function () { + return { + superstate: { + repository: state.repository + } + }; + }; + }; + + selectByStateType = function (state) { + var wrapper; + + if (!state) { + return function () { return {}; }; + } + + if (state.type === 'entity') { + wrapper = wrapEntity; + } else if (state.type === 'repository') { + wrapper = wrapRepository; + } + + return wrapper(state); + }; + + wrapServiceAction = function (serviceState) { + return function (req, res) { + serviceState.action(req, res, selectByStateType(serviceState.superstate)(req)); + }; + }; + + exports.wrapServiceAction = wrapServiceAction; +}()); diff --git a/js/node/node_modules/foxx_generator/package.json b/js/node/node_modules/foxx_generator/package.json new file mode 100644 index 0000000000..1cfd5c89b1 --- /dev/null +++ b/js/node/node_modules/foxx_generator/package.json @@ -0,0 +1,34 @@ +{ + "name": "foxx_generator", + "version": "0.5.0", + "description": "Generate Foxx APIs using Statecharts and Domain Driven Design", + "main": "foxx_generator.js", + "scripts": { + "jshint": "jshint -c .jshintrc foxx_generator.js foxx_generator/*.js" + }, + "repository": { + "type": "git", + "url": "git@github.com/moonglum/foxx_generator.git" + }, + "keywords": [ + "foxx", + "arangodb", + "generator", + "hypermedia" + ], + "author": { + "name": "Lucas Dohmen", + "email": "lucas@arangodb.org" + }, + "license": "Apache License Version 2.0", + "bugs": { + "url": "https://github.com/moonglum/foxx_generator/issues" + }, + "homepage": "https://github.com/moonglum/foxx_generator", + "gitHead": "d6e918d0dd7fbe00f8faa4a96a01790cdae07833", + "readme": "# FoxxGenerator\n\nFoxxGenerator is a declarative JavaScript framework that allows developers to describe the API in terms of the domain using statecharts. This declarative approach is based upon a combination of Richardson and Amundsen's design approach described in their book [RESTful Web APIs](http://restfulwebapis.com), Eric Evans' ideas from his book [domain driven design](http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215) and the Harel's statecharts introduced in his paper *Statecharts: A Visual Formalism For Complex Systems*.\n\nTo create an API with FoxxGenerator, first draw a statechart that represents your API. In this statechart, your states can have one of the following types:\n\n* Entity: This state represents something that has an identity and an arbitrary number of (optionally nested) attributes.\n* Repository: A repository can store entities.\n* Service: A service can do something. What it can do is defined via a JavaScript function that you can define. A service does not have a state.\n\nConnect these states with transitions. When you have modeled your statechart in a way that it can fulfill all your use cases, it is time to classify your transitions. For every transition you have to decide which of the following type it follows:\n\n* `follow`: This is a transition that you can just follow from one state to the next.\n* `connect`: This is a point of extension where you can create a transition at runtime. In order to be able to follow this transition, you have to add a `follow` transition as well.\n* `disconnect`: With this transition you can remove a transition created with `connect`.\n* `modify`: This is a transition that can only be created from an entity to itself. It is used to modify the state of this entity.\n\nYou can now translate this annotated statechart into the DSL of FoxxGenerator to create your API.\n\n## Setting up a Foxx application with FoxxGenerator.\n\nFirst, create a Foxx application as described in [Foxx's manual](http://docs.arangodb.org/Foxx/README.html). In the folder of your Foxx app, you can now install FoxxGenerator with `npm install foxx_generator`. In the same way you would add a controller to your Foxx application, you can now add a FoxxGenerator to your application: In the file that would normally contain your FoxxController, add the following:\n\n```js\nvar FoxxGenerator = require('foxx_generator').Generator,\n Joi = require('joi'),\n generator;\n\ngenerator = new FoxxGenerator('name_of_your_app', {\n // To learn more about media types, see below\n mediaType: 'application/vnd.siren+json',\n applicationContext: applicationContext,\n});\n\n// Insert transition definitions here\n\n// Insert states here\n\ngenerator.generate();\n```\n\nFor more information on how to choose a media type, see the section about Media types. Now you can define the transitions you used in your statechart and then add the states and the transitions between them.\n\n## Defining the transitions\n\nEvery transition needs the following attributes:\n\n* A name for the transition that you can use when you want to add a transition of this type.\n* `type`: One of the types described above.\n* `to`: Is the target of this transition one or more states? For a `connect` transition this for example determines if you can only connect one state to it or more than that. Acceptable values are `one` and `many`.\n\nYou can also add a documentation block (a JavaScript comment starting with `/**`) that will be used for the documentation. The first line should be a short summary, all other lines will be used for a long description. An example for that would be the following transition definition:\n\n```js\n/** Show details for a particular item\n * \n * Show all information about this particular item.\n */\ngenerator.defineTransition('showDetail', {\n type: 'follow',\n to: 'one'\n});\n```\n\nFor a `connect` and `disconnect` transition you additionally have to determine which `follow` transition can be used to follow the created transition. This is done with `as` and the name of the transition.\n\nYou can also add `parameters` to the transition, if in the transition process you need additional information from the user of the API. Each of the parameters needs to be a value object defined with [Joi](https://github.com/hapijs/joi). For example:\n\n```js\n/** Modify the title of the entity\n *\n */\ngenerator.defineTransition('changeTitle', {\n type: 'modify',\n to: 'one',\n\n parameters: {\n title: Joi.string()\n }\n});\n```\n\nYou can also define a `condition` for a transition. This is a JavaScript function that takes the parameters of the HTTP request as its argument and returns either true or false. If it is true, the transition can be executed. If it is false, the transition can not be executed and the link to execute it will be hidden from the representation. This can for example be used for user authorization.\n\n## Adding states and transitions\n\nNow you can add states and transitions to your API. Every state has a name, a type and a number of outgoing transitions. The type is one of the above described ones – either `entity`, `repository` or `service`. Every transition needs information about where it leads to and via which transition type. The transition type needs to be defined as described above. Simple example:\n\n```js\ngenerator.addState('ideas', {\n type: 'repository',\n contains: 'idea',\n\n transitions: [\n { to: 'idea', via: 'showDetail' }\n ]\n});\n```\n\nSome states take additional information: Entities need to know which repository they are contained in (via `containedIn`) and repositories need to know which entities they contain (via `contains`).\n\n### Entity\n\nAn entity can be `parameterized` (by setting its attribute `parameterized` to `true`) which means that there is not only one state of that type, but there can be an arbitrary amount – each of them is identified by a parameter. This is usually the case with entities that are stored in a repository.\n\nIt also takes an object of attributes which describe the representation of the entity. Each of the attributes needs to be a value object defined with [Joi](https://github.com/hapijs/joi).\n\nExample for an entity:\n\n```js\ngenerator.addState('idea', {\n type: 'entity',\n parameterized: true,\n containedIn: 'ideas',\n\n attributes: {\n description: Joi.string().required(),\n title: Joi.string().required()\n },\n\n transitions: [\n { to: 'idea', via: 'relatedIdea' }\n ]\n});\n```\n\n### Service\n\nA service needs to describe what it does, this is done with an `action` which is a function that takes a request and a response in the [same way that a FoxxController route does](http://docs.arangodb.org/Foxx/FoxxController.html). The default HTTP verb for a service is a `post`, it can be changed by setting the `verb`. Example:\n\n```js\ngenerator.addState('title', {\n type: 'service',\n verb: 'get',\n\n action: function (req, res) {\n var entity = req.params('entity');\n res.json({ title: entity.get('title') });\n }\n});\n```\n\n## Media types\n\nFoxxGenerator currently only supports [siren](https://github.com/kevinswiber/siren) which is a media type without application semantics. Use the media type `application/vnd.siren+json`. We plan to support HAL with an extension for forms in the near future.\n\n## Interactive Documentation\n\nDuring your development, FoxxGenerator will generate an interactive documentation alongside the API. You can use this in an iterative development style to check after each step if the API is as you expected it to be. The documentation allows you to try out each of the generated endpoints. The API documentation can be found in the admin interface of ArangoDB and looks a little like this:\n\n![Overview](screenshots/overview.png)\n\nIf you click on one of the routes, you can try it out:\n\n![Try it out](screenshots/try_it_out.png)\n\n## Examples\n\n* An example for a Siren API generated with FoxxGenerator can be found [here](https://github.com/moonglum/siren)\n\n## Linting\n\nTo check the project for linting errors, run `npm run jshint`.\n", + "readmeFilename": "README.md", + "_id": "foxx_generator@0.5.0", + "_shasum": "ae854ef1a78b7f2925469e0a6e155926e52fdabc", + "_from": "foxx_generator@*" +} diff --git a/js/node/node_modules/foxx_generator/screenshots/overview.png b/js/node/node_modules/foxx_generator/screenshots/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..72d36bb5ee27c40a6ef044108ae6e3a21f0111bd GIT binary patch literal 107433 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⩔7VTA2OSkKZ)1s}6ag8$t29Y@ds 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

)F&*j@^4ApM}|86LSMPVgn+<5#6+brm*wkpDW}x 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%0Db6>c@LPZKju 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 literal 0 HcmV?d00001 diff --git a/js/node/node_modules/foxx_generator/screenshots/try_it_out.png b/js/node/node_modules/foxx_generator/screenshots/try_it_out.png new file mode 100644 index 0000000000000000000000000000000000000000..53d1f9c0a9e25a5755ff9c7ebb8a1af44bdc5882 GIT binary patch literal 53911 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 literal 0 HcmV?d00001 diff --git a/js/node/package.json b/js/node/package.json index a3a65979b3..8f61e96822 100644 --- a/js/node/package.json +++ b/js/node/package.json @@ -6,6 +6,7 @@ "coffee-script": "1.7.1", "decimal": "0.0.2", "docco": "0.6.3", + "foxx_generator": "^0.5.0", "htmlparser2": "3.7.2", "iced-coffee-script": "1.7.1-f", "joi": "4.6.1", From 18bc51ab186b66f02525d809a049f4dfc70df7fd Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Thu, 20 Nov 2014 09:29:54 +0100 Subject: [PATCH 2/4] added derived file --- .../js/modules/org/arangodb/general-graph.js | 83 ++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/js/apps/system/aardvark/frontend/js/modules/org/arangodb/general-graph.js b/js/apps/system/aardvark/frontend/js/modules/org/arangodb/general-graph.js index 1e930271ea..aa58463ba4 100644 --- a/js/apps/system/aardvark/frontend/js/modules/org/arangodb/general-graph.js +++ b/js/apps/system/aardvark/frontend/js/modules/org/arangodb/general-graph.js @@ -1033,9 +1033,12 @@ AQLGenerator.prototype._getLastRestrictableStatementInfo = function() { //////////////////////////////////////////////////////////////////////////////// AQLGenerator.prototype.restrict = function(restrictions) { + var rest = stringToArray(restrictions); + if (rest.length == 0) { + return this; + } this._addToPrint("restrict", restrictions); this._clearCursor(); - var rest = stringToArray(restrictions); var lastQueryInfo = this._getLastRestrictableStatementInfo(); var lastQuery = lastQueryInfo.statement; var opts = lastQueryInfo.options; @@ -1186,6 +1189,7 @@ AQLGenerator.prototype.execute = function() { AQLGenerator.prototype.toArray = function() { this._createCursor(); + return this.cursor.toArray(); }; @@ -4487,6 +4491,83 @@ Graph.prototype._removeVertexCollection = function(vertexCollectionName, dropCol }; +//////////////////////////////////////////////////////////////////////////////// +/// @startDocuBlock JSF_general_graph_connectingEdges +/// @brief Get all connecting edges between 2 groups of vertices defined by the examples +/// +/// `graph._connectingEdges(vertexExample, vertexExample2, options)` +/// +/// The function accepts an id, an example, a list of examples or even an empty +/// example as parameter for vertexExample. +/// +/// @PARAMS +/// +/// @PARAM{vertexExample1, object, optional} +/// See [Definition of examples](#definition_of_examples) +/// @PARAM{vertexExample2, object, optional} +/// See [Definition of examples](#definition_of_examples) +/// @PARAM{options, object, optional} +/// An object defining further options. Can have the following values: +/// * *edgeExamples*: Filter the edges, see [Definition of examples](#definition_of_examples) +/// * *edgeCollectionRestriction* : One or a list of edge-collection names that should be +/// considered to be on the path. +/// * *vertex1CollectionRestriction* : One or a list of vertex-collection names that should be +/// considered on the intermediate vertex steps. +/// * *vertex2CollectionRestriction* : One or a list of vertex-collection names that should be +/// considered on the intermediate vertex steps. +/// +/// @EXAMPLES +/// +/// A route planner example, all neighbors of capitals. +/// +/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphModuleNeighbors1} +/// var examples = require("org/arangodb/graph-examples/example-graph.js"); +/// var graph = examples.loadGraph("routeplanner"); +/// graph._neighbors({isCapital : true}); +/// @END_EXAMPLE_ARANGOSH_OUTPUT +/// +/// A route planner example, all outbound neighbors of Hamburg. +/// +/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphModuleNeighbors2} +/// var examples = require("org/arangodb/graph-examples/example-graph.js"); +/// var graph = examples.loadGraph("routeplanner"); +/// graph._neighbors('germanCity/Hamburg', {direction : 'outbound', maxDepth : 2}); +/// @END_EXAMPLE_ARANGOSH_OUTPUT +/// +/// @endDocuBlock +// +//////////////////////////////////////////////////////////////////////////////// + +Graph.prototype._getConnectingEdges = function(vertexExample1, vertexExample2, options) { + var AQLStmt = new AQLGenerator(this); + if (!options) { + options = {}; + } + + var opts = { + }; + + options.vertex1CollectionRestriction ? opts.startVertexCollectionRestriction = options.vertex1CollectionRestriction : null ; + options.vertex2CollectionRestriction ? opts.endVertexCollectionRestriction = options.vertex2CollectionRestriction : null ; + options.edgeCollectionRestriction ? opts.edgeCollectionRestriction = options.edgeCollectionRestriction : null ; + options.edgeExamples ? opts.edgeExamples = options.edgeExamples : null ; + vertexExample2 ? opts.neighborExamples = vertexExample2 : null ; + var query = "RETURN" + + " GRAPH_EDGES(@graphName" + + ',@vertexExample' + + ',@options' + + ')'; + options = options || {}; + var bindVars = { + "graphName": this.__name, + "vertexExample": vertexExample1, + "options": opts + }; + var result = db._query(query, bindVars).toArray(); + return result[0]; +}; + + //////////////////////////////////////////////////////////////////////////////// From e26c2295fb137cfb9fc3c12043bf8e510791262c Mon Sep 17 00:00:00 2001 From: fagnercarvalho Date: Thu, 20 Nov 2014 02:41:07 -0200 Subject: [PATCH 3/4] Fixing collection help output misspelled errors --- .../frontend/js/modules/org/arangodb/arango-collection.js | 2 +- js/client/modules/org/arangodb/arango-collection.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js b/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js index 556e8c488b..c2dd22754d 100644 --- a/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js +++ b/js/apps/system/aardvark/frontend/js/modules/org/arangodb/arango-collection.js @@ -209,7 +209,7 @@ var helpArangoCollection = arangosh.createHelpHeadline("ArangoCollection help") ' truncate() delete all documents ' + "\n" + ' properties() show collection properties ' + "\n" + ' drop() delete a collection ' + "\n" + - ' load() load a collection into memeory ' + "\n" + + ' load() load a collection into memory ' + "\n" + ' unload() unload a collection from memory ' + "\n" + ' rename() renames a collection ' + "\n" + ' getIndexes() return defined indexes ' + "\n" + diff --git a/js/client/modules/org/arangodb/arango-collection.js b/js/client/modules/org/arangodb/arango-collection.js index c24f69eb92..bcba5e135f 100644 --- a/js/client/modules/org/arangodb/arango-collection.js +++ b/js/client/modules/org/arangodb/arango-collection.js @@ -208,7 +208,7 @@ var helpArangoCollection = arangosh.createHelpHeadline("ArangoCollection help") ' truncate() delete all documents ' + "\n" + ' properties() show collection properties ' + "\n" + ' drop() delete a collection ' + "\n" + - ' load() load a collection into memeory ' + "\n" + + ' load() load a collection into memory ' + "\n" + ' unload() unload a collection from memory ' + "\n" + ' rename() renames a collection ' + "\n" + ' getIndexes() return defined indexes ' + "\n" + From 61d38463569b2e835dbe7486c1366f4f3d7dbce4 Mon Sep 17 00:00:00 2001 From: fagnercarvalho Date: Thu, 20 Nov 2014 02:41:20 -0200 Subject: [PATCH 4/4] Fixing statistics documentation misspelled errors --- lib/Statistics/statistics.cpp | 2 +- lib/Statistics/statistics.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Statistics/statistics.cpp b/lib/Statistics/statistics.cpp index 0489d25413..649d9042b2 100644 --- a/lib/Statistics/statistics.cpp +++ b/lib/Statistics/statistics.cpp @@ -502,7 +502,7 @@ StatisticsDistribution* TRI_BytesReceivedDistributionStatistics; TRI_server_statistics_t TRI_ServerStatistics; //////////////////////////////////////////////////////////////////////////////// -/// @brief physical memeory +/// @brief physical memory //////////////////////////////////////////////////////////////////////////////// uint64_t TRI_PhysicalMemory; diff --git a/lib/Statistics/statistics.h b/lib/Statistics/statistics.h index 24d550a917..c11a74b30b 100644 --- a/lib/Statistics/statistics.h +++ b/lib/Statistics/statistics.h @@ -280,7 +280,7 @@ extern triagens::basics::StatisticsDistribution* TRI_BytesReceivedDistributionSt extern TRI_server_statistics_t TRI_ServerStatistics; //////////////////////////////////////////////////////////////////////////////// -/// @brief physical memeory +/// @brief physical memory //////////////////////////////////////////////////////////////////////////////// extern uint64_t TRI_PhysicalMemory;