This commit is contained in:
thosakwe 2017-01-11 20:52:06 -05:00
parent c771e82ad3
commit f00705d2d0
5 changed files with 78 additions and 55 deletions

View file

@ -2,11 +2,7 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="7b89ff1e-1260-4dcf-9c3d-345de0471ea1" name="Default" comment=""> <list default="true" id="7b89ff1e-1260-4dcf-9c3d-345de0471ea1" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/runConfigurations/DI_Tests.xml" afterPath="$PROJECT_DIR$/.idea/runConfigurations/DI_Tests.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/angel_http_exception.dart" afterPath="$PROJECT_DIR$/lib/src/http/angel_http_exception.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/controller.dart" afterPath="$PROJECT_DIR$/lib/src/http/controller.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/memory_service.dart" afterPath="$PROJECT_DIR$/lib/src/http/memory_service.dart" />
</list> </list>
<ignored path="$PROJECT_DIR$/.tmp/" /> <ignored path="$PROJECT_DIR$/.tmp/" />
<ignored path="$PROJECT_DIR$/temp/" /> <ignored path="$PROJECT_DIR$/temp/" />
@ -62,8 +58,8 @@
<file leaf-file-name="server.dart" pinned="false" current-in-tab="true"> <file leaf-file-name="server.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="175"> <state relative-caret-position="205">
<caret line="237" column="42" lean-forward="true" selection-start-line="237" selection-start-column="42" selection-end-line="237" selection-end-column="42" /> <caret line="239" column="43" lean-forward="false" selection-start-line="239" selection-start-column="43" selection-end-line="239" selection-end-column="43" />
<folding> <folding>
<element signature="e#38#58#0" expanded="true" /> <element signature="e#38#58#0" expanded="true" />
<marker date="1483149636000" expanded="true" signature="14571:14573" ph="{...}" /> <marker date="1483149636000" expanded="true" signature="14571:14573" ph="{...}" />
@ -384,7 +380,7 @@
<workItem from="1481377809918" duration="1319000" /> <workItem from="1481377809918" duration="1319000" />
<workItem from="1481389675241" duration="158000" /> <workItem from="1481389675241" duration="158000" />
<workItem from="1481390924053" duration="19000" /> <workItem from="1481390924053" duration="19000" />
<workItem from="1483149948840" duration="913000" /> <workItem from="1483149948840" duration="930000" />
</task> </task>
<task id="LOCAL-00001" summary="Re-designed exception"> <task id="LOCAL-00001" summary="Re-designed exception">
<created>1481237183504</created> <created>1481237183504</created>
@ -421,7 +417,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1483150316138</updated> <updated>1483150316138</updated>
</task> </task>
<option name="localTasksCounter" value="6" /> <task id="LOCAL-00006" summary="I love stack overflows!!!">
<created>1483150975010</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1483150975010</updated>
</task>
<option name="localTasksCounter" value="7" />
<servers /> <servers />
</component> </component>
<component name="TestHistory"> <component name="TestHistory">
@ -457,7 +460,7 @@
</history-entry> </history-entry>
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="3597000" /> <option name="totallyTimeSpent" value="3614000" />
</component> </component>
<component name="TodoView"> <component name="TodoView">
<todo-panel id="selected-file"> <todo-panel id="selected-file">
@ -479,7 +482,7 @@
<window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32802936" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32802936" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="ANTLR Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="ANTLR Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32925338" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32925338" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32680538" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32680538" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
@ -506,7 +509,8 @@
<MESSAGE value="Fixed todo" /> <MESSAGE value="Fixed todo" />
<MESSAGE value="Done???" /> <MESSAGE value="Done???" />
<MESSAGE value="findExpose" /> <MESSAGE value="findExpose" />
<option name="LAST_COMMIT_MESSAGE" value="findExpose" /> <MESSAGE value="I love stack overflows!!!" />
<option name="LAST_COMMIT_MESSAGE" value="I love stack overflows!!!" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager /> <breakpoint-manager />
@ -881,8 +885,8 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="175"> <state relative-caret-position="205">
<caret line="237" column="42" lean-forward="true" selection-start-line="237" selection-start-column="42" selection-end-line="237" selection-end-column="42" /> <caret line="239" column="43" lean-forward="false" selection-start-line="239" selection-start-column="43" selection-end-line="239" selection-end-column="43" />
<folding> <folding>
<element signature="e#38#58#0" expanded="true" /> <element signature="e#38#58#0" expanded="true" />
<marker date="1483149636000" expanded="true" signature="14571:14573" ph="{...}" /> <marker date="1483149636000" expanded="true" signature="14571:14573" ph="{...}" />

View file

@ -1,6 +1,22 @@
# angel_framework # angel_framework
[![pub 1.0.0-dev.40](https://img.shields.io/badge/pub-1.0.0--dev.40-red.svg)](https://pub.dartlang.org/packages/angel_framework) [![pub 1.0.0-dev.42](https://img.shields.io/badge/pub-1.0.0--dev.42-red.svg)](https://pub.dartlang.org/packages/angel_framework)
[![build status](https://travis-ci.org/angel-dart/framework.svg)](https://travis-ci.org/angel-dart/framework) [![build status](https://travis-ci.org/angel-dart/framework.svg)](https://travis-ci.org/angel-dart/framework)
Core libraries for the Angel Framework. Core libraries for the Angel Framework.
```dart
import 'package:angel_framework/angel_framework.dart';
main() async {
var app = new Angel();
app
..get('/hello', (req, res) {
res.write('world!');
})
..post('/date', () => new DateTime.now().toString());
await app.startServer();
}
```

View file

@ -45,7 +45,6 @@ class Controller {
} }
var routable = new Routable(debug: debug); var routable = new Routable(debug: debug);
app.use(exposeDecl.path, routable); app.use(exposeDecl.path, routable);
TypeMirror typeMirror = reflectType(this.runtimeType); TypeMirror typeMirror = reflectType(this.runtimeType);
String name = exposeDecl.as?.isNotEmpty == true String name = exposeDecl.as?.isNotEmpty == true
@ -79,21 +78,23 @@ class Controller {
var reflectedMethod = instanceMirror.getField(methodName).reflectee; var reflectedMethod = instanceMirror.getField(methodName).reflectee;
var middleware = []..addAll(handlers)..addAll(exposeDecl.middleware); var middleware = []..addAll(handlers)..addAll(exposeDecl.middleware);
String name = exposeDecl.as?.isNotEmpty == true
? exposeDecl.as
: MirrorSystem.getName(methodName);
// Check if normal // Check if normal
if (method.parameters.length == 2 && if (method.parameters.length == 2 &&
method.parameters[0].type.reflectedType == RequestContext && method.parameters[0].type.reflectedType == RequestContext &&
method.parameters[1].type.reflectedType == ResponseContext) { method.parameters[1].type.reflectedType == ResponseContext) {
// Create a regular route // Create a regular route
routable.addRoute(exposeDecl.method, exposeDecl.path, reflectedMethod, routeMappings[name] = routable
middleware: middleware); .addRoute(exposeDecl.method, exposeDecl.path, (req, res) async {
var result = await reflectedMethod(req, res);
return result is RequestHandler ? await result(req, res) : result;
}, middleware: middleware);
return; return;
} }
String name = exposeDecl.as?.isNotEmpty == true
? exposeDecl.as
: MirrorSystem.getName(methodName);
routeMappings[name] = routable.addRoute( routeMappings[name] = routable.addRoute(
exposeDecl.method, exposeDecl.method,
exposeDecl.path, exposeDecl.path,
@ -119,40 +120,43 @@ RequestHandler handleContained(handler, InjectionRequest injection) {
List args = []; List args = [];
void inject(requirement) { void inject(requirement) {
for (var requirement in injection.required) { if (requirement == RequestContext) {
if (requirement == RequestContext) { args.add(req);
args.add(req); } else if (requirement == ResponseContext) {
} else if (requirement == ResponseContext) { args.add(res);
args.add(res); } else if (requirement is String) {
} else if (requirement is String) { if (req.params.containsKey(requirement)) {
if (req.params.containsKey(requirement)) {} else if (req.injections
.containsKey(requirement))
args.add(req.injections[requirement]);
else {
throw new ArgumentError(
"Cannot resolve parameter '$requirement' within handler.");
}
args.add(req.params[requirement]); args.add(req.params[requirement]);
} else if (requirement is List) { } else if (req.injections.containsKey(requirement))
for (var child in requirement) { args.add(req.injections[requirement]);
try { else {
inject(child);
break;
} catch (e) {
rethrow;
}
}
} else if (requirement is Type && requirement != dynamic) {
args.add(
req.app.container.make(requirement, injecting: req.injections));
} else {
throw new ArgumentError( throw new ArgumentError(
'$requirement cannot be injected into a request handler.'); "Cannot resolve parameter '$requirement' within handler.");
} }
} else if (requirement is List &&
requirement.length == 2 &&
requirement.first is String &&
requirement.last is Type) {
String key = requirement.first;
Type type = requirement.last;
if (req.params.containsKey(key) || req.injections.containsKey(key)) {
inject(key);
} else
inject(type);
} else if (requirement is Type && requirement != dynamic) {
if (req.injections.containsKey(requirement))
args.add(req.injections[requirement]);
else
args.add(req.app.container.make(requirement));
} else {
throw new ArgumentError(
'$requirement cannot be injected into a request handler.');
} }
} }
injection.required.forEach(inject); injection.required.forEach(inject);
return Function.apply(handler, args); var result = Function.apply(handler, args);
return result is Future ? await result : result;
}; };
} }

View file

@ -321,10 +321,9 @@ class Angel extends AngelBase {
/// Runs with DI, and *always* reflects. Prefer [runContained]. /// Runs with DI, and *always* reflects. Prefer [runContained].
Future runReflected( Future runReflected(
Function handler, RequestContext req, ResponseContext res) async { Function handler, RequestContext req, ResponseContext res) async {
var injection = preInjection(handler); var h =
handleContained(handler, _preContained[handler] = preInject(handler));
_preContained[handler] = injection; return await h(req, res);
return handleContained(handler, injection);
// return await closureMirror.apply(args).reflectee; // return await closureMirror.apply(args).reflectee;
} }

View file

@ -1,5 +1,5 @@
name: angel_framework name: angel_framework
version: 1.0.0-dev.41 version: 1.0.0-dev.42
description: Core libraries for the Angel framework. description: Core libraries for the Angel framework.
author: Tobe O <thosakwe@gmail.com> author: Tobe O <thosakwe@gmail.com>
homepage: https://github.com/angel-dart/angel_framework homepage: https://github.com/angel-dart/angel_framework