Std.UriTemplate
2.0.1
dotnet add package Std.UriTemplate --version 2.0.1
NuGet\Install-Package Std.UriTemplate -Version 2.0.1
<PackageReference Include="Std.UriTemplate" Version="2.0.1" />
paket add Std.UriTemplate --version 2.0.1
#r "nuget: Std.UriTemplate, 2.0.1"
// Install Std.UriTemplate as a Cake Addin #addin nuget:?package=Std.UriTemplate&version=2.0.1 // Install Std.UriTemplate as a Cake Tool #tool nuget:?package=Std.UriTemplate&version=2.0.1
std-uritemplate
This is a complete and maintained cross-language implementation of the Uri Template specification RFC 6570 Level 4.
[!NOTE]
Low activity is this repository is expected as long as there are no outstanding bug reports the implementations are considered stable and mature.
Available implementations
Language | Complete | Reviewed | Published |
---|---|---|---|
Java | ✅ | ✅ | ✅ |
Python | ✅ | ❌ | ✅ |
Typescript | ✅ | ✅ | ✅ |
Go | ✅ | ✅ | ✅ |
C# | ✅ | ✅ | ✅ |
Ruby | ✅ | ❌ | ✅ |
PHP | ✅ | ✅ | ✅ |
Swift | ✅ | ❌ | ✅ |
Dart | ✅ | ✅ | ✅ |
Usage
Java
You can use the library as a Maven dependency:
<dependency>
<groupId>io.github.std-uritemplate</groupId>
<artifactId>std-uritemplate</artifactId>
<version>REPLACE-ME</version>
</dependency>
in Gradle:
implementation 'io.github.std-uritemplate:std-uritemplate:REPLACE-ME'
and use it in your project:
import io.github.stduritemplate.StdUriTemplate;
...
StdUriTemplate.expand(template, substitutions);
Python
Install the package with pip
(or any alternative):
pip install std-uritemplate
Use the library in your project:
from stduritemplate import StdUriTemplate
...
StdUriTemplate.expand(template, substitutions)
Typescript/Javascript
Install the package using npm
:
npm i @std-uritemplate/std-uritemplate
Use the package:
const { StdUriTemplate } = require('@std-uritemplate/std-uritemplate');
...
StdUriTemplate.expand(template, substitutions);
Go
Install the package:
go get github.com/std-uritemplate/std-uritemplate/go/v2
and use it:
import stduritemplate "github.com/std-uritemplate/std-uritemplate/go/v2"
...
stduritemplate.Expand(template, substitutions)
C#
Install the package:
dotnet add package Std.UriTemplate
and use it:
Std.UriTemplate.Expand(template, substitutions);
Ruby
Install the package:
gem install stduritemplate
and use it:
require 'stduritemplate'
...
StdUriTemplate.expand(template, substitutions)
PHP
Install the package:
composer require stduritemplate/stduritemplate
and use it:
use StdUriTemplate\StdUriTemplate;
...
StdUriTemplate::expand($template, $substitutions);
Swift
Install the package, adding to Package.swift
:
let package = Package(
...
dependencies: [
...
.package(
url: "https://github.com/std-uritemplate/std-uritemplate-swift.git",
from: "<version>"
)
],
targets: [
.executableTarget(
...
dependencies: [
...
.product(name: "stduritemplate",
package: "std-uritemplate-swift")
]
...
),
]
)
and use it:
import stduritemplate
...
StdUriTemplate.expand(template, substitutions: substs)
Dart
Install the package:
dart pub add std_uritemplate
for flutter:
flutter pub add std_uritemplate
and use it:
import 'package:std_uritemplate/std_uritemplate.dart';
...
print(StdUriTemplate.expand(template, substitutions));
Design decisions
We have a set of design decisions to guide:
- zero dependencies
- no usage of regexp
- no options/configurations
- only single expansion will be supported
- single method public API
- no language idiomatic API, only 1 low level primitive - we do encourage language-specific wrapper/alternative libraries
- portable implementation across languages based on widely available patterns
- target Level support is 4 (should pass all the canonical tests)
- favor maintenance and readability
- performance until they compromise readability
- one implementation per ecosystem/runtime (e.g. 1 implementation in Java and no Kotlin/Scala/Closure, 1 in TS that will serve JS as well etc.)
- substitutions will be performed only for primitive types
API
The public API is composed by a single method(in Java for simplicity):
String expand(String template, Map<String, Object> substitutions)
all the rest, should not be directly accessible.
Motivation
<img alt="alt_text" src="https://imgs.xkcd.com/comics/dependency.png" />
In the Kiota project they are using Uri Templates to build URLs, and we have already spent enough life-time dealing with:
- unmaintained projects
- scarce feedback from maintainers
- long release cycles
- different nuances in different implementations
- quirks and integration issues
- frameworks and additional dependencies
- diamond transitive dependencies
We aim to do it differently, by reducing maintenance to a minimum by automating it, and sharing responsibilities to reduce the bus/truck factor:
- single repository
- multiple implementations
- fully automated testing standardized
- fully automated releases on tag
- same tradeoffs across languages
- familiar implementation across languages
- multiple maintainers in an independent organization
Uri Template is(likely) going to be included in the next OpenAPI specification and we need to rely on a (more) solid foundation to prevent our selves to spend long, tedious hours and days chasing hidden bugs, verifying compatibilities and waiting for unresponsive maintainers.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
net5.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Std.UriTemplate:
Package | Downloads |
---|---|
Microsoft.Kiota.Abstractions
Abstractions library for the Kiota generated SDKs in dotnet. |
|
WATGx.Common.Data
WATGx library |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Std.UriTemplate:
Repository | Stars |
---|---|
Kyrodan/KeeAnywhere
A cloud storage provider plugin for KeePass Password Safe
|
Version | Downloads | Last updated |
---|---|---|
2.0.1 | 560,212 | 11/12/2024 |
2.0.0 | 199,165 | 9/30/2024 |
1.0.6 | 2,574,119 | 8/30/2024 |
1.0.5 | 529,656 | 7/24/2024 |
1.0.3 | 195,843 | 7/3/2024 |
1.0.2 | 3,262 | 6/26/2024 |
1.0.1 | 159,681 | 6/11/2024 |
1.0.0 | 264 | 6/11/2024 |
0.0.59 | 1,294 | 6/7/2024 |
0.0.58 | 201 | 6/7/2024 |
0.0.57 | 5,613,995 | 4/18/2024 |
0.0.56 | 36,142 | 4/11/2024 |
0.0.55 | 1,405,614 | 3/18/2024 |
0.0.54 | 624,131 | 2/27/2024 |
0.0.53 | 138,914 | 2/15/2024 |
0.0.52 | 2,194 | 2/9/2024 |
0.0.50 | 4,212,950 | 1/8/2024 |
0.0.49 | 6,207 | 12/12/2023 |
0.0.48 | 101,930 | 11/29/2023 |
0.0.47 | 3,634 | 11/20/2023 |
0.0.46 | 3,040,667 | 10/19/2023 |
0.0.45 | 280 | 10/19/2023 |
0.0.44 | 1,073 | 10/17/2023 |
0.0.43 | 2,170 | 10/12/2023 |
0.0.42 | 85,063 | 9/20/2023 |
0.0.41 | 274 | 9/19/2023 |
0.0.40 | 312 | 9/7/2023 |
0.0.39 | 318 | 9/6/2023 |
0.0.38 | 277 | 9/4/2023 |
0.0.36 | 320 | 9/4/2023 |
0.0.35 | 282 | 9/4/2023 |
0.0.34 | 276 | 9/4/2023 |
0.0.32 | 297 | 9/4/2023 |
0.0.31 | 303 | 8/31/2023 |
0.0.30 | 313 | 8/31/2023 |
0.0.15 | 326 | 8/30/2023 |
0.0.14 | 327 | 8/29/2023 |
0.0.13 | 410 | 8/29/2023 |
<a id="2.0.1"></a>
# [2.0.1](https://github.com/std-uritemplate/std-uritemplate/releases/tag/2.0.1) - 2024-11-12
[Changes][2.0.1]
<a id="2.0.0"></a>
# [2.0.0](https://github.com/std-uritemplate/std-uritemplate/releases/tag/2.0.0) - 2024-09-30
[Changes][2.0.0]
<a id="1.0.6"></a>
# [1.0.6](https://github.com/std-uritemplate/std-uritemplate/releases/tag/1.0.6) - 2024-08-30
[Changes][1.0.6]
<a id="1.0.5"></a>
# [1.0.5](https://github.com/std-uritemplate/std-uritemplate/releases/tag/1.0.5) - 2024-07-24
[Changes][1.0.5]
[2.0.1]: https://github.com/std-uritemplate/std-uritemplate/compare/2.0.0...2.0.1
[2.0.0]: https://github.com/std-uritemplate/std-uritemplate/compare/1.0.6...2.0.0
[1.0.6]: https://github.com/std-uritemplate/std-uritemplate/compare/1.0.5...1.0.6
[1.0.5]: https://github.com/std-uritemplate/std-uritemplate/tree/1.0.5
<!-- Generated by https://github.com/rhysd/changelog-from-release v3.8.0 -->