Merge pull request #107 from dukefirehawk/feature/upgrade_sdk

Feature/upgrade sdk
This commit is contained in:
Thomas Hii 2023-10-08 12:20:09 +08:00 committed by GitHub
commit 811e68de70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
72 changed files with 453 additions and 11583 deletions

View file

@ -1,6 +1,6 @@
# 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)
[![Null Safety](https://img.shields.io/badge/null-safety-brightgreen)](https://dart.dev/null-safety)

148
angel3_logo.svg Normal file
View 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

View file

Before

Width:  |  Height:  |  Size: 6 KiB

After

Width:  |  Height:  |  Size: 6 KiB

View file

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1 +0,0 @@
include: package:lints/recommended.yaml

View file

@ -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");
}

View file

@ -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);
}

View file

@ -1,5 +0,0 @@
class Person {
final String firstName;
final String lastName;
const Person(this.firstName, this.lastName);
}

View file

@ -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

View file

@ -1 +0,0 @@
include: package:lints/recommended.yaml

View file

@ -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}");
}

View file

@ -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}");
}

View file

@ -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}");
}

View file

@ -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);
}
*/

View file

@ -1,9 +0,0 @@
targets:
$default:
builders:
reflectable:
generate_for:
#- lib/**_controller.dart
- bin/**_controller.dart
options:
formatted: true

View file

@ -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() {}

View file

@ -1,5 +0,0 @@
class Person {
final String firstName;
final String lastName;
const Person(this.firstName, this.lastName);
}

View file

@ -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

View file

@ -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!";
}

View file

@ -1,6 +0,0 @@
Primary Authors
===============
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
The current main maintainer of the code base.

View file

@ -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.

View file

@ -1 +0,0 @@
include: package:lints/recommended.yaml

View file

@ -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()}");
}

View file

@ -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}");
}

View file

@ -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

View file

@ -1,6 +0,0 @@
Primary Authors
===============
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
The current main maintainer of the code base.

View file

@ -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.

View file

@ -1 +0,0 @@
include: package:lints/recommended.yaml

View file

@ -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");
}

View file

@ -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

View file

@ -1,6 +0,0 @@
Primary Authors
===============
* __[Thomas Hii](dukefirehawk.apps@gmail.com)__
The current main maintainer of the code base.

View file

@ -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.

View file

@ -1 +0,0 @@
include: package:lints/recommended.yaml

View file

@ -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");
}

View file

@ -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

View file

@ -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

Binary file not shown.

BIN
logo_icon_512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -1,5 +1,9 @@
# Change Log
## 8.1.0
* Updated `uuid` to 4.0.0
## 8.0.0
* Require Dart >= 3.0

View file

@ -108,6 +108,8 @@ abstract class Driver<
/// Handles a single request.
Future handleRawRequest(Request request, Response response) {
app.logger.info('[Server] Called handleRawRequest');
return createRequestContext(request, response).then((req) {
return createResponseContext(request, response, req).then((res) {
Future handle() {

View file

@ -1,5 +1,5 @@
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.
homepage: https://angel3-framework.web.app/
repository: https://github.com/dukefirehawk/angel/tree/master/packages/framework
@ -28,7 +28,7 @@ dependencies:
stack_trace: ^1.11.0
string_scanner: ^1.2.0
tuple: ^2.0.0
uuid: ^3.0.0
uuid: ^4.0.0
collection: ^1.17.0
dev_dependencies:
http: ^1.0.0

View file

@ -1,5 +1,9 @@
# Change Log
## 8.1.0
* Upgraded to `analyzer` 6.2.x
## 8.0.0
* Require Dart >= 3.0

View file

@ -1,11 +1,11 @@
name: jael3_web
version: 8.0.0
version: 8.1.0
description: Experimental virtual DOM/SPA engine built on Jael3. Supports SSR.
publish_to: none
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
analyzer: ^5.0.0
analyzer: ^6.2.0
build: ^2.0.2
build_config: ^1.0.0
code_builder: ^4.0.0

View file

@ -1,5 +1,9 @@
# Change Log
## 8.1.0
* Update `jinja` to 0.5.0
## 8.0.0
* Require Dart >= 3.0

View file

@ -1,12 +1,12 @@
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.
homepage: https://github.com/dukefirehawk/angel/tree/master/packages/jinja
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
angel3_framework: ^8.0.0
jinja: ^0.4.2
jinja: ^0.5.0
dev_dependencies:
angel3_test: ^8.0.0
path: ^1.8.0

View file

@ -1,5 +1,10 @@
# Change Log
## 8.0.0
* Require Dart >= 3.0
* Upgraded `mongo_dart` to 0.9.3
## 7.0.0
* Require Dart >= 2.17

View file

@ -9,21 +9,21 @@ dependencies:
angel3_framework: ^8.0.0
belatuk_json_serializer: ^7.0.0
belatuk_merge_map: ^5.0.0
mongo_dart: ^0.7.0
mongo_dart: ^0.9.0
dev_dependencies:
http: ^1.0.0
test: ^1.24.0
lints: ^2.1.0
dependency_overrides:
angel3_container:
path: ../container/angel_container
angel3_framework:
path: ../framework
angel3_http_exception:
path: ../http_exception
angel3_model:
path: ../model
angel3_route:
path: ../route
angel3_mock_request:
path: ../mock_request
# dependency_overrides:
# angel3_container:
# path: ../container/angel_container
# angel3_framework:
# path: ../framework
# angel3_http_exception:
# path: ../http_exception
# angel3_model:
# path: ../model
# angel3_route:
# path: ../route
# angel3_mock_request:
# path: ../mock_request

View file

@ -1,5 +1,9 @@
# Change Log
## 8.1.0
* Updated to `uuid`
## 8.0.0
* Require Dart >= 3.0

View file

@ -20,8 +20,8 @@ In your `pubspec.yaml`:
```yaml
dependencies:
angel3_framework: ^6.0.0
angel3_oauth2: ^6.0.0
angel3_framework: ^8.0.0
angel3_oauth2: ^8.0.0
```
## Usage

View 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');
}
}

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:logging/logging.dart';
import 'exception.dart';
import 'pkce.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.
abstract class AuthorizationServer<Client, User> {
static Logger logger = Logger('AuthorizationServer');
const AuthorizationServer();
static const String _internalServerError =

View file

@ -1,5 +1,5 @@
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.
homepage: https://angel3-framework.web.app/
repository: https://github.com/dukefirehawk/angel/tree/master/packages/oauth2
@ -11,14 +11,15 @@ dependencies:
angel3_http_exception: ^8.0.0
crypto: ^3.0.1
collection: ^1.17.0
logging: ^1.2.0
dev_dependencies:
angel3_validate: ^8.0.0
angel3_test: ^8.0.0
logging: ^1.2.0
angel3_container: ^8.0.0
oauth2: ^2.0.0
lints: ^2.1.0
test: ^1.24.0
uuid: ^3.0.0
uuid: ^4.0.0
dependency_overrides:
angel3_container:
path: ../container/angel_container

View file

@ -1,4 +1,5 @@
import 'dart:async';
import 'package:angel3_container/mirrors.dart';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_test/angel3_test.dart';
import 'package:angel3_oauth2/angel3_oauth2.dart';
@ -10,7 +11,7 @@ void main() {
late TestClient client;
setUp(() async {
var app = Angel();
var app = Angel(reflector: MirrorsReflector());
var oauth2 = _AuthorizationServer();
app.group('/oauth2', (router) {
@ -19,7 +20,8 @@ void main() {
..post('/token', oauth2.tokenEndpoint);
});
app.logger = Logger('angel_oauth2')
//app.logger.level = Level.ALL;
app.logger = Logger("oauth2")
..onRecord.listen((rec) {
print(rec);
if (rec.error != null) print(rec.error);
@ -113,7 +115,8 @@ void main() {
'device_code': 'brute',
});
print(response.body);
print("[Client] ${response.headers}");
print("[Client] ${response.body}");
expect(
response,
allOf(
@ -130,6 +133,8 @@ void main() {
class _AuthorizationServer
extends AuthorizationServer<PseudoApplication, PseudoUser> {
var logger = Logger('AuthorizationServer');
@override
PseudoApplication? findClient(String? clientId) {
return clientId == pseudoApplication.id ? pseudoApplication : null;
@ -159,7 +164,13 @@ class _AuthorizationServer
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!',

View file

@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:collection';
import 'package:angel3_container/mirrors.dart';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_framework/http.dart';
import 'package:angel3_oauth2/angel3_oauth2.dart';
@ -14,7 +15,7 @@ void main() {
late TestClient testClient;
setUp(() async {
app = Angel();
app = Angel(reflector: MirrorsReflector());
app.container.registerSingleton(AuthCodes());
var server = _Server();

View file

@ -27,6 +27,7 @@ void main(List<String> args) async {
password: "Test123*",
secure: false);
// ignore: unused_local_variable
var mysqlMigrationRunner = MySqlMigrationRunner(
mySQLConn,
migrations: [

View file

@ -1,5 +1,9 @@
# Change Log
## 8.1.0
* Upgraded to `analyzer` 6.2.x
## 8.0.0
* Require Dart >= 3.0

View file

@ -9,15 +9,29 @@ part of 'main.dart';
class EmployeeMigration extends Migration {
@override
void up(Schema schema) {
schema.create('employees', (table) {
table.serial('id').primaryKey();
table.timeStamp('created_at');
table.timeStamp('updated_at');
table.varChar('unique_id', length: 255).unique();
table.varChar('first_name', length: 255);
table.varChar('last_name', length: 255);
table.double('salary');
});
schema.create(
'employees',
(table) {
table.serial('id').primaryKey();
table.timeStamp('created_at');
table.timeStamp('updated_at');
table
.varChar(
'unique_id',
length: 255,
)
.unique();
table.varChar(
'first_name',
length: 255,
);
table.varChar(
'last_name',
length: 255,
);
table.double('salary');
},
);
}
@override
@ -31,8 +45,10 @@ class EmployeeMigration extends Migration {
// **************************************************************************
class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
EmployeeQuery({Query? parent, Set<String>? trampoline})
: super(parent: parent) {
EmployeeQuery({
Query? parent,
Set<String>? trampoline,
}) : super(parent: parent) {
trampoline ??= <String>{};
trampoline.add(tableName);
_where = EmployeeQueryWhere(this);
@ -47,7 +63,7 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
@override
Map<String, String> get casts {
return {'salary': 'char'};
return {};
}
@override
@ -64,7 +80,7 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
'unique_id',
'first_name',
'last_name',
'salary'
'salary',
];
return _selectedFields.isEmpty
? _fields
@ -91,17 +107,16 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
return Optional.empty();
}
var model = Employee(
id: fields.contains('id') ? row[0].toString() : null,
createdAt: fields.contains('created_at')
? mapToNullableDateTime(row[1])
: null,
updatedAt: fields.contains('updated_at')
? mapToNullableDateTime(row[2])
: null,
uniqueId: fields.contains('unique_id') ? (row[3] as String?) : null,
firstName: fields.contains('first_name') ? (row[4] as String?) : null,
lastName: fields.contains('last_name') ? (row[5] as String?) : null,
salary: fields.contains('salary') ? mapToDouble(row[6]) : null);
id: fields.contains('id') ? row[0].toString() : null,
createdAt:
fields.contains('created_at') ? mapToNullableDateTime(row[1]) : null,
updatedAt:
fields.contains('updated_at') ? mapToNullableDateTime(row[2]) : null,
uniqueId: fields.contains('unique_id') ? (row[3] as String?) : null,
firstName: fields.contains('first_name') ? (row[4] as String?) : null,
lastName: fields.contains('last_name') ? (row[5] as String?) : null,
salary: fields.contains('salary') ? mapToDouble(row[6]) : null,
);
return Optional.of(model);
}
@ -113,13 +128,34 @@ class EmployeeQuery extends Query<Employee, EmployeeQueryWhere> {
class EmployeeQueryWhere extends QueryWhere {
EmployeeQueryWhere(EmployeeQuery query)
: id = NumericSqlExpressionBuilder<int>(query, 'id'),
createdAt = DateTimeSqlExpressionBuilder(query, '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');
: id = NumericSqlExpressionBuilder<int>(
query,
'id',
),
createdAt = DateTimeSqlExpressionBuilder(
query,
'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;
@ -137,14 +173,22 @@ class EmployeeQueryWhere extends QueryWhere {
@override
List<SqlExpressionBuilder> get expressionBuilders {
return [id, createdAt, updatedAt, uniqueId, firstName, lastName, salary];
return [
id,
createdAt,
updatedAt,
uniqueId,
firstName,
lastName,
salary,
];
}
}
class EmployeeQueryValues extends MapQueryValues {
@override
Map<String, String> get casts {
return {'salary': 'double precision'};
return {};
}
String? get id {
@ -198,14 +242,15 @@ class EmployeeQueryValues extends MapQueryValues {
@generatedSerializable
class Employee extends _Employee {
Employee(
{this.id,
this.createdAt,
this.updatedAt,
this.uniqueId,
this.firstName,
this.lastName,
this.salary});
Employee({
this.id,
this.createdAt,
this.updatedAt,
this.uniqueId,
this.firstName,
this.lastName,
this.salary,
});
/// A unique identifier corresponding to this item.
@override
@ -231,14 +276,15 @@ class Employee extends _Employee {
@override
double? salary;
Employee copyWith(
{String? id,
DateTime? createdAt,
DateTime? updatedAt,
String? uniqueId,
String? firstName,
String? lastName,
double? salary}) {
Employee copyWith({
String? id,
DateTime? createdAt,
DateTime? updatedAt,
String? uniqueId,
String? firstName,
String? lastName,
double? salary,
}) {
return Employee(
id: id ?? this.id,
createdAt: createdAt ?? this.createdAt,
@ -263,8 +309,15 @@ class Employee extends _Employee {
@override
int get hashCode {
return hashObjects(
[id, createdAt, updatedAt, uniqueId, firstName, lastName, salary]);
return hashObjects([
id,
createdAt,
updatedAt,
uniqueId,
firstName,
lastName,
salary,
]);
}
@override
@ -347,7 +400,7 @@ abstract class EmployeeFields {
uniqueId,
firstName,
lastName,
salary
salary,
];
static const String id = 'id';

View file

@ -1,5 +1,5 @@
name: angel3_orm_generator
version: 8.0.0
version: 8.1.0
description: Code generators for Angel3 ORM. Generates query builder classes.
homepage: https://angel3-framework.web.app/
repository: https://github.com/dukefirehawk/angel/tree/master/packages/orm/angel_orm_generator
@ -10,7 +10,7 @@ dependencies:
angel3_serialize: ^8.0.0
angel3_orm: ^8.0.0
angel3_serialize_generator: ^8.0.0
analyzer: ^5.13.0
analyzer: ^6.2.0
inflection3: ^0.5.3+2
build: ^2.4.0
build_config: ^1.1.0
@ -30,7 +30,7 @@ dev_dependencies:
postgres: ^2.4.0
test: ^1.24.0
lints: ^2.1.0
# dependency_overrides:
dependency_overrides:
# angel3_container:
# path: ../../container/angel_container
# angel3_framework:
@ -45,8 +45,8 @@ dev_dependencies:
# path: ../../mock_request
# angel3_serialize:
# path: ../../serialize/angel_serialize
# angel3_serialize_generator:
# path: ../../serialize/angel_serialize_generator
angel3_serialize_generator:
path: ../../serialize/angel_serialize_generator
# angel3_orm:
# path: ../angel_orm
# angel3_migration:

View file

@ -1,5 +1,9 @@
# Change Log
## 8.1.0
* Upgraded to `analyzer` 6.2.x
## 8.0.1
* Fixed `JsonModelGenerator` from generating duplicated fields

View file

@ -5,6 +5,25 @@
[![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)
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
```

View file

@ -1,12 +1,12 @@
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.
homepage: https://angel3-framework.web.app/
repository: https://github.com/dukefirehawk/angel/tree/master/packages/serialize/angel_serialize_generator
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
analyzer: ^5.0.0
analyzer: ^6.2.0
angel3_model: ^8.0.0
angel3_serialize: ^8.0.0
belatuk_code_buffer: ^5.0.0