Skip to content

Commit

Permalink
add subject requests ("who?")
Browse files Browse the repository at this point in the history
  • Loading branch information
Carlos Rodriguez committed Oct 16, 2012
1 parent e2d571e commit 76a5fa0
Show file tree
Hide file tree
Showing 7 changed files with 399 additions and 9 deletions.
52 changes: 52 additions & 0 deletions README.md
Expand Up @@ -162,6 +162,40 @@ The syntax for a **role request** consists of:
( What | what ) is <subject> [ a / an / the ] <role> [ of / to / from / in ] [?] ( What | what ) is <subject> [ a / an / the ] <role> [ of / to / from / in ] [?]
``` ```


Verb subject request
--------------------

To request an array of subjects who can perform an action on an object:

```js
relations.repos('Who can pull from %s?', 'buffet', function (err, users) {
// users = ['Carlos']
});
```

### Syntax

```
( Who | who ) can <verb> [ of / to / from / in ] <object> [?]
```

Role subject request
--------------------

To request an array of subjects who have a role for an object:

```js
relations.repos('Who is the owner of %s?', 'buffet', function (err, users) {
// users = ['Carlos']
});
```

### Syntax

```
( Who | who ) can <verb> [ of / to / from / in ] <object> [?]
```

Revocation Revocation
---------- ----------


Expand Down Expand Up @@ -276,6 +310,24 @@ Respond to a role request and call `cb(err, /* array */ objects)` with the resul
- subject - subject
- role - role


### `verb-subject-request` (cmd, cb)

Respond to a verb subject request and call `cb(err, /* array */ subjects)` with
the result. `cmd` will be an object containing the properties:

- ctx - context object
- verb
- object

### `role-subject-request` (cmd, cb)

Respond to a role subject request and call `cb(err, /* array */ subjects)` with
the result. `cmd` will be an object containing the properties:

- ctx - context object
- role
- object

### `reset` (cb) ### `reset` (cb)


Reset the store, dumping all storage and structure, calling `cb(err)` when done. Reset the store, dumping all storage and structure, calling `cb(err)` when done.
Expand Down
223 changes: 218 additions & 5 deletions parser.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 21 additions & 1 deletion parser.pegjs
Expand Up @@ -4,7 +4,9 @@


start start
= ret:( = ret:(
RoleQuestion RoleSubjectRequest
/ VerbSubjectRequest
/ RoleQuestion
/ RoleRequest / RoleRequest
/ Declaration / Declaration
/ VerbRequest / VerbRequest
Expand Down Expand Up @@ -72,6 +74,24 @@ RoleRequest "role request"
} }
} }


VerbSubjectRequest "verb subject request"
= "who can "i verb:Token Preposition? " " object:Token "?"? {
return {
type: "verb-subject-request",
object: object,
verb: verb
}
}

RoleSubjectRequest "role subject request"
= "who "i Positive Quantifier? " " role:Token Preposition? " " object:Token "?"? {
return {
type: "role-subject-request",
object: object,
role: role
}
}

Token "token" Token "token"
= NamedToken / UnnamedToken / Literal = NamedToken / UnnamedToken / Literal


Expand Down
20 changes: 20 additions & 0 deletions stores/memory.js
Expand Up @@ -74,4 +74,24 @@ store.on('role-request', function (cmd, cb) {
cb(null, Object.keys(subject.objects).filter(function (k) { cb(null, Object.keys(subject.objects).filter(function (k) {
return subject.objects[k][cmd.role]; return subject.objects[k][cmd.role];
})); }));
});

store.on('verb-subject-request', function (cmd, cb) {
contexts[cmd.ctx.name] || (contexts[cmd.ctx.name] = {});
cb(null, Object.keys(contexts[cmd.ctx.name]).filter(function (subject) {
subject = contexts[cmd.ctx.name][subject];
if (!subject.objects[cmd.object]) return false;
return Object.keys(subject.objects[cmd.object]).some(function (role) {
return ~cmd.ctx.verbs[cmd.verb].indexOf(role);
});
}));
});

store.on('role-subject-request', function (cmd, cb) {
contexts[cmd.ctx.name] || (contexts[cmd.ctx.name] = {});
cb(null, Object.keys(contexts[cmd.ctx.name]).filter(function (subject) {
subject = contexts[cmd.ctx.name][subject];
if (!subject.objects[cmd.object]) return false;
return subject.objects[cmd.object][cmd.role];
}));
}); });

0 comments on commit 76a5fa0

Please sign in to comment.