Skip to content

Commit 4e90004

Browse files
authored
chore: Resolve Spanner bugfixes (#129)
* use HTTPMethod.ALL as fallback when method not found * use function for logging * bump spanner version
1 parent 44269e7 commit 4e90004

File tree

7 files changed

+49
-28
lines changed

7 files changed

+49
-28
lines changed

packages/pharaoh/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ environment:
88

99
dependencies:
1010
meta:
11-
spanner: ^1.0.1+5
11+
spanner: ^1.0.2
1212
mime: ^1.0.4
1313
collection: ^1.18.0
1414
http_parser: ^4.0.2

packages/spanner/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
## 1.0.2
2+
3+
- (perf): Make route debug logs optional.
4+
- (bug): Fallback to `HTTPMethod.ALL` when exact route method not found.
5+
16
## 1.0.1
27

38
- De-coupled spanner from pharaoh.
49
- Updated documentation
510

6-
711
## 1.0.0
812

913
- Initial version.

packages/spanner/lib/src/route/action.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ mixin HandlerStore {
1313

1414
bool hasMethod(HTTPMethod method) => requestHandlers.containsKey(method);
1515

16-
IndexedValue? getHandler(HTTPMethod method) => requestHandlers[method];
16+
IndexedValue? getHandler(HTTPMethod method) =>
17+
requestHandlers[method] ?? requestHandlers[HTTPMethod.ALL];
1718

1819
void addRoute<T>(HTTPMethod method, IndexedValue<T> handler) {
1920
if (requestHandlers.containsKey(method)) {

packages/spanner/lib/src/tree/node.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,11 @@ class ParametricNode extends Node {
8686
return super.addChildAndReturn(key, node);
8787
}
8888

89-
final List<ParameterDefinition> _definitions = [];
89+
final List<ParameterDefinition> _definitions;
9090

91-
List<ParameterDefinition> get definitions =>
92-
UnmodifiableListView(_definitions);
91+
Iterable<ParameterDefinition> get definitions => _definitions;
9392

94-
ParametricNode(ParameterDefinition defn) {
93+
ParametricNode(ParameterDefinition defn) : _definitions = [] {
9594
_definitions.add(defn);
9695
}
9796

packages/spanner/lib/src/tree/tree.dart

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,11 @@ class Spanner {
162162
return isLastSegment ? defn : node.addChildAndReturn(key, paramNode);
163163
}
164164

165-
RouteResult? lookup(HTTPMethod method, dynamic route, {bool debug = false}) {
165+
RouteResult? lookup(
166+
HTTPMethod method,
167+
dynamic route, {
168+
void Function(String)? devlog,
169+
}) {
166170
final path = route is Uri ? route.path : route.toString();
167171
final routeSegments = route is Uri
168172
? route.pathSegments
@@ -206,14 +210,9 @@ class Spanner {
206210
);
207211
}
208212

209-
final debugLog = StringBuffer("\n");
210-
211-
void devlog(String message) {
212-
if (!debug) return;
213-
debugLog.writeln(message);
214-
}
215-
216-
devlog('Finding node for --------- ${method.name} $path ------------\n');
213+
devlog?.call(
214+
'Finding node for --------- ${method.name} $path ------------\n',
215+
);
217216

218217
for (int i = 0; i < routeSegments.length; i++) {
219218
final String currPart = routeSegments[i];
@@ -233,12 +232,14 @@ class Spanner {
233232
final wcNode = rootNode.wildcardNode;
234233
if (wcNode != null) wildcardNode = wcNode;
235234

236-
devlog('- Found Static for -> $routePart');
235+
devlog?.call('- Found Static for -> $routePart');
237236
} else {
238237
final parametricNode = rootNode.paramNode;
239238
if (parametricNode == null) {
240-
devlog('x Found no Static Node for part -> $routePart');
241-
devlog('x Route is not found -> $path');
239+
devlog?.call(
240+
'x Found no Static Node for part -> $routePart',
241+
);
242+
devlog?.call('x Route is not found -> $path');
242243

243244
if (wildcardNode != null) {
244245
useWildcard(wildcardNode);
@@ -249,14 +250,16 @@ class Spanner {
249250
}
250251

251252
if (parametricNode.hasChild(routePart)) {
252-
devlog('- Found Static for -> $routePart');
253+
devlog?.call(
254+
'- Found Static for -> $routePart',
255+
);
253256
rootNode = parametricNode.getChild(routePart);
254257
final wcNode = rootNode.wildcardNode;
255258
if (wcNode != null) wildcardNode = wcNode;
256259
continue;
257260
}
258261

259-
devlog(
262+
devlog?.call(
260263
'- Finding Defn for $routePart -> terminal? $isLastPart',
261264
);
262265

@@ -266,7 +269,7 @@ class Spanner {
266269
terminal: isLastPart,
267270
);
268271

269-
devlog(' * parametric defn: ${definition.toString()}');
272+
devlog?.call(' * parametric defn: ${definition.toString()}');
270273

271274
if (definition == null) {
272275
if (wildcardNode != null) {
@@ -294,7 +297,9 @@ class Spanner {
294297
break;
295298
}
296299

297-
devlog('- Found defn for route part -> $routePart');
300+
devlog?.call(
301+
'- Found defn for route part -> $routePart',
302+
);
298303

299304
final params = definition.resolveParams(currPart);
300305
resolvedParams.addAll(params);
@@ -310,10 +315,6 @@ class Spanner {
310315
}
311316
}
312317

313-
if (debug) {
314-
print(debugLog);
315-
}
316-
317318
if (!rootNode.terminal) {
318319
return RouteResult(resolvedParams, getResults(null), actual: null);
319320
}

packages/spanner/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: spanner
22
description: Generic HTTP Router implementation, internally uses a Radix Tree (aka compact Prefix Tree), supports route params, wildcards.
3-
version: 1.0.1+5
3+
version: 1.0.2
44
repository: https://github.com/Pharaoh-Framework/pharaoh/tree/main/packages/spanner
55

66
environment:
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:spanner/spanner.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
test("ALL as fallback for specific method", () {
6+
final router = Spanner()
7+
..addRoute(HTTPMethod.GET, '/api/auth/login', 4)
8+
..addRoute(HTTPMethod.ALL, '/api/auth/login', 5);
9+
10+
var result = router.lookup(HTTPMethod.GET, '/api/auth/login');
11+
expect(result?.values, [4]);
12+
13+
result = router.lookup(HTTPMethod.POST, '/api/auth/login');
14+
expect(result?.values, [5]);
15+
});
16+
}

0 commit comments

Comments
 (0)