Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/florinpatrascu/neo4j_sips_models
Neo4j models, for Neo4j.Sips
https://github.com/florinpatrascu/neo4j_sips_models
Last synced: 11 days ago
JSON representation
Neo4j models, for Neo4j.Sips
- Host: GitHub
- URL: https://github.com/florinpatrascu/neo4j_sips_models
- Owner: florinpatrascu
- License: mit
- Created: 2016-03-05T18:23:41.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2020-03-05T02:05:19.000Z (over 4 years ago)
- Last Synced: 2024-10-10T20:17:59.852Z (24 days ago)
- Language: Elixir
- Size: 27.3 KB
- Stars: 6
- Watchers: 4
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- freaking_awesome_elixir - Elixir - Minimalistic Model support for the Neo4j.Sips Elixir driver. (ORM and Datamapping)
- fucking-awesome-elixir - neo4j_sips_models - Minimalistic Model support for the Neo4j.Sips Elixir driver. (ORM and Datamapping)
- awesome-elixir - neo4j_sips_models - Minimalistic Model support for the Neo4j.Sips Elixir driver. (ORM and Datamapping)
README
## Neo4j.Sips.Models
Minimalistic Model support for the [Neo4j.Sips](https://github.com/florinpatrascu/neo4j_sips) Elixir driver.
### Install
If available on Hex.pm, edit the `mix.ex` configuration file and add the `neo4j_sips_models` dependency to the `deps/1 `function:
```elixir
defp deps do
[{:neo4j_sips_models, "~> 0.1"}]
end
```or Github:
```elixir
defp deps do
[{:neo4j_sips_models, github: "florinpatrascu/neo4j_sips_models"}]
end
```Or, if you're using a local development copy:
```elixir
defp deps do
[{:neo4j_sips_models, path: "../neo4j_sips_models"}]
end
```Then add the `neo4j_sips_models` dependency the applications list:
```elixir
def application do
[applications: [:logger, :neo4j_sips_models]]
end
```Edit the `config/config.exs` and describe a Neo4j server endpoint, example:
```elixir
config :neo4j_sips, Neo4j,
url: "http://localhost:7474",
pool_size: 5,
max_overflow: 2,
timeout: 30
```Run `mix do deps.get, deps.compile`
If your server requires basic authentication, add this to your config file:
```elixir
basic_auth: [username: "foo", password: "bar"]
```
Or:
```elixir
token_auth: "bmVvNGo6dGVzdA==" # if using an authentication token?!
```
### UsageYou can easily define your own Neo4j Models like this:
```elixir
defmodule Person do
use Neo4j.Sips.Modelfield :name, required: true
field :email, required: true, unique: true, format: ~r/\b[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}\b/
field :age, type: :integer
field :doe_family, type: :boolean, default: false # used for testing
field :neo4j_sips, type: :boolean, default: truevalidate_with :check_age
relationship :FRIEND_OF, Person
relationship :MARRIED_TO, Persondef check_age(model) do
if model.age == nil || model.age <= 0 do
{:age, "model.validation.invalid_age"}
end
end
end```
and use in various scenarios. Example from various tests file:
```elixir
assert {:ok, john} = Person.create(name: "John DOE", email: "[email protected]",
age: 30, doe_family: true,
enable_validations: true)
assert john != nil
assert {:ok, jane} = Person.create(name: "Jane DOE", email: "[email protected]",
age: 25, enable_validations: true, doe_family: true,
married_to: john)
on_exit({john, jane}, fn ->
assert :ok = Person.delete(john)
assert :ok = Person.delete(jane)
end)...
# model find
test "find Jane DOE" do
persons = Person.find!(name: "Jane DOE")
assert length(persons) == 1person = List.first(persons)
assert person.name == "Jane DOE"
assert person.email == "[email protected]"
assert person.age == 25
endtest "find John DOE" do
persons = Person.find!(name: "John DOE")
assert length(persons) == 1person = List.first(persons)
assert person.name == "John DOE"
assert person.email == "[email protected]"
assert person.age == 30
end...
# serialization
Person.to_json(jane)# support for relationships
relationship_names = Person.metadata.relationships |> Enum.map(&(&1.name))
relationship_related_models = Person.metadata.relationships |> Enum.map(&(&1.related_model))
assert relationship_names == [:FRIEND_OF, :MARRIED_TO]
assert relationship_related_models == [Person, Person]...
#support for validation
test "invalid mail format" do
{:nok, nil, person} = Person.create(name: "John Doe", email: "johndoe.example.com", age: 30)
assert Enum.find(person.errors[:email], &(&1 == "model.validation.invalid")) != nil
endtest "invalid age value" do
{:nok, nil, person} = Person.create(name: "John Doe", email: "[email protected]", age: -30)
assert Enum.find(person.errors[:age], &(&1 == "model.validation.invalid_age")) != nil
end## and more
```For more examples, see the test suites.
### Contributing
To contribute you need to compile Mongo.Ecto from source and test it:
$ git clone https://github.com/florinpatrascu/neo4j_sips_models
$ cd neo4j_sips_models
$ mix test### Special thanks
This project is based on the work started by: [Rawane ZOSSOU](https://github.com/raw1z). Thank you, @raw1z!
### License
* Neo4j.Sips.Model - MIT, check [LICENSE](LICENSE) file for more information.
* Neo4j - Dual free software/commercial license, see http://neo4j.org/