Merge pull request #107 from dukefirehawk/feature/upgrade_sdk
Feature/upgrade sdk
This commit is contained in:
commit
811e68de70
72 changed files with 453 additions and 11583 deletions
|
@ -1,6 +1,6 @@
|
||||||
# Angel3 Framework
|
# Angel3 Framework
|
||||||
|
|
||||||
[![Angel3 Framework](./logo3.png)](https://github.com/dukefirehawk/angel)
|
[![Angel3 Framework](./angel3_logo.svg)](https://github.com/dukefirehawk/angel)
|
||||||
|
|
||||||
![Pub Version (including pre-releases)](https://img.shields.io/pub/v/angel3_framework?include_prereleases)
|
![Pub Version (including pre-releases)](https://img.shields.io/pub/v/angel3_framework?include_prereleases)
|
||||||
[![Null Safety](https://img.shields.io/badge/null-safety-brightgreen)](https://dart.dev/null-safety)
|
[![Null Safety](https://img.shields.io/badge/null-safety-brightgreen)](https://dart.dev/null-safety)
|
||||||
|
|
148
angel3_logo.svg
Normal file
148
angel3_logo.svg
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="128"
|
||||||
|
height="128"
|
||||||
|
viewBox="0 0 128 128"
|
||||||
|
version="1.1"
|
||||||
|
id="svg1"
|
||||||
|
inkscape:version="1.3 (0e150ed, 2023-07-21)"
|
||||||
|
sodipodi:docname="angel3_logo128.svg"
|
||||||
|
inkscape:export-filename="logo_icon_128.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview1"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showgrid="true"
|
||||||
|
inkscape:zoom="1.5862247"
|
||||||
|
inkscape:cx="58.314563"
|
||||||
|
inkscape:cy="90.466376"
|
||||||
|
inkscape:window-width="1312"
|
||||||
|
inkscape:window-height="738"
|
||||||
|
inkscape:window-x="128"
|
||||||
|
inkscape:window-y="89"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="layer1">
|
||||||
|
<inkscape:grid
|
||||||
|
id="grid1"
|
||||||
|
units="px"
|
||||||
|
originx="0"
|
||||||
|
originy="0"
|
||||||
|
spacingx="1"
|
||||||
|
spacingy="1"
|
||||||
|
empcolor="#0099e5"
|
||||||
|
empopacity="0.30196078"
|
||||||
|
color="#0099e5"
|
||||||
|
opacity="0.14901961"
|
||||||
|
empspacing="5"
|
||||||
|
dotted="false"
|
||||||
|
gridanglex="30"
|
||||||
|
gridanglez="30"
|
||||||
|
visible="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<defs
|
||||||
|
id="defs1">
|
||||||
|
<linearGradient
|
||||||
|
id="swatch6">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d81c1c;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop6" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient15"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d81c1c;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop15" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d81c1c;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop16" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="swatch13"
|
||||||
|
inkscape:swatch="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d81c1c;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop14" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="swatch7"
|
||||||
|
inkscape:swatch="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d81c1c;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop7" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#swatch13"
|
||||||
|
id="linearGradient14"
|
||||||
|
x1="76.307388"
|
||||||
|
y1="264.40897"
|
||||||
|
x2="425.84061"
|
||||||
|
y2="264.40897"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient15"
|
||||||
|
id="linearGradient16"
|
||||||
|
x1="185.07693"
|
||||||
|
y1="354.51111"
|
||||||
|
x2="296.18161"
|
||||||
|
y2="354.51111"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:137.557px;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;opacity:1;fill:#000000;fill-opacity:1;stroke-width:0.716443"
|
||||||
|
x="-115.63483"
|
||||||
|
y="107.96973"
|
||||||
|
id="text1"
|
||||||
|
transform="matrix(-0.01157892,-1.0160496,0.98407611,-0.01121455,0,0)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan1"
|
||||||
|
x="-115.63483"
|
||||||
|
y="107.96973"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:137.557px;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke-width:0.716443">A</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:74.3369px;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;opacity:1;fill:#d81c1c;fill-opacity:1;stroke:#ffffff;stroke-width:0.980329;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
x="-100.58853"
|
||||||
|
y="107.32352"
|
||||||
|
id="text2"
|
||||||
|
transform="matrix(-1.1771598,0.04030269,0.03112649,0.84843667,0,0)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan2"
|
||||||
|
x="-100.58853"
|
||||||
|
y="107.32352"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:74.3369px;font-family:'Comic Sans MS';-inkscape-font-specification:'Comic Sans MS, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#d81c1c;fill-opacity:1;stroke:#ffffff;stroke-width:0.980329;stroke-dasharray:none;stroke-opacity:1">3</tspan></text>
|
||||||
|
<circle
|
||||||
|
style="fill:#d81c1c;fill-opacity:1;stroke:#ffffff;stroke-width:3.00094488;stroke-dasharray:none"
|
||||||
|
id="path6"
|
||||||
|
cx="25.217106"
|
||||||
|
cy="52.325504"
|
||||||
|
r="3.7825663" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 6 KiB After Width: | Height: | Size: 6 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
@ -1 +0,0 @@
|
||||||
include: package:lints/recommended.yaml
|
|
|
@ -1,27 +0,0 @@
|
||||||
import 'package:angel3_container/mirrors.dart';
|
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
|
||||||
import 'package:angel3_framework/http.dart';
|
|
||||||
import 'package:logging/logging.dart';
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
print("Starting up");
|
|
||||||
//Logger.root.onRecord.listen(print);
|
|
||||||
|
|
||||||
var app = Angel(logger: Logger('example'), reflector: MirrorsReflector());
|
|
||||||
var http = AngelHttp(app);
|
|
||||||
|
|
||||||
app.get("/", (req, res) => "Hello, world!");
|
|
||||||
|
|
||||||
// Simple fallback to throw a 404 on unknown paths.
|
|
||||||
/*
|
|
||||||
app.fallback((req, res) {
|
|
||||||
throw AngelHttpException.notFound(
|
|
||||||
message: 'Unknown path: "${req.uri?.path}"',
|
|
||||||
);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
await http.startServer('localhost', 3000);
|
|
||||||
|
|
||||||
print("End");
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
import 'dart:mirrors';
|
|
||||||
import 'package:example1/src/models.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
final stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var reflectedClass = reflect(Shape());
|
|
||||||
|
|
||||||
reflectedClass.invoke(#draw, []);
|
|
||||||
|
|
||||||
//reflectedClass.invoke(Symbol('draw'), []);
|
|
||||||
|
|
||||||
print('Reflection executed in ${stopwatch.elapsed.inMilliseconds} ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
printAnnotationValue(String);
|
|
||||||
printAnnotationValue(Shape);
|
|
||||||
printAnnotationValue(Square);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Shape {
|
|
||||||
void draw() => print("Draw Shape");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Person('Will', 'Tom')
|
|
||||||
class Square {
|
|
||||||
void greetHii() {
|
|
||||||
print("Hii Welcome to flutter agency");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void printAnnotationValue(final Type clazz) {
|
|
||||||
final DeclarationMirror clazzDeclaration = reflectClass(clazz);
|
|
||||||
final ClassMirror someAnnotationMirror = reflectClass(Person);
|
|
||||||
final annotationInstsanceMirror =
|
|
||||||
clazzDeclaration.metadata.where((d) => d.type == someAnnotationMirror);
|
|
||||||
if (annotationInstsanceMirror.isEmpty) {
|
|
||||||
print('No annotated class found');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final someAnnotationInstance =
|
|
||||||
(annotationInstsanceMirror.first.reflectee as Person);
|
|
||||||
print(someAnnotationInstance.firstName);
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
class Person {
|
|
||||||
final String firstName;
|
|
||||||
final String lastName;
|
|
||||||
const Person(this.firstName, this.lastName);
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
name: example1
|
|
||||||
version: 0.0.1
|
|
||||||
description: Example 1.
|
|
||||||
environment:
|
|
||||||
sdk: '>=2.18.0 <3.0.0'
|
|
||||||
dependencies:
|
|
||||||
angel3_container: ^7.0.0
|
|
||||||
angel3_http_exception: ^7.0.0
|
|
||||||
angel3_framework: ^7.0.0
|
|
||||||
angel3_model: ^7.0.0
|
|
||||||
angel3_route: ^7.0.0
|
|
||||||
angel3_mock_request: ^7.0.0
|
|
||||||
belatuk_merge_map: ^4.0.0
|
|
||||||
belatuk_combinator: ^4.0.0
|
|
||||||
belatuk_http_server: ^3.0.0
|
|
||||||
charcode: ^1.2.0
|
|
||||||
file: ^6.1.0
|
|
||||||
http_parser: ^4.0.0
|
|
||||||
http2: ^2.0.0
|
|
||||||
logging: ^1.0.0
|
|
||||||
matcher: ^0.12.10
|
|
||||||
meta: ^1.3.0
|
|
||||||
mime: ^1.0.0
|
|
||||||
path: ^1.8.0
|
|
||||||
quiver: ^3.0.1
|
|
||||||
recase: ^4.0.0
|
|
||||||
stack_trace: ^1.10.0
|
|
||||||
string_scanner: ^1.1.0
|
|
||||||
tuple: ^2.0.0
|
|
||||||
uuid: ^3.0.1
|
|
||||||
collection: ^1.15.0
|
|
||||||
dev_dependencies:
|
|
||||||
http: ^0.13.1
|
|
||||||
io: ^1.0.0
|
|
||||||
test: ^1.21.0
|
|
||||||
lints: ^2.0.0
|
|
||||||
# dependency_overrides:
|
|
||||||
# angel3_container:
|
|
||||||
# path: ../container/angel_container
|
|
||||||
# angel3_http_exception:
|
|
||||||
# path: ../http_exception
|
|
||||||
# angel3_model:
|
|
||||||
# path: ../model
|
|
||||||
# angel3_route:
|
|
||||||
# path: ../route
|
|
||||||
# angel3_mock_request:
|
|
||||||
# path: ../mock_request
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
include: package:lints/recommended.yaml
|
|
|
@ -1,46 +0,0 @@
|
||||||
import 'package:angel3_container/mirrors.dart';
|
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
|
||||||
import 'package:angel3_framework/http.dart';
|
|
||||||
|
|
||||||
@Expose('/controller', method: 'GET')
|
|
||||||
class MyController extends Controller {
|
|
||||||
@Expose('/', method: 'GET')
|
|
||||||
Future<String> route1(RequestContext req, ResponseContext res) async {
|
|
||||||
return "My route";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Expose('/sales', middleware: [process1])
|
|
||||||
class SalesController extends Controller {
|
|
||||||
@Expose('/', middleware: [process2])
|
|
||||||
Future<String> route1(RequestContext req, ResponseContext res) async {
|
|
||||||
return "Sales route";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process1(RequestContext req, ResponseContext res) {
|
|
||||||
res.write('Hello, ');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process2(RequestContext req, ResponseContext res) {
|
|
||||||
res.write('From Sales, ');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
// Using Mirror Reflector
|
|
||||||
var app = Angel(reflector: MirrorsReflector());
|
|
||||||
|
|
||||||
// My Controller
|
|
||||||
app.container.registerSingleton<MyController>(MyController());
|
|
||||||
await app.mountController<MyController>();
|
|
||||||
|
|
||||||
// Sales Controller
|
|
||||||
app.container.registerSingleton<SalesController>(SalesController());
|
|
||||||
await app.mountController<SalesController>();
|
|
||||||
|
|
||||||
var http = AngelHttp(app);
|
|
||||||
var server = await http.startServer('localhost', 3000);
|
|
||||||
print("Angel server listening at ${http.uri}");
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
import 'package:angel3_container/mirrors.dart';
|
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
|
||||||
import 'package:angel3_framework/http.dart';
|
|
||||||
|
|
||||||
class Todo extends Model {
|
|
||||||
String? text;
|
|
||||||
String? over;
|
|
||||||
|
|
||||||
Todo({this.text, this.over});
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
return {
|
|
||||||
'text': text,
|
|
||||||
'over': over,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Expose('/todo', method: 'GET')
|
|
||||||
class TodoController extends Controller {
|
|
||||||
@Expose('/')
|
|
||||||
Todo todo(Todo singleton) => singleton;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Expose('/controller', method: 'GET')
|
|
||||||
class MyController extends Controller {
|
|
||||||
@Expose('/', method: 'GET')
|
|
||||||
Future<String> route1(RequestContext req, ResponseContext res) async {
|
|
||||||
return "My route";
|
|
||||||
}
|
|
||||||
|
|
||||||
//Todo todo(Todo singleton) => singleton;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Expose('/sales', middleware: [process1])
|
|
||||||
class SalesController extends Controller {
|
|
||||||
@Expose('/', middleware: [process2])
|
|
||||||
Future<String> route1(RequestContext req, ResponseContext res) async {
|
|
||||||
return "Sales route";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process1(RequestContext req, ResponseContext res) {
|
|
||||||
res.write('Hello, ');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool process2(RequestContext req, ResponseContext res) {
|
|
||||||
res.write('From Sales, ');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
// Using Mirror Reflector
|
|
||||||
var app = Angel(reflector: MirrorsReflector());
|
|
||||||
|
|
||||||
await app.configure(MyController().configureServer);
|
|
||||||
await app.configure(SalesController().configureServer);
|
|
||||||
|
|
||||||
var http = AngelHttp(app);
|
|
||||||
var server = await http.startServer('localhost', 3000);
|
|
||||||
print("Angel server listening at ${http.uri}");
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
import 'package:angel3_container_generator/angel3_container_generator.dart';
|
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
|
||||||
import 'package:angel3_framework/http.dart';
|
|
||||||
|
|
||||||
import 'example3_controller.reflectable.dart';
|
|
||||||
|
|
||||||
@contained
|
|
||||||
@Expose('/controller', method: 'GET')
|
|
||||||
class MyController extends Controller {
|
|
||||||
@Expose('/')
|
|
||||||
Order order(Order singleton) => singleton;
|
|
||||||
|
|
||||||
//Todo todo(Todo singleton) => singleton;
|
|
||||||
}
|
|
||||||
|
|
||||||
class Todo extends Model {
|
|
||||||
String? text;
|
|
||||||
String? over;
|
|
||||||
|
|
||||||
Todo({this.text, this.over});
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
return {
|
|
||||||
'text': text,
|
|
||||||
'over': over,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class FoodItem {
|
|
||||||
final String name;
|
|
||||||
final num price;
|
|
||||||
final num qty;
|
|
||||||
|
|
||||||
FoodItem(this.name, this.price, this.qty);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Order {
|
|
||||||
FoodItem item;
|
|
||||||
|
|
||||||
String? get name => item.name;
|
|
||||||
|
|
||||||
Order(this.item);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
//var reflector = const GeneratedReflector();
|
|
||||||
//Container container = Container(reflector);
|
|
||||||
//container.registerSingleton<SalesController>(SalesController());
|
|
||||||
|
|
||||||
// Using GeneratedReflector
|
|
||||||
initializeReflectable();
|
|
||||||
var app = Angel(reflector: GeneratedReflector());
|
|
||||||
|
|
||||||
// Using MirrorReflector
|
|
||||||
//var app = Angel(reflector: MirrorsReflector());
|
|
||||||
//await app.configure(MyController().configureServer);
|
|
||||||
|
|
||||||
// My Controller
|
|
||||||
//app.container.registerSingleton<MyController>(MyController());
|
|
||||||
//await app.mountController<MyController>();
|
|
||||||
await app.configure(MyController().configureServer);
|
|
||||||
|
|
||||||
// Sales Controller
|
|
||||||
//app.container.registerSingleton<SalesController>(SalesController());
|
|
||||||
//await app.mountController<SalesController>();
|
|
||||||
|
|
||||||
var http = AngelHttp(app);
|
|
||||||
|
|
||||||
var server = await http.startServer('localhost', 3000);
|
|
||||||
print("Angel server listening at ${http.uri}");
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,44 +0,0 @@
|
||||||
import 'package:example2/src/models.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
final stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
//var reflectedClass = reflect(Shape());
|
|
||||||
|
|
||||||
//reflectedClass.invoke(#draw, []);
|
|
||||||
|
|
||||||
//reflectedClass.invoke(Symbol('draw'), []);
|
|
||||||
|
|
||||||
print('Reflection executed in ${stopwatch.elapsed.inMilliseconds} ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
//printAnnotationValue(String);
|
|
||||||
//printAnnotationValue(Shape);
|
|
||||||
//printAnnotationValue(Square);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Shape {
|
|
||||||
void draw() => print("Draw Shape");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Person('Will', 'Tom')
|
|
||||||
class Square {
|
|
||||||
void greetHii() {
|
|
||||||
print("Hii Welcome to flutter agency");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
void printAnnotationValue(final Type clazz) {
|
|
||||||
final DeclarationMirror clazzDeclaration = reflectClass(clazz);
|
|
||||||
final ClassMirror someAnnotationMirror = reflectClass(Person);
|
|
||||||
final annotationInstsanceMirror =
|
|
||||||
clazzDeclaration.metadata.where((d) => d.type == someAnnotationMirror);
|
|
||||||
if (annotationInstsanceMirror.isEmpty) {
|
|
||||||
print('No annotated class found');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final someAnnotationInstance =
|
|
||||||
(annotationInstsanceMirror.first.reflectee as Person);
|
|
||||||
print(someAnnotationInstance.firstName);
|
|
||||||
}
|
|
||||||
*/
|
|
|
@ -1,9 +0,0 @@
|
||||||
targets:
|
|
||||||
$default:
|
|
||||||
builders:
|
|
||||||
reflectable:
|
|
||||||
generate_for:
|
|
||||||
#- lib/**_controller.dart
|
|
||||||
- bin/**_controller.dart
|
|
||||||
options:
|
|
||||||
formatted: true
|
|
|
@ -1,15 +0,0 @@
|
||||||
import 'package:angel3_container_generator/angel3_container_generator.dart';
|
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
|
||||||
|
|
||||||
@Expose('/hr')
|
|
||||||
class HrController extends Controller {
|
|
||||||
@Expose('/')
|
|
||||||
landingPage() => "Hello, world!";
|
|
||||||
}
|
|
||||||
|
|
||||||
@contained
|
|
||||||
class SalesController extends Controller {
|
|
||||||
landingPage() => "Hello, world!";
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() {}
|
|
|
@ -1,5 +0,0 @@
|
||||||
class Person {
|
|
||||||
final String firstName;
|
|
||||||
final String lastName;
|
|
||||||
const Person(this.firstName, this.lastName);
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
name: example2
|
|
||||||
version: 0.0.1
|
|
||||||
description: Example 2.
|
|
||||||
environment:
|
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
|
||||||
dependencies:
|
|
||||||
angel3_container: ^7.1.0-beta.1
|
|
||||||
angel3_container_generator: ^7.1.0-beta.1
|
|
||||||
angel3_http_exception: ^7.0.0
|
|
||||||
angel3_framework: ^7.0.0
|
|
||||||
angel3_model: ^7.0.0
|
|
||||||
angel3_route: ^7.0.0
|
|
||||||
angel3_mock_request: ^7.0.0
|
|
||||||
belatuk_merge_map: ^4.0.0
|
|
||||||
belatuk_combinator: ^4.0.0
|
|
||||||
belatuk_http_server: ^3.0.0
|
|
||||||
charcode: ^1.2.0
|
|
||||||
file: ^6.1.0
|
|
||||||
http_parser: ^4.0.0
|
|
||||||
http2: ^2.0.0
|
|
||||||
logging: ^1.0.0
|
|
||||||
matcher: ^0.12.10
|
|
||||||
meta: ^1.3.0
|
|
||||||
mime: ^1.0.0
|
|
||||||
path: ^1.8.0
|
|
||||||
quiver: ^3.0.1
|
|
||||||
recase: ^4.0.0
|
|
||||||
stack_trace: ^1.10.0
|
|
||||||
string_scanner: ^1.1.0
|
|
||||||
tuple: ^2.0.0
|
|
||||||
uuid: ^3.0.1
|
|
||||||
collection: ^1.15.0
|
|
||||||
reflectable: ^4.0.2
|
|
||||||
dev_dependencies:
|
|
||||||
build_runner: ^2.1.2
|
|
||||||
http: ^0.13.1
|
|
||||||
io: ^1.0.0
|
|
||||||
test: ^1.21.0
|
|
||||||
lints: ^2.0.0
|
|
||||||
# dependency_overrides:
|
|
||||||
# angel3_container:
|
|
||||||
# path: ../../../packages/container/angel_container
|
|
||||||
# angel3_container_generator:
|
|
||||||
# path: ../../../packages/container/angel_container_generator
|
|
||||||
# angel3_framework:
|
|
||||||
# path: ../../../packages/framework
|
|
||||||
# angel3_model:
|
|
||||||
# path: ../model
|
|
||||||
# angel3_route:
|
|
||||||
# path: ../route
|
|
||||||
# angel3_mock_request:
|
|
||||||
# path: ../mock_request
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
import 'package:angel3_container_generator/angel3_container_generator.dart';
|
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
|
||||||
|
|
||||||
@Expose('/hr')
|
|
||||||
class HrController extends Controller {
|
|
||||||
@Expose('/')
|
|
||||||
landingPage() => "Hello, world!";
|
|
||||||
}
|
|
||||||
|
|
||||||
@contained
|
|
||||||
class SalesController extends Controller {
|
|
||||||
|
|
||||||
landingPage() => "Hello, world!";
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
Primary Authors
|
|
||||||
===============
|
|
||||||
|
|
||||||
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
|
|
||||||
|
|
||||||
The current main maintainer of the code base.
|
|
|
@ -1,29 +0,0 @@
|
||||||
BSD 3-Clause License
|
|
||||||
|
|
||||||
Copyright (c) 2021, dukefirehawk.com
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. Neither the name of the copyright holder nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1 +0,0 @@
|
||||||
include: package:lints/recommended.yaml
|
|
|
@ -1,93 +0,0 @@
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:mysql_client/mysql_client.dart';
|
|
||||||
import 'package:mysql1/mysql1.dart';
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
print("=== Start 'mysql1' driver test");
|
|
||||||
await testMySQL1Driver().catchError((error, stackTrace) {
|
|
||||||
print(error);
|
|
||||||
});
|
|
||||||
print("=== End test");
|
|
||||||
print(" ");
|
|
||||||
|
|
||||||
print("=== Start 'mysql_client' driver test");
|
|
||||||
await testMySQLClientDriver().catchError((error, stackTrace) {
|
|
||||||
print(error);
|
|
||||||
});
|
|
||||||
print("=== End test");
|
|
||||||
print(" ");
|
|
||||||
|
|
||||||
//sleep(Duration(seconds: 5));
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> testMySQLClientDriver() async {
|
|
||||||
var connection = await MySQLConnection.createConnection(
|
|
||||||
host: "localhost",
|
|
||||||
port: 3306,
|
|
||||||
databaseName: "orm_test",
|
|
||||||
userName: "test",
|
|
||||||
password: "test123",
|
|
||||||
secure: false);
|
|
||||||
await connection.connect(timeoutMs: 30000);
|
|
||||||
|
|
||||||
print(">Test Select All");
|
|
||||||
var result = await connection.execute("SELECT * from users");
|
|
||||||
print("Total records: ${result.rows.length}");
|
|
||||||
|
|
||||||
print(">Test Insert");
|
|
||||||
var params = {
|
|
||||||
"username": "test",
|
|
||||||
"password": "test123",
|
|
||||||
"email": "test@demo.com",
|
|
||||||
"updatedAt": DateTime.parse("1970-01-01 00:00:00")
|
|
||||||
};
|
|
||||||
|
|
||||||
result = await connection.execute(
|
|
||||||
"INSERT INTO users (username, password, email, updated_at) VALUES (:username, :password, :email, :updatedAt)",
|
|
||||||
params);
|
|
||||||
print("Last inserted ID: ${result.lastInsertID}");
|
|
||||||
|
|
||||||
print(">Test Select By ID");
|
|
||||||
result = await connection.execute(
|
|
||||||
"SELECT * from users where id=:id", {"id": result.lastInsertID.toInt()});
|
|
||||||
print("Read record: ${result.rows.first.assoc()}");
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> testMySQL1Driver() async {
|
|
||||||
var settings = ConnectionSettings(
|
|
||||||
host: 'localhost',
|
|
||||||
port: 3306,
|
|
||||||
db: 'orm_test',
|
|
||||||
user: 'test',
|
|
||||||
password: 'test123',
|
|
||||||
timeout: Duration(seconds: 60));
|
|
||||||
var connection = await MySqlConnection.connect(settings);
|
|
||||||
|
|
||||||
print(">Test Select All");
|
|
||||||
var result = await connection.query("SELECT * from users");
|
|
||||||
print("Total records: ${result.length}");
|
|
||||||
|
|
||||||
print(">Test Insert");
|
|
||||||
var params = [
|
|
||||||
"test",
|
|
||||||
"test123",
|
|
||||||
"test@demo.com",
|
|
||||||
DateTime.parse("1970-01-01 00:00:00").toUtc()
|
|
||||||
];
|
|
||||||
|
|
||||||
// DateTime.parse("1970-01-01 00:00:01").toUtc()
|
|
||||||
result = await connection.query(
|
|
||||||
"INSERT INTO users (username, password, email, updated_at) VALUES (?, ?, ?, ?)",
|
|
||||||
params);
|
|
||||||
print("Last inserted ID: ${result.insertId}");
|
|
||||||
|
|
||||||
print(">Test Select By ID");
|
|
||||||
result = await connection
|
|
||||||
.query("SELECT * from users where id=?", [result.insertId]);
|
|
||||||
print("Read record: ${result.first.values}");
|
|
||||||
|
|
||||||
var d = DateTime.parse("1970-01-01 00:00:00").toUtc();
|
|
||||||
print("Local time: ${d.toLocal()}");
|
|
||||||
}
|
|
|
@ -1,53 +0,0 @@
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:postgres/postgres.dart';
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
/*
|
|
||||||
* Granting permission in postgres
|
|
||||||
* grant all privileges on database orm_test to test;
|
|
||||||
* grant all privileges on sequence users_id_seq to test;
|
|
||||||
*/
|
|
||||||
print("=== Start 'postgres' driver test");
|
|
||||||
await testPgDriver().catchError((error, stackTrace) {
|
|
||||||
print(error);
|
|
||||||
});
|
|
||||||
print("=== End test");
|
|
||||||
print(" ");
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> testPgDriver() async {
|
|
||||||
var conn = PostgreSQLConnection('localhost', 5432, 'orm_test',
|
|
||||||
username: 'test', password: 'test123');
|
|
||||||
await conn.open();
|
|
||||||
|
|
||||||
print(">Test Select All");
|
|
||||||
var result = await conn.query("SELECT * from users");
|
|
||||||
print("Total records: ${result.length}");
|
|
||||||
for (var row in result) {
|
|
||||||
print(row[0]);
|
|
||||||
for (var element in row) {
|
|
||||||
print(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
print(">Test Insert");
|
|
||||||
var params = {
|
|
||||||
"username": "test",
|
|
||||||
"password": "test123",
|
|
||||||
"email": "test@demo.com",
|
|
||||||
"updatedAt": DateTime.parse("1970-01-01 00:00:00")
|
|
||||||
};
|
|
||||||
|
|
||||||
result = await conn.query(
|
|
||||||
"INSERT INTO users (username, password, email, updated_at) VALUES (@username, @password, @email, @updatedAt)",
|
|
||||||
substitutionValues: params);
|
|
||||||
//print("Last inserted ID: ${result.}");
|
|
||||||
|
|
||||||
//print(">Test Select By ID");
|
|
||||||
//result = await conn.query("SELECT * from users where id=@id",
|
|
||||||
// substitutionValues: {"id": result});
|
|
||||||
//print("Read record: ${result.length}");
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
name: performance_tool
|
|
||||||
version: 1.0.0
|
|
||||||
description: Angel3 performance testing tool
|
|
||||||
publish_to: none
|
|
||||||
environment:
|
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
|
||||||
published_to: none
|
|
||||||
dependencies:
|
|
||||||
mysql1: ^0.20.0
|
|
||||||
mysql_client: ^0.0.24
|
|
||||||
postgres: ^2.4.1
|
|
||||||
postgres_pool: ^2.1.3
|
|
||||||
dev_dependencies:
|
|
||||||
lints: ^2.0.0
|
|
|
@ -1,6 +0,0 @@
|
||||||
Primary Authors
|
|
||||||
===============
|
|
||||||
|
|
||||||
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
|
|
||||||
|
|
||||||
The current main maintainer of the code base.
|
|
|
@ -1,29 +0,0 @@
|
||||||
BSD 3-Clause License
|
|
||||||
|
|
||||||
Copyright (c) 2021, dukefirehawk.com
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. Neither the name of the copyright holder nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1 +0,0 @@
|
||||||
include: package:lints/recommended.yaml
|
|
|
@ -1,22 +0,0 @@
|
||||||
import 'dart:isolate';
|
|
||||||
|
|
||||||
Future<void> runApp(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
// Do something
|
|
||||||
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
var concurrency = 6000;
|
|
||||||
|
|
||||||
for (var i = 0; i < concurrency; i++) {
|
|
||||||
Isolate.spawn(runApp, 'Instance_$i');
|
|
||||||
}
|
|
||||||
|
|
||||||
await Future.delayed(const Duration(seconds: 10));
|
|
||||||
|
|
||||||
//print("Exit");
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
name: performance_tool
|
|
||||||
version: 1.0.0
|
|
||||||
description: Angel3 performance testing tool
|
|
||||||
publish_to: none
|
|
||||||
environment:
|
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
|
||||||
published_to: none
|
|
||||||
dependencies:
|
|
||||||
http: ^0.13.4
|
|
||||||
dev_dependencies:
|
|
||||||
lints: ^2.0.0
|
|
|
@ -1,6 +0,0 @@
|
||||||
Primary Authors
|
|
||||||
===============
|
|
||||||
|
|
||||||
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
|
|
||||||
|
|
||||||
The current main maintainer of the code base.
|
|
|
@ -1,29 +0,0 @@
|
||||||
BSD 3-Clause License
|
|
||||||
|
|
||||||
Copyright (c) 2021, dukefirehawk.com
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
3. Neither the name of the copyright holder nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1 +0,0 @@
|
||||||
include: package:lints/recommended.yaml
|
|
|
@ -1,104 +0,0 @@
|
||||||
import 'dart:isolate';
|
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
|
|
||||||
Future<void> fortunes(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var url = Uri.http('localhost:8080', '/fortunes');
|
|
||||||
var response = await http.get(url);
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
print('Execution($message): success');
|
|
||||||
} else {
|
|
||||||
print('Execution($message): error');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> plaintext(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var url = Uri.http('localhost:8080', '/plaintext');
|
|
||||||
var response = await http.get(url);
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
print('Execution($message): ${response.body}.');
|
|
||||||
} else {
|
|
||||||
print('Execution($message): error');
|
|
||||||
}
|
|
||||||
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> json(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var url = Uri.http('localhost:8080', '/json');
|
|
||||||
var response = await http.get(url);
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
print('Execution($message): success');
|
|
||||||
} else {
|
|
||||||
print('Execution($message): error');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> dbUpdate(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var url = Uri.http('localhost:8080', '/updates', {'queries': "5"});
|
|
||||||
var response = await http.get(url);
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
print('Execution($message): success');
|
|
||||||
} else {
|
|
||||||
print('Execution($message): error');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> dbSingleQuery(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var url = Uri.http('localhost:8080', '/db');
|
|
||||||
var response = await http.get(url);
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
print('Execution($message): success');
|
|
||||||
} else {
|
|
||||||
print('Execution($message): error');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> dbMultipleQuery(var message) async {
|
|
||||||
var stopwatch = Stopwatch()..start();
|
|
||||||
|
|
||||||
var url = Uri.http('localhost:8080', '/query', {'queries': "5"});
|
|
||||||
var response = await http.get(url);
|
|
||||||
print('Execution($message) Time: ${stopwatch.elapsed.inMilliseconds}ms');
|
|
||||||
stopwatch.stop();
|
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
|
||||||
print('Execution($message): success');
|
|
||||||
} else {
|
|
||||||
print('Execution($message): error');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
var concurrency = 2000;
|
|
||||||
|
|
||||||
for (var i = 0; i < concurrency; i++) {
|
|
||||||
Isolate.spawn(dbSingleQuery, 'Instance_$i');
|
|
||||||
}
|
|
||||||
|
|
||||||
await Future.delayed(const Duration(seconds: 10));
|
|
||||||
|
|
||||||
//print("Exit");
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
name: performance_tool
|
|
||||||
version: 1.0.0
|
|
||||||
description: Angel3 performance testing tool
|
|
||||||
publish_to: none
|
|
||||||
environment:
|
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
|
||||||
published_to: none
|
|
||||||
dependencies:
|
|
||||||
http: ^0.13.4
|
|
||||||
dev_dependencies:
|
|
||||||
lints: ^2.0.0
|
|
|
@ -1,19 +0,0 @@
|
||||||
### JSON Test
|
|
||||||
GET http://localhost:8080/json HTTP/1.1
|
|
||||||
|
|
||||||
### Plaintext Test
|
|
||||||
GET http://localhost:8080/plaintext HTTP/1.1
|
|
||||||
|
|
||||||
### Fortunes Test
|
|
||||||
GET http://localhost:8080/fortunes HTTP/1.1
|
|
||||||
|
|
||||||
### Db Test
|
|
||||||
GET http://localhost:8080/db HTTP/1.1
|
|
||||||
|
|
||||||
### Query test
|
|
||||||
GET http://localhost:8080/query?queries=20 HTTP/1.1
|
|
||||||
|
|
||||||
### Update Test
|
|
||||||
GET http://localhost:8080/updates?queries=20 HTTP/1.1
|
|
||||||
|
|
||||||
|
|
BIN
logo3.xcf
BIN
logo3.xcf
Binary file not shown.
BIN
logo_icon_512.png
Normal file
BIN
logo_icon_512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
|
@ -1,5 +1,9 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.1.0
|
||||||
|
|
||||||
|
* Updated `uuid` to 4.0.0
|
||||||
|
|
||||||
## 8.0.0
|
## 8.0.0
|
||||||
|
|
||||||
* Require Dart >= 3.0
|
* Require Dart >= 3.0
|
||||||
|
|
|
@ -108,6 +108,8 @@ abstract class Driver<
|
||||||
|
|
||||||
/// Handles a single request.
|
/// Handles a single request.
|
||||||
Future handleRawRequest(Request request, Response response) {
|
Future handleRawRequest(Request request, Response response) {
|
||||||
|
app.logger.info('[Server] Called handleRawRequest');
|
||||||
|
|
||||||
return createRequestContext(request, response).then((req) {
|
return createRequestContext(request, response).then((req) {
|
||||||
return createResponseContext(request, response, req).then((res) {
|
return createResponseContext(request, response, req).then((res) {
|
||||||
Future handle() {
|
Future handle() {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel3_framework
|
name: angel3_framework
|
||||||
version: 8.0.0
|
version: 8.1.0
|
||||||
description: A high-powered HTTP server extensible framework with dependency injection, routing and much more.
|
description: A high-powered HTTP server extensible framework with dependency injection, routing and much more.
|
||||||
homepage: https://angel3-framework.web.app/
|
homepage: https://angel3-framework.web.app/
|
||||||
repository: https://github.com/dukefirehawk/angel/tree/master/packages/framework
|
repository: https://github.com/dukefirehawk/angel/tree/master/packages/framework
|
||||||
|
@ -28,7 +28,7 @@ dependencies:
|
||||||
stack_trace: ^1.11.0
|
stack_trace: ^1.11.0
|
||||||
string_scanner: ^1.2.0
|
string_scanner: ^1.2.0
|
||||||
tuple: ^2.0.0
|
tuple: ^2.0.0
|
||||||
uuid: ^3.0.0
|
uuid: ^4.0.0
|
||||||
collection: ^1.17.0
|
collection: ^1.17.0
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
http: ^1.0.0
|
http: ^1.0.0
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.1.0
|
||||||
|
|
||||||
|
* Upgraded to `analyzer` 6.2.x
|
||||||
|
|
||||||
## 8.0.0
|
## 8.0.0
|
||||||
|
|
||||||
* Require Dart >= 3.0
|
* Require Dart >= 3.0
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
name: jael3_web
|
name: jael3_web
|
||||||
version: 8.0.0
|
version: 8.1.0
|
||||||
description: Experimental virtual DOM/SPA engine built on Jael3. Supports SSR.
|
description: Experimental virtual DOM/SPA engine built on Jael3. Supports SSR.
|
||||||
publish_to: none
|
publish_to: none
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
analyzer: ^5.0.0
|
analyzer: ^6.2.0
|
||||||
build: ^2.0.2
|
build: ^2.0.2
|
||||||
build_config: ^1.0.0
|
build_config: ^1.0.0
|
||||||
code_builder: ^4.0.0
|
code_builder: ^4.0.0
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.1.0
|
||||||
|
|
||||||
|
* Update `jinja` to 0.5.0
|
||||||
|
|
||||||
## 8.0.0
|
## 8.0.0
|
||||||
|
|
||||||
* Require Dart >= 3.0
|
* Require Dart >= 3.0
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
name: angel3_jinja
|
name: angel3_jinja
|
||||||
version: 8.0.0
|
version: 8.1.0
|
||||||
description: A service that renders Jinja2 template into HTML view for Angel3. Ported from Python to Dart.
|
description: A service that renders Jinja2 template into HTML view for Angel3. Ported from Python to Dart.
|
||||||
homepage: https://github.com/dukefirehawk/angel/tree/master/packages/jinja
|
homepage: https://github.com/dukefirehawk/angel/tree/master/packages/jinja
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
angel3_framework: ^8.0.0
|
angel3_framework: ^8.0.0
|
||||||
jinja: ^0.4.2
|
jinja: ^0.5.0
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
angel3_test: ^8.0.0
|
angel3_test: ^8.0.0
|
||||||
path: ^1.8.0
|
path: ^1.8.0
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.0.0
|
||||||
|
|
||||||
|
* Require Dart >= 3.0
|
||||||
|
* Upgraded `mongo_dart` to 0.9.3
|
||||||
|
|
||||||
## 7.0.0
|
## 7.0.0
|
||||||
|
|
||||||
* Require Dart >= 2.17
|
* Require Dart >= 2.17
|
||||||
|
|
|
@ -9,21 +9,21 @@ dependencies:
|
||||||
angel3_framework: ^8.0.0
|
angel3_framework: ^8.0.0
|
||||||
belatuk_json_serializer: ^7.0.0
|
belatuk_json_serializer: ^7.0.0
|
||||||
belatuk_merge_map: ^5.0.0
|
belatuk_merge_map: ^5.0.0
|
||||||
mongo_dart: ^0.7.0
|
mongo_dart: ^0.9.0
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
http: ^1.0.0
|
http: ^1.0.0
|
||||||
test: ^1.24.0
|
test: ^1.24.0
|
||||||
lints: ^2.1.0
|
lints: ^2.1.0
|
||||||
dependency_overrides:
|
# dependency_overrides:
|
||||||
angel3_container:
|
# angel3_container:
|
||||||
path: ../container/angel_container
|
# path: ../container/angel_container
|
||||||
angel3_framework:
|
# angel3_framework:
|
||||||
path: ../framework
|
# path: ../framework
|
||||||
angel3_http_exception:
|
# angel3_http_exception:
|
||||||
path: ../http_exception
|
# path: ../http_exception
|
||||||
angel3_model:
|
# angel3_model:
|
||||||
path: ../model
|
# path: ../model
|
||||||
angel3_route:
|
# angel3_route:
|
||||||
path: ../route
|
# path: ../route
|
||||||
angel3_mock_request:
|
# angel3_mock_request:
|
||||||
path: ../mock_request
|
# path: ../mock_request
|
|
@ -1,5 +1,9 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.1.0
|
||||||
|
|
||||||
|
* Updated to `uuid`
|
||||||
|
|
||||||
## 8.0.0
|
## 8.0.0
|
||||||
|
|
||||||
* Require Dart >= 3.0
|
* Require Dart >= 3.0
|
||||||
|
|
|
@ -20,8 +20,8 @@ In your `pubspec.yaml`:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
dependencies:
|
dependencies:
|
||||||
angel3_framework: ^6.0.0
|
angel3_framework: ^8.0.0
|
||||||
angel3_oauth2: ^6.0.0
|
angel3_oauth2: ^8.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
94
packages/oauth2/example/example1.dart
Normal file
94
packages/oauth2/example/example1.dart
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:angel3_container/mirrors.dart';
|
||||||
|
import 'package:angel3_framework/angel3_framework.dart';
|
||||||
|
import 'package:angel3_oauth2/angel3_oauth2.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
|
import '../test/common.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
Logger.root.level = Level.ALL;
|
||||||
|
Logger.root.onRecord.listen((record) {
|
||||||
|
print(
|
||||||
|
'${record.time} ${record.level.name.padLeft(6, ' ')} [${record.loggerName}] : ${record.message}');
|
||||||
|
if (record.error != null) print(record.error);
|
||||||
|
if (record.stackTrace != null) print(record.stackTrace);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Declae the function
|
||||||
|
void setUp() async {
|
||||||
|
var app = Angel(reflector: MirrorsReflector());
|
||||||
|
var oauth2 = _AuthorizationServer();
|
||||||
|
|
||||||
|
app.group('/oauth2', (router) {
|
||||||
|
router
|
||||||
|
..get('/authorize', oauth2.authorizationEndpoint)
|
||||||
|
..post('/token', oauth2.tokenEndpoint);
|
||||||
|
});
|
||||||
|
|
||||||
|
//app.logger.level = Level.ALL;
|
||||||
|
app.logger = Logger("oauth2")
|
||||||
|
..onRecord.listen((rec) {
|
||||||
|
print(rec);
|
||||||
|
if (rec.error != null) print(rec.error);
|
||||||
|
if (rec.stackTrace != null) print(rec.stackTrace);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.errorHandler = (e, req, res) async {
|
||||||
|
res.json(e.toJson());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AuthorizationServer
|
||||||
|
extends AuthorizationServer<PseudoApplication, PseudoUser> {
|
||||||
|
var logger = Logger('AuthorizationServer');
|
||||||
|
|
||||||
|
@override
|
||||||
|
PseudoApplication? findClient(String? clientId) {
|
||||||
|
return clientId == pseudoApplication.id ? pseudoApplication : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> verifyClient(
|
||||||
|
PseudoApplication client, String? clientSecret) async {
|
||||||
|
return client.secret == clientSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOr<DeviceCodeResponse> requestDeviceCode(PseudoApplication client,
|
||||||
|
Iterable<String> scopes, RequestContext req, ResponseContext res) {
|
||||||
|
return DeviceCodeResponse(
|
||||||
|
'foo',
|
||||||
|
'bar',
|
||||||
|
Uri.parse('https://regiostech.com')
|
||||||
|
.replace(queryParameters: {'scopes': scopes.join(',')}),
|
||||||
|
3600);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
FutureOr<AuthorizationTokenResponse> exchangeDeviceCodeForToken(
|
||||||
|
PseudoApplication client,
|
||||||
|
String? deviceCode,
|
||||||
|
String state,
|
||||||
|
RequestContext req,
|
||||||
|
ResponseContext res) {
|
||||||
|
print("[Server] exchangeDeviceCodeForToken");
|
||||||
|
print("[Server] $deviceCode");
|
||||||
|
print("[Server] $client");
|
||||||
|
|
||||||
|
if (deviceCode == 'brute') {
|
||||||
|
print("[Server] Throws AuthorizationException");
|
||||||
|
|
||||||
|
throw AuthorizationException(ErrorResponse(
|
||||||
|
ErrorResponse.slowDown,
|
||||||
|
'Ho, brother! Ho, whoa, whoa, whoa now! You got too much dip on your chip!',
|
||||||
|
state));
|
||||||
|
}
|
||||||
|
|
||||||
|
return AuthorizationTokenResponse('foo');
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
import 'package:angel3_framework/angel3_framework.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
import 'exception.dart';
|
import 'exception.dart';
|
||||||
import 'pkce.dart';
|
import 'pkce.dart';
|
||||||
import 'response.dart';
|
import 'response.dart';
|
||||||
|
@ -51,6 +52,8 @@ Future<Iterable<String>> _getScopes(RequestContext req,
|
||||||
|
|
||||||
/// An OAuth2 authorization server, which issues access tokens to third parties.
|
/// An OAuth2 authorization server, which issues access tokens to third parties.
|
||||||
abstract class AuthorizationServer<Client, User> {
|
abstract class AuthorizationServer<Client, User> {
|
||||||
|
static Logger logger = Logger('AuthorizationServer');
|
||||||
|
|
||||||
const AuthorizationServer();
|
const AuthorizationServer();
|
||||||
|
|
||||||
static const String _internalServerError =
|
static const String _internalServerError =
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel3_oauth2
|
name: angel3_oauth2
|
||||||
version: 8.0.0
|
version: 8.1.0
|
||||||
description: A class containing handlers that can be used within Angel to build a spec-compliant OAuth 2.0 server.
|
description: A class containing handlers that can be used within Angel to build a spec-compliant OAuth 2.0 server.
|
||||||
homepage: https://angel3-framework.web.app/
|
homepage: https://angel3-framework.web.app/
|
||||||
repository: https://github.com/dukefirehawk/angel/tree/master/packages/oauth2
|
repository: https://github.com/dukefirehawk/angel/tree/master/packages/oauth2
|
||||||
|
@ -11,14 +11,15 @@ dependencies:
|
||||||
angel3_http_exception: ^8.0.0
|
angel3_http_exception: ^8.0.0
|
||||||
crypto: ^3.0.1
|
crypto: ^3.0.1
|
||||||
collection: ^1.17.0
|
collection: ^1.17.0
|
||||||
|
logging: ^1.2.0
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
angel3_validate: ^8.0.0
|
angel3_validate: ^8.0.0
|
||||||
angel3_test: ^8.0.0
|
angel3_test: ^8.0.0
|
||||||
logging: ^1.2.0
|
angel3_container: ^8.0.0
|
||||||
oauth2: ^2.0.0
|
oauth2: ^2.0.0
|
||||||
lints: ^2.1.0
|
lints: ^2.1.0
|
||||||
test: ^1.24.0
|
test: ^1.24.0
|
||||||
uuid: ^3.0.0
|
uuid: ^4.0.0
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
angel3_container:
|
angel3_container:
|
||||||
path: ../container/angel_container
|
path: ../container/angel_container
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'package:angel3_container/mirrors.dart';
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
import 'package:angel3_framework/angel3_framework.dart';
|
||||||
import 'package:angel3_test/angel3_test.dart';
|
import 'package:angel3_test/angel3_test.dart';
|
||||||
import 'package:angel3_oauth2/angel3_oauth2.dart';
|
import 'package:angel3_oauth2/angel3_oauth2.dart';
|
||||||
|
@ -10,7 +11,7 @@ void main() {
|
||||||
late TestClient client;
|
late TestClient client;
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
var app = Angel();
|
var app = Angel(reflector: MirrorsReflector());
|
||||||
var oauth2 = _AuthorizationServer();
|
var oauth2 = _AuthorizationServer();
|
||||||
|
|
||||||
app.group('/oauth2', (router) {
|
app.group('/oauth2', (router) {
|
||||||
|
@ -19,7 +20,8 @@ void main() {
|
||||||
..post('/token', oauth2.tokenEndpoint);
|
..post('/token', oauth2.tokenEndpoint);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.logger = Logger('angel_oauth2')
|
//app.logger.level = Level.ALL;
|
||||||
|
app.logger = Logger("oauth2")
|
||||||
..onRecord.listen((rec) {
|
..onRecord.listen((rec) {
|
||||||
print(rec);
|
print(rec);
|
||||||
if (rec.error != null) print(rec.error);
|
if (rec.error != null) print(rec.error);
|
||||||
|
@ -113,7 +115,8 @@ void main() {
|
||||||
'device_code': 'brute',
|
'device_code': 'brute',
|
||||||
});
|
});
|
||||||
|
|
||||||
print(response.body);
|
print("[Client] ${response.headers}");
|
||||||
|
print("[Client] ${response.body}");
|
||||||
expect(
|
expect(
|
||||||
response,
|
response,
|
||||||
allOf(
|
allOf(
|
||||||
|
@ -130,6 +133,8 @@ void main() {
|
||||||
|
|
||||||
class _AuthorizationServer
|
class _AuthorizationServer
|
||||||
extends AuthorizationServer<PseudoApplication, PseudoUser> {
|
extends AuthorizationServer<PseudoApplication, PseudoUser> {
|
||||||
|
var logger = Logger('AuthorizationServer');
|
||||||
|
|
||||||
@override
|
@override
|
||||||
PseudoApplication? findClient(String? clientId) {
|
PseudoApplication? findClient(String? clientId) {
|
||||||
return clientId == pseudoApplication.id ? pseudoApplication : null;
|
return clientId == pseudoApplication.id ? pseudoApplication : null;
|
||||||
|
@ -159,7 +164,13 @@ class _AuthorizationServer
|
||||||
String state,
|
String state,
|
||||||
RequestContext req,
|
RequestContext req,
|
||||||
ResponseContext res) {
|
ResponseContext res) {
|
||||||
|
print("[Server] exchangeDeviceCodeForToken");
|
||||||
|
print("[Server] $deviceCode");
|
||||||
|
print("[Server] $client");
|
||||||
|
|
||||||
if (deviceCode == 'brute') {
|
if (deviceCode == 'brute') {
|
||||||
|
print("[Server] Throws AuthorizationException");
|
||||||
|
|
||||||
throw AuthorizationException(ErrorResponse(
|
throw AuthorizationException(ErrorResponse(
|
||||||
ErrorResponse.slowDown,
|
ErrorResponse.slowDown,
|
||||||
'Ho, brother! Ho, whoa, whoa, whoa now! You got too much dip on your chip!',
|
'Ho, brother! Ho, whoa, whoa, whoa now! You got too much dip on your chip!',
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
import 'package:angel3_container/mirrors.dart';
|
||||||
import 'package:angel3_framework/angel3_framework.dart';
|
import 'package:angel3_framework/angel3_framework.dart';
|
||||||
import 'package:angel3_framework/http.dart';
|
import 'package:angel3_framework/http.dart';
|
||||||
import 'package:angel3_oauth2/angel3_oauth2.dart';
|
import 'package:angel3_oauth2/angel3_oauth2.dart';
|
||||||
|
@ -14,7 +15,7 @@ void main() {
|
||||||
late TestClient testClient;
|
late TestClient testClient;
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
app = Angel();
|
app = Angel(reflector: MirrorsReflector());
|
||||||
app.container.registerSingleton(AuthCodes());
|
app.container.registerSingleton(AuthCodes());
|
||||||
|
|
||||||
var server = _Server();
|
var server = _Server();
|
||||||
|
|
|
@ -27,6 +27,7 @@ void main(List<String> args) async {
|
||||||
password: "Test123*",
|
password: "Test123*",
|
||||||
secure: false);
|
secure: false);
|
||||||
|
|
||||||
|
// ignore: unused_local_variable
|
||||||
var mysqlMigrationRunner = MySqlMigrationRunner(
|
var mysqlMigrationRunner = MySqlMigrationRunner(
|
||||||
mySQLConn,
|
mySQLConn,
|
||||||
migrations: [
|
migrations: [
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.1.0
|
||||||
|
|
||||||
|
* Upgraded to `analyzer` 6.2.x
|
||||||
|
|
||||||
## 8.0.0
|
## 8.0.0
|
||||||
|
|
||||||
* Require Dart >= 3.0
|
* Require Dart >= 3.0
|
||||||
|
|
|
@ -9,15 +9,29 @@ part of 'main.dart';
|
||||||
class EmployeeMigration extends Migration {
|
class EmployeeMigration extends Migration {
|
||||||
@override
|
@override
|
||||||
void up(Schema schema) {
|
void up(Schema schema) {
|
||||||
schema.create('employees', (table) {
|
schema.create(
|
||||||
|
'employees',
|
||||||
|
(table) {
|
||||||
table.serial('id').primaryKey();
|
table.serial('id').primaryKey();
|
||||||
table.timeStamp('created_at');
|
table.timeStamp('created_at');
|
||||||
table.timeStamp('updated_at');
|
table.timeStamp('updated_at');
|
||||||
table.varChar('unique_id', length: 255).unique();
|
table
|
||||||
table.varChar('first_name', length: 255);
|
.varChar(
|
||||||
table.varChar('last_name', length: 255);
|
'unique_id',
|
||||||
|
length: 255,
|
||||||
|
)
|
||||||
|
.unique();
|
||||||
|
table.varChar(
|
||||||
|
'first_name',
|
||||||
|
length: 255,
|
||||||
|
);
|
||||||
|
table.varChar(
|
||||||
|
'last_name',
|
||||||
|
length: 255,
|
||||||
|
);
|
||||||
table.double('salary');
|
table.double('salary');
|
||||||
});
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -31,8 +45,10 @@ class EmployeeMigration extends Migration {
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
|
class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
|
||||||
EmployeeQuery({Query? parent, Set<String>? trampoline})
|
EmployeeQuery({
|
||||||
: super(parent: parent) {
|
Query? parent,
|
||||||
|
Set<String>? trampoline,
|
||||||
|
}) : super(parent: parent) {
|
||||||
trampoline ??= <String>{};
|
trampoline ??= <String>{};
|
||||||
trampoline.add(tableName);
|
trampoline.add(tableName);
|
||||||
_where = EmployeeQueryWhere(this);
|
_where = EmployeeQueryWhere(this);
|
||||||
|
@ -47,7 +63,7 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Map<String, String> get casts {
|
Map<String, String> get casts {
|
||||||
return {'salary': 'char'};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -64,7 +80,7 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
|
||||||
'unique_id',
|
'unique_id',
|
||||||
'first_name',
|
'first_name',
|
||||||
'last_name',
|
'last_name',
|
||||||
'salary'
|
'salary',
|
||||||
];
|
];
|
||||||
return _selectedFields.isEmpty
|
return _selectedFields.isEmpty
|
||||||
? _fields
|
? _fields
|
||||||
|
@ -92,16 +108,15 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
|
||||||
}
|
}
|
||||||
var model = Employee(
|
var model = Employee(
|
||||||
id: fields.contains('id') ? row[0].toString() : null,
|
id: fields.contains('id') ? row[0].toString() : null,
|
||||||
createdAt: fields.contains('created_at')
|
createdAt:
|
||||||
? mapToNullableDateTime(row[1])
|
fields.contains('created_at') ? mapToNullableDateTime(row[1]) : null,
|
||||||
: null,
|
updatedAt:
|
||||||
updatedAt: fields.contains('updated_at')
|
fields.contains('updated_at') ? mapToNullableDateTime(row[2]) : null,
|
||||||
? mapToNullableDateTime(row[2])
|
|
||||||
: null,
|
|
||||||
uniqueId: fields.contains('unique_id') ? (row[3] as String?) : null,
|
uniqueId: fields.contains('unique_id') ? (row[3] as String?) : null,
|
||||||
firstName: fields.contains('first_name') ? (row[4] as String?) : null,
|
firstName: fields.contains('first_name') ? (row[4] as String?) : null,
|
||||||
lastName: fields.contains('last_name') ? (row[5] as String?) : null,
|
lastName: fields.contains('last_name') ? (row[5] as String?) : null,
|
||||||
salary: fields.contains('salary') ? mapToDouble(row[6]) : null);
|
salary: fields.contains('salary') ? mapToDouble(row[6]) : null,
|
||||||
|
);
|
||||||
return Optional.of(model);
|
return Optional.of(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,13 +128,34 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
|
||||||
|
|
||||||
class EmployeeQueryWhere extends QueryWhere {
|
class EmployeeQueryWhere extends QueryWhere {
|
||||||
EmployeeQueryWhere(EmployeeQuery query)
|
EmployeeQueryWhere(EmployeeQuery query)
|
||||||
: id = NumericSqlExpressionBuilder<int>(query, 'id'),
|
: id = NumericSqlExpressionBuilder<int>(
|
||||||
createdAt = DateTimeSqlExpressionBuilder(query, 'created_at'),
|
query,
|
||||||
updatedAt = DateTimeSqlExpressionBuilder(query, 'updated_at'),
|
'id',
|
||||||
uniqueId = StringSqlExpressionBuilder(query, 'unique_id'),
|
),
|
||||||
firstName = StringSqlExpressionBuilder(query, 'first_name'),
|
createdAt = DateTimeSqlExpressionBuilder(
|
||||||
lastName = StringSqlExpressionBuilder(query, 'last_name'),
|
query,
|
||||||
salary = NumericSqlExpressionBuilder<double>(query, 'salary');
|
'created_at',
|
||||||
|
),
|
||||||
|
updatedAt = DateTimeSqlExpressionBuilder(
|
||||||
|
query,
|
||||||
|
'updated_at',
|
||||||
|
),
|
||||||
|
uniqueId = StringSqlExpressionBuilder(
|
||||||
|
query,
|
||||||
|
'unique_id',
|
||||||
|
),
|
||||||
|
firstName = StringSqlExpressionBuilder(
|
||||||
|
query,
|
||||||
|
'first_name',
|
||||||
|
),
|
||||||
|
lastName = StringSqlExpressionBuilder(
|
||||||
|
query,
|
||||||
|
'last_name',
|
||||||
|
),
|
||||||
|
salary = NumericSqlExpressionBuilder<double>(
|
||||||
|
query,
|
||||||
|
'salary',
|
||||||
|
);
|
||||||
|
|
||||||
final NumericSqlExpressionBuilder<int> id;
|
final NumericSqlExpressionBuilder<int> id;
|
||||||
|
|
||||||
|
@ -137,14 +173,22 @@ class EmployeeQueryWhere extends QueryWhere {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<SqlExpressionBuilder> get expressionBuilders {
|
List<SqlExpressionBuilder> get expressionBuilders {
|
||||||
return [id, createdAt, updatedAt, uniqueId, firstName, lastName, salary];
|
return [
|
||||||
|
id,
|
||||||
|
createdAt,
|
||||||
|
updatedAt,
|
||||||
|
uniqueId,
|
||||||
|
firstName,
|
||||||
|
lastName,
|
||||||
|
salary,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class EmployeeQueryValues extends MapQueryValues {
|
class EmployeeQueryValues extends MapQueryValues {
|
||||||
@override
|
@override
|
||||||
Map<String, String> get casts {
|
Map<String, String> get casts {
|
||||||
return {'salary': 'double precision'};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
String? get id {
|
String? get id {
|
||||||
|
@ -198,14 +242,15 @@ class EmployeeQueryValues extends MapQueryValues {
|
||||||
|
|
||||||
@generatedSerializable
|
@generatedSerializable
|
||||||
class Employee extends _Employee {
|
class Employee extends _Employee {
|
||||||
Employee(
|
Employee({
|
||||||
{this.id,
|
this.id,
|
||||||
this.createdAt,
|
this.createdAt,
|
||||||
this.updatedAt,
|
this.updatedAt,
|
||||||
this.uniqueId,
|
this.uniqueId,
|
||||||
this.firstName,
|
this.firstName,
|
||||||
this.lastName,
|
this.lastName,
|
||||||
this.salary});
|
this.salary,
|
||||||
|
});
|
||||||
|
|
||||||
/// A unique identifier corresponding to this item.
|
/// A unique identifier corresponding to this item.
|
||||||
@override
|
@override
|
||||||
|
@ -231,14 +276,15 @@ class Employee extends _Employee {
|
||||||
@override
|
@override
|
||||||
double? salary;
|
double? salary;
|
||||||
|
|
||||||
Employee copyWith(
|
Employee copyWith({
|
||||||
{String? id,
|
String? id,
|
||||||
DateTime? createdAt,
|
DateTime? createdAt,
|
||||||
DateTime? updatedAt,
|
DateTime? updatedAt,
|
||||||
String? uniqueId,
|
String? uniqueId,
|
||||||
String? firstName,
|
String? firstName,
|
||||||
String? lastName,
|
String? lastName,
|
||||||
double? salary}) {
|
double? salary,
|
||||||
|
}) {
|
||||||
return Employee(
|
return Employee(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
createdAt: createdAt ?? this.createdAt,
|
createdAt: createdAt ?? this.createdAt,
|
||||||
|
@ -263,8 +309,15 @@ class Employee extends _Employee {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
return hashObjects(
|
return hashObjects([
|
||||||
[id, createdAt, updatedAt, uniqueId, firstName, lastName, salary]);
|
id,
|
||||||
|
createdAt,
|
||||||
|
updatedAt,
|
||||||
|
uniqueId,
|
||||||
|
firstName,
|
||||||
|
lastName,
|
||||||
|
salary,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -347,7 +400,7 @@ abstract class EmployeeFields {
|
||||||
uniqueId,
|
uniqueId,
|
||||||
firstName,
|
firstName,
|
||||||
lastName,
|
lastName,
|
||||||
salary
|
salary,
|
||||||
];
|
];
|
||||||
|
|
||||||
static const String id = 'id';
|
static const String id = 'id';
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel3_orm_generator
|
name: angel3_orm_generator
|
||||||
version: 8.0.0
|
version: 8.1.0
|
||||||
description: Code generators for Angel3 ORM. Generates query builder classes.
|
description: Code generators for Angel3 ORM. Generates query builder classes.
|
||||||
homepage: https://angel3-framework.web.app/
|
homepage: https://angel3-framework.web.app/
|
||||||
repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm_generator
|
repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm_generator
|
||||||
|
@ -10,7 +10,7 @@ dependencies:
|
||||||
angel3_serialize: ^8.0.0
|
angel3_serialize: ^8.0.0
|
||||||
angel3_orm: ^8.0.0
|
angel3_orm: ^8.0.0
|
||||||
angel3_serialize_generator: ^8.0.0
|
angel3_serialize_generator: ^8.0.0
|
||||||
analyzer: ^5.13.0
|
analyzer: ^6.2.0
|
||||||
inflection3: ^0.5.3+2
|
inflection3: ^0.5.3+2
|
||||||
build: ^2.4.0
|
build: ^2.4.0
|
||||||
build_config: ^1.1.0
|
build_config: ^1.1.0
|
||||||
|
@ -30,7 +30,7 @@ dev_dependencies:
|
||||||
postgres: ^2.4.0
|
postgres: ^2.4.0
|
||||||
test: ^1.24.0
|
test: ^1.24.0
|
||||||
lints: ^2.1.0
|
lints: ^2.1.0
|
||||||
# dependency_overrides:
|
dependency_overrides:
|
||||||
# angel3_container:
|
# angel3_container:
|
||||||
# path: ../../container/angel_container
|
# path: ../../container/angel_container
|
||||||
# angel3_framework:
|
# angel3_framework:
|
||||||
|
@ -45,8 +45,8 @@ dev_dependencies:
|
||||||
# path: ../../mock_request
|
# path: ../../mock_request
|
||||||
# angel3_serialize:
|
# angel3_serialize:
|
||||||
# path: ../../serialize/angel_serialize
|
# path: ../../serialize/angel_serialize
|
||||||
# angel3_serialize_generator:
|
angel3_serialize_generator:
|
||||||
# path: ../../serialize/angel_serialize_generator
|
path: ../../serialize/angel_serialize_generator
|
||||||
# angel3_orm:
|
# angel3_orm:
|
||||||
# path: ../angel_orm
|
# path: ../angel_orm
|
||||||
# angel3_migration:
|
# angel3_migration:
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## 8.1.0
|
||||||
|
|
||||||
|
* Upgraded to `analyzer` 6.2.x
|
||||||
|
|
||||||
## 8.0.1
|
## 8.0.1
|
||||||
|
|
||||||
* Fixed `JsonModelGenerator` from generating duplicated fields
|
* Fixed `JsonModelGenerator` from generating duplicated fields
|
||||||
|
|
|
@ -5,6 +5,25 @@
|
||||||
[![Gitter](https://img.shields.io/gitter/room/angel_dart/discussion)](https://gitter.im/angel_dart/discussion)
|
[![Gitter](https://img.shields.io/gitter/room/angel_dart/discussion)](https://gitter.im/angel_dart/discussion)
|
||||||
[![License](https://img.shields.io/github/license/dukefirehawk/angel)](https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator/LICENSE)
|
[![License](https://img.shields.io/github/license/dukefirehawk/angel)](https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator/LICENSE)
|
||||||
|
|
||||||
The builder for Angel3 model serialization.
|
The builder for Angel3 serialization.
|
||||||
|
|
||||||
Find documentation in the main [serialize project repo](https://github.com/dukefirehawk/angel/tree/master/packages/serialize)
|
## Usage
|
||||||
|
|
||||||
|
1. Create a model class in `todo.dart` and annotate it with `@serializable`
|
||||||
|
|
||||||
|
```dart
|
||||||
|
import 'package:angel3_serialize/angel3_serialize.dart';
|
||||||
|
part 'todo.g.dart';
|
||||||
|
|
||||||
|
@serializable
|
||||||
|
class _Todo {
|
||||||
|
String? text;
|
||||||
|
bool? completed;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Run the following command to generate the associated `todo.g.dart` file for serialization.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dart run build_runner build
|
||||||
|
```
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
name: angel3_serialize_generator
|
name: angel3_serialize_generator
|
||||||
version: 8.0.1
|
version: 8.1.0
|
||||||
description: Angel3 model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling.
|
description: Angel3 model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling.
|
||||||
homepage: https://angel3-framework.web.app/
|
homepage: https://angel3-framework.web.app/
|
||||||
repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator
|
repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
analyzer: ^5.0.0
|
analyzer: ^6.2.0
|
||||||
angel3_model: ^8.0.0
|
angel3_model: ^8.0.0
|
||||||
angel3_serialize: ^8.0.0
|
angel3_serialize: ^8.0.0
|
||||||
belatuk_code_buffer: ^5.0.0
|
belatuk_code_buffer: ^5.0.0
|
||||||
|
|
Loading…
Reference in a new issue