Params work
This commit is contained in:
parent
826cb90ffe
commit
68662b149e
8 changed files with 102 additions and 46 deletions
|
@ -7,12 +7,7 @@
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build" />
|
<excludeFolder url="file://$MODULE_DIR$/build" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/packages" />
|
<excludeFolder url="file://$MODULE_DIR$/packages" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/test/chain/packages" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/test/method/packages" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/test/packages" />
|
<excludeFolder url="file://$MODULE_DIR$/test/packages" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/test/route/packages" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/test/router/packages" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/test/server/packages" />
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/web/hash/packages" />
|
<excludeFolder url="file://$MODULE_DIR$/web/hash/packages" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/web/packages" />
|
<excludeFolder url="file://$MODULE_DIR$/web/packages" />
|
||||||
|
|
6
.idea/runConfigurations/Params_Tests.xml
Normal file
6
.idea/runConfigurations/Params_Tests.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="ProjectRunConfigurationManager">
|
||||||
|
<configuration default="false" name="Params Tests" type="DartTestRunConfigurationType" factoryName="Dart Test" singleton="true">
|
||||||
|
<option name="filePath" value="$PROJECT_DIR$/test/params_test.dart" />
|
||||||
|
<method />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
|
@ -1,6 +1,6 @@
|
||||||
# angel_route
|
# angel_route
|
||||||
|
|
||||||
![version 1.0.0-dev+14](https://img.shields.io/badge/version-1.0.0--dev+14-red.svg)
|
![version 1.0.0-dev+15](https://img.shields.io/badge/version-1.0.0--dev+15-red.svg)
|
||||||
![build status](https://travis-ci.org/angel-dart/route.svg)
|
![build status](https://travis-ci.org/angel-dart/route.svg)
|
||||||
|
|
||||||
A powerful, isomorphic routing library for Dart.
|
A powerful, isomorphic routing library for Dart.
|
||||||
|
@ -42,10 +42,8 @@ main() {
|
||||||
|
|
||||||
router.post('/users/:id/timeline', (String id) {});
|
router.post('/users/:id/timeline', (String id) {});
|
||||||
|
|
||||||
// Numbers automatically parsed
|
|
||||||
|
|
||||||
router.get('/square_root/:id([0-9]+)', (n) {
|
router.get('/square_root/:id([0-9]+)', (n) {
|
||||||
return { 'result': pow(n, 0.5) };
|
return { 'result': pow(int.parse(n), 0.5) };
|
||||||
});
|
});
|
||||||
|
|
||||||
router.group('/show/:id', (router) {
|
router.group('/show/:id', (router) {
|
||||||
|
|
|
@ -304,7 +304,7 @@ class Route {
|
||||||
}
|
}
|
||||||
|
|
||||||
Route clone() {
|
Route clone() {
|
||||||
final Route route = new Route('');
|
final Route route = new Route('', debug: debug);
|
||||||
|
|
||||||
return route
|
return route
|
||||||
.._children.addAll(children)
|
.._children.addAll(children)
|
||||||
|
@ -315,6 +315,7 @@ class Route {
|
||||||
.._name = name
|
.._name = name
|
||||||
.._parent = _parent
|
.._parent = _parent
|
||||||
.._parentResolver = _parentResolver
|
.._parentResolver = _parentResolver
|
||||||
|
.._path = _path
|
||||||
.._pathified = _pathified
|
.._pathified = _pathified
|
||||||
.._resolver = _resolver
|
.._resolver = _resolver
|
||||||
.._stub = _stub
|
.._stub = _stub
|
||||||
|
@ -347,21 +348,19 @@ class Route {
|
||||||
|
|
||||||
_printDebug(
|
_printDebug(
|
||||||
'Searched request path $requestPath and found these values: $values');
|
'Searched request path $requestPath and found these values: $values');
|
||||||
|
_printDebug('This route\'s path is "$path".');
|
||||||
|
|
||||||
final pathString = _pathify(path).replaceAll(new RegExp('\/'), r'\/');
|
final pathString = _pathify(path).replaceAll(new RegExp('\/'), r'\/');
|
||||||
Iterable<Match> matches = _param.allMatches(pathString);
|
Iterable<Match> matches = _param.allMatches(pathString);
|
||||||
_printDebug(
|
_printDebug(
|
||||||
'All param names parsed in "$pathString": ${matches.map((m) => m.group(0))}');
|
'All param names parsed in "$pathString": ${matches.map((m) => m[1])}');
|
||||||
|
|
||||||
for (int i = 0; i < matches.length && i < values.length; i++) {
|
for (int i = 0; i < matches.length && i < values.length; i++) {
|
||||||
Match match = matches.elementAt(i);
|
Match match = matches.elementAt(i);
|
||||||
String paramName = match.group(1);
|
String paramName = match.group(1);
|
||||||
String value = values.elementAt(i);
|
String value = values.elementAt(i);
|
||||||
num numValue = num.parse(value, (_) => double.NAN);
|
_printDebug('Setting param "$paramName" to "$value"...');
|
||||||
if (!numValue.isNaN)
|
result[paramName] = value;
|
||||||
result[paramName] = numValue;
|
|
||||||
else
|
|
||||||
result[paramName] = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -138,8 +138,8 @@ class Router extends Extensible {
|
||||||
{Iterable middleware: const [],
|
{Iterable middleware: const [],
|
||||||
String name: null,
|
String name: null,
|
||||||
String namespace: null}) {
|
String namespace: null}) {
|
||||||
final router = new Router(debug: debug).._middleware.addAll(middleware);
|
final router = new Router().._middleware.addAll(middleware);
|
||||||
callback(router);
|
callback(router..debug = debug);
|
||||||
|
|
||||||
return mount(path, router, namespace: namespace).._name = name;
|
return mount(path, router, namespace: namespace).._name = name;
|
||||||
}
|
}
|
||||||
|
@ -257,29 +257,35 @@ class Router extends Extensible {
|
||||||
|
|
||||||
for (Route route in routes) {
|
for (Route route in routes) {
|
||||||
if (route is SymlinkRoute && route._head != null && segments.isNotEmpty) {
|
if (route is SymlinkRoute && route._head != null && segments.isNotEmpty) {
|
||||||
final match = route._head.firstMatch(segments.first);
|
final s = [];
|
||||||
|
|
||||||
if (match != null) {
|
for (String seg in segments) {
|
||||||
final cleaned = segments.first.replaceFirst(match[0], '');
|
s.add(seg);
|
||||||
final tail = cleanRelative
|
final match = route._head.firstMatch(s.join('/'));
|
||||||
.replaceAll(route._head, '')
|
|
||||||
.replaceAll(_straySlashes, '');
|
|
||||||
|
|
||||||
if (cleaned.isEmpty) {
|
if (match != null) {
|
||||||
_printDebug('Matched relative "$cleanRelative" to head ${route._head
|
final cleaned = s.join('/').replaceFirst(match[0], '');
|
||||||
.pattern} on $route. Tail: "$tail"');
|
final tail = cleanRelative
|
||||||
route.router.debug = route.router.debug || debug;
|
.replaceAll(route._head, '')
|
||||||
final nested =
|
.replaceAll(_straySlashes, '');
|
||||||
route.router.resolve(cleanAbsolute, tail, method: method);
|
|
||||||
return _dumpResult(
|
if (cleaned.isEmpty) {
|
||||||
cleanRelative,
|
_printDebug(
|
||||||
new RoutingResult(
|
'Matched relative "$cleanRelative" to head ${route._head
|
||||||
match: match,
|
.pattern} on $route. Tail: "$tail"');
|
||||||
nested: nested,
|
route.router.debug = route.router.debug || debug;
|
||||||
params: route.parseParameters(cleanRelative),
|
final nested =
|
||||||
shallowRoute: route,
|
route.router.resolve(cleanAbsolute, tail, method: method);
|
||||||
shallowRouter: this,
|
return _dumpResult(
|
||||||
tail: tail));
|
cleanRelative,
|
||||||
|
new RoutingResult(
|
||||||
|
match: match,
|
||||||
|
nested: nested,
|
||||||
|
params: route.parseParameters(match[0]),
|
||||||
|
shallowRoute: route,
|
||||||
|
shallowRouter: this,
|
||||||
|
tail: tail));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -317,11 +323,7 @@ class Router extends Extensible {
|
||||||
var result = router.resolve(absolute, relative, method: method);
|
var result = router.resolve(absolute, relative, method: method);
|
||||||
|
|
||||||
while (result != null) {
|
while (result != null) {
|
||||||
if (!results.contains(result))
|
results.add(result);
|
||||||
results.add(result);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
|
|
||||||
result.router._routes.remove(result.route);
|
result.router._routes.remove(result.route);
|
||||||
result = router.resolve(absolute, relative, method: method);
|
result = router.resolve(absolute, relative, method: method);
|
||||||
}
|
}
|
||||||
|
@ -352,7 +354,8 @@ class Router extends Extensible {
|
||||||
copiedMiddleware[middlewareName];
|
copiedMiddleware[middlewareName];
|
||||||
}
|
}
|
||||||
|
|
||||||
final route = new SymlinkRoute(path, path, router);
|
final route =
|
||||||
|
new SymlinkRoute(path, path, router..debug = debug || router.debug);
|
||||||
_mounted[route.path] = router;
|
_mounted[route.path] = router;
|
||||||
_routes.add(route);
|
_routes.add(route);
|
||||||
route._head = new RegExp(route.matcher.pattern.replaceAll(_rgxEnd, ''));
|
route._head = new RegExp(route.matcher.pattern.replaceAll(_rgxEnd, ''));
|
||||||
|
|
|
@ -35,6 +35,18 @@ class RoutingResult {
|
||||||
return handlers;
|
return handlers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> get allParams {
|
||||||
|
final params = {};
|
||||||
|
var search = this;
|
||||||
|
|
||||||
|
while (search != null) {
|
||||||
|
params.addAll(search.params);
|
||||||
|
search = search.nested;
|
||||||
|
}
|
||||||
|
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
RoutingResult(
|
RoutingResult(
|
||||||
{this.match,
|
{this.match,
|
||||||
Map<String, dynamic> params: const {},
|
Map<String, dynamic> params: const {},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: angel_route
|
name: angel_route
|
||||||
description: A powerful, isomorphic routing library for Dart.
|
description: A powerful, isomorphic routing library for Dart.
|
||||||
version: 1.0.0-dev+14
|
version: 1.0.0-dev+15
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/angel_route
|
homepage: https://github.com/angel-dart/angel_route
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|
43
test/params_test.dart
Normal file
43
test/params_test.dart
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import 'package:angel_route/angel_route.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
main() {
|
||||||
|
final router = new Router(debug: true)
|
||||||
|
..get('/hello', '')
|
||||||
|
..get('/user/:id', '');
|
||||||
|
|
||||||
|
router.group('/book/:id', (router) {
|
||||||
|
router.get('/reviews', '');
|
||||||
|
router.get('/readers/:readerId', '');
|
||||||
|
});
|
||||||
|
|
||||||
|
router.mount('/color', new Router(debug: true)..get('/:name/shades', ''));
|
||||||
|
|
||||||
|
setUp(router.dumpTree);
|
||||||
|
|
||||||
|
void expectParams(String path, Map<String, dynamic> params) {
|
||||||
|
final p = {};
|
||||||
|
final resolved = router.resolveAll(path, path);
|
||||||
|
print('Resolved $path => ${resolved.map((r) => r.allParams).toList()}');
|
||||||
|
for (final result in resolved) p.addAll(result.allParams);
|
||||||
|
expect(p, equals(params));
|
||||||
|
}
|
||||||
|
|
||||||
|
group('top-level', () {
|
||||||
|
test('no params', () => expectParams('/hello', {}));
|
||||||
|
|
||||||
|
test('one param', () => expectParams('/user/0', {'id': '0'}));
|
||||||
|
});
|
||||||
|
|
||||||
|
group('group', () {
|
||||||
|
test('root', () => expectParams('/book/1337', {'id': '1337'}));
|
||||||
|
test('path', () => expectParams('/book/1337/reviews', {'id': '1337'}));
|
||||||
|
test(
|
||||||
|
'two params',
|
||||||
|
() => expectParams(
|
||||||
|
'/book/1337/readers/foo', {'id': '1337', 'readerId': 'foo'}));
|
||||||
|
});
|
||||||
|
|
||||||
|
test('mount',
|
||||||
|
() => expectParams('/color/chartreuse/shades', {'name': 'chartreuse'}));
|
||||||
|
}
|
Loading…
Reference in a new issue