Add top-level alias functions for constructors of the basic datatypes
This commit is contained in:
parent
aba08fc03a
commit
df05445733
5 changed files with 57 additions and 24 deletions
11
CHANGELOG.md
11
CHANGELOG.md
|
@ -5,6 +5,17 @@ This project adheres to [Semantic Versioning](http://semver.org/) and
|
||||||
[Keep a CHANGELOG](http://keepachangelog.com).
|
[Keep a CHANGELOG](http://keepachangelog.com).
|
||||||
|
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- top-level alias functions for constructors of the basic datatypes
|
||||||
|
|
||||||
|
|
||||||
|
[Compare v0.4.1...HEAD](https://github.com/marcelotto/rdf-ex/compare/v0.4.1...HEAD)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 0.4.1 - 2018-03-19
|
## 0.4.1 - 2018-03-19
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
31
README.md
31
README.md
|
@ -329,7 +329,7 @@ iex> RDF.literal(42, datatype: XSD.double).value
|
||||||
42.0
|
42.0
|
||||||
```
|
```
|
||||||
|
|
||||||
For all of these supported XSD datatypes there're `RDF.Datatype`s available that allow the creation of `RDF.Literal`s with the respective datatype:
|
For all of these supported XSD datatypes there're `RDF.Datatype`s available that allow the creation of `RDF.Literal`s with the respective datatype. Their `new` constructor function can be called also via the alias functions on the top-level `RDF` namespace.
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.Double.new("0042").value
|
iex> RDF.Double.new("0042").value
|
||||||
|
@ -337,15 +337,18 @@ iex> RDF.Double.new("0042").value
|
||||||
|
|
||||||
iex> RDF.Double.new(42).value
|
iex> RDF.Double.new(42).value
|
||||||
42.0
|
42.0
|
||||||
|
|
||||||
|
iex> RDF.double(42).value
|
||||||
|
42.0
|
||||||
```
|
```
|
||||||
|
|
||||||
The `RDF.Literal.valid?/1` function checks if a given literal is valid according to the [XML schema datatype] specification.
|
The `RDF.Literal.valid?/1` function checks if a given literal is valid according to the [XML schema datatype] specification.
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.Literal.valid? RDF.Integer.new("42")
|
iex> RDF.Literal.valid? RDF.integer("42")
|
||||||
true
|
true
|
||||||
|
|
||||||
iex> RDF.Literal.valid? RDF.Integer.new("foo")
|
iex> RDF.Literal.valid? RDF.integer("foo")
|
||||||
false
|
false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -354,31 +357,31 @@ If you want to prohibit the creation of invalid literals, you can use the `new!`
|
||||||
A RDF literal is bound to the lexical form of the initially given value. This lexical representation can be retrieved with the `RDF.Literal.lexical/1` function:
|
A RDF literal is bound to the lexical form of the initially given value. This lexical representation can be retrieved with the `RDF.Literal.lexical/1` function:
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.Literal.lexical RDF.Integer.new("0042")
|
iex> RDF.Literal.lexical RDF.integer("0042")
|
||||||
"0042"
|
"0042"
|
||||||
|
|
||||||
iex> RDF.Literal.lexical RDF.Integer.new(42)
|
iex> RDF.Literal.lexical RDF.integer(42)
|
||||||
"42"
|
"42"
|
||||||
```
|
```
|
||||||
|
|
||||||
Although two literals might have the same value, they are not equal if they don't have the same lexical form:
|
Although two literals might have the same value, they are not equal if they don't have the same lexical form:
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.Integer.new("0042").value == RDF.Integer.new("42").value
|
iex> RDF.integer("0042").value == RDF.integer("42").value
|
||||||
true
|
true
|
||||||
|
|
||||||
iex> RDF.Integer.new("0042") == RDF.Integer.new("42")
|
iex> RDF.integer("0042") == RDF.integer("42")
|
||||||
false
|
false
|
||||||
```
|
```
|
||||||
|
|
||||||
The `RDF.Literal.canonical/1` function returns the given literal with its canonical lexical form according its datatype:
|
The `RDF.Literal.canonical/1` function returns the given literal with its canonical lexical form according its datatype:
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.Integer.new("0042") |> RDF.Literal.canonical |> RDF.Literal.lexical
|
iex> RDF.integer("0042") |> RDF.Literal.canonical |> RDF.Literal.lexical
|
||||||
"42"
|
"42"
|
||||||
|
|
||||||
iex> RDF.Literal.canonical(RDF.Integer.new("0042")) ==
|
iex> RDF.Literal.canonical(RDF.integer("0042")) ==
|
||||||
RDF.Literal.canonical(RDF.Integer.new("42"))
|
RDF.Literal.canonical(RDF.integer("42"))
|
||||||
true
|
true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -394,13 +397,13 @@ The `RDF.Triple` and `RDF.Quad` modules both provide a function `new` for such t
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.triple(EX.S, EX.p, 1)
|
iex> RDF.triple(EX.S, EX.p, 1)
|
||||||
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.Integer.new(1)}
|
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.integer(1)}
|
||||||
|
|
||||||
iex> RDF.triple {EX.S, EX.p, 1}
|
iex> RDF.triple {EX.S, EX.p, 1}
|
||||||
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.Integer.new(1)}
|
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.integer(1)}
|
||||||
|
|
||||||
iex> RDF.quad(EX.S, EX.p, 1, EX.Graph)
|
iex> RDF.quad(EX.S, EX.p, 1, EX.Graph)
|
||||||
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.Integer.new(1),
|
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.integer(1),
|
||||||
~I<http://example.com/Graph>}
|
~I<http://example.com/Graph>}
|
||||||
|
|
||||||
iex> RDF.triple {EX.S, 1, EX.O}
|
iex> RDF.triple {EX.S, 1, EX.O}
|
||||||
|
@ -413,7 +416,7 @@ If you want to explicitly create a quad in the default graph context, you can us
|
||||||
|
|
||||||
```elixir
|
```elixir
|
||||||
iex> RDF.quad(EX.S, EX.p, 1, nil)
|
iex> RDF.quad(EX.S, EX.p, 1, nil)
|
||||||
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.Integer.new(1), nil}
|
{~I<http://example.com/S>, ~I<http://example.com/p>, RDF.integer(1), nil}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
0.4.1
|
0.4.2-dev
|
||||||
|
|
28
lib/rdf.ex
28
lib/rdf.ex
|
@ -121,16 +121,26 @@ defmodule RDF do
|
||||||
defdelegate list?(resource, graph), to: RDF.List, as: :node?
|
defdelegate list?(resource, graph), to: RDF.List, as: :node?
|
||||||
defdelegate list?(description), to: RDF.List, as: :node?
|
defdelegate list?(description), to: RDF.List, as: :node?
|
||||||
|
|
||||||
def list(native_list),
|
def list(native_list), do: RDF.List.from(native_list)
|
||||||
do: RDF.List.from(native_list)
|
def list(head, %Graph{} = graph), do: RDF.List.new(head, graph)
|
||||||
|
def list(native_list, opts), do: RDF.List.from(native_list, opts)
|
||||||
def list(head, %Graph{} = graph),
|
|
||||||
do: RDF.List.new(head, graph)
|
|
||||||
|
|
||||||
def list(native_list, opts),
|
|
||||||
do: RDF.List.from(native_list, opts)
|
|
||||||
|
|
||||||
|
|
||||||
|
defdelegate string(value), to: RDF.String, as: :new
|
||||||
|
defdelegate string(value, opts), to: RDF.String, as: :new
|
||||||
|
defdelegate lang_string(value), to: RDF.LangString, as: :new
|
||||||
|
defdelegate lang_string(value, opts), to: RDF.LangString, as: :new
|
||||||
|
defdelegate boolean(value), to: RDF.Boolean, as: :new
|
||||||
|
defdelegate boolean(value, opts), to: RDF.Boolean, as: :new
|
||||||
|
defdelegate integer(value), to: RDF.Integer, as: :new
|
||||||
|
defdelegate integer(value, opts), to: RDF.Integer, as: :new
|
||||||
|
defdelegate double(value), to: RDF.Double, as: :new
|
||||||
|
defdelegate double(value, opts), to: RDF.Double, as: :new
|
||||||
|
defdelegate date(value), to: RDF.Date, as: :new
|
||||||
|
defdelegate date(value, opts), to: RDF.Date, as: :new
|
||||||
|
defdelegate time(value), to: RDF.Time, as: :new
|
||||||
|
defdelegate time(value, opts), to: RDF.Time, as: :new
|
||||||
|
defdelegate date_time(value), to: RDF.DateTime, as: :new
|
||||||
|
defdelegate date_time(value, opts), to: RDF.DateTime, as: :new
|
||||||
|
|
||||||
for term <- ~w[type subject predicate object first rest value]a do
|
for term <- ~w[type subject predicate object first rest value]a do
|
||||||
defdelegate unquote(term)(), to: RDF.NS.RDF
|
defdelegate unquote(term)(), to: RDF.NS.RDF
|
||||||
|
|
|
@ -2,4 +2,13 @@ defmodule RDFTest do
|
||||||
use RDF.Test.Case
|
use RDF.Test.Case
|
||||||
|
|
||||||
doctest RDF
|
doctest RDF
|
||||||
|
|
||||||
|
test "Datatype constructor alias functions" do
|
||||||
|
RDF.Datatype.modules
|
||||||
|
|> Enum.each(fn datatype ->
|
||||||
|
"rdf/" <> alias_name = datatype |> Macro.underscore
|
||||||
|
assert apply(RDF, String.to_atom(alias_name), [1]) == datatype.new(1)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue