Awesome
Epiphy
A persistence framework for RethinkDB. The library is used on phim365.today. Its API is inspired by Lotus::Model.
Epiphy
is name after Epiphyllum
, my wife's name.
Status
Book Simply RethinkDB
I also write this book to practice RethinkDB. Please consider buying a copy if you want to support the author.
I love Lotus::Model so much because it's lightweight, does the job, no magic. I also should fork Lotus and add RethinkDB adapter. However, I want to learn more Ruby and reinvent the wheel because I didn't know how the wheel was created. More than that, my bad code will not be able to make it to Lotus::Model.
Philosophy
Does basic thing well and leave complex query to RethinkDB.
RethinkDB query is very good. By wrapping an ORM around it, we can destroy the joy of using ReQL. I only want to do basic thing with RethinkDB, the complex query should be done use ReQL. The result of query is converted back to an entity of an array of entity when possible.
API
RethinkDB delivers a convenient public API to execute queries and commands against a database. The architecture eases keeping the business logic (entities) separated from details such as persistence or validations.
It implements the following concepts:
- Entity - An object defined by its identity.
- Repository - An object that mediates between the entities and the persistence layer.
- Adapter – A database adapter.
- Query - An object that represents a database query.
Install
gem install epiphy
or add
gem 'epiphy'
to your Gemfile
if you use Bundle. Run bundle install
Testing
Minitest
is used for testing.
Make sure you have a working RethinkDB with default connection information that is localhost, port 28015, without authentication key and run
$ bundle install
$ rake test
A testing database will be created during the testing. The testing data will hit your RethinkDB. Depend on your storge system, test can be fast or slow.
Usage
Checkout Examples.md for detail guide and examples folder for real code.
Entities
An object that is defined by its identity.
An entity is the core of an application, where the part of the domain logic is implemented. It's a small, cohesive object that expresses coherent and meaningful behaviors.
It deals with one and only one responsibility that is pertinent to the domain of the application, without caring about details such as persistence or validations.
This simplicity of design allows developers to focus on behaviors, or message passing if you will, which is the quintessence of Object Oriented Programming.
Setup
connection = Epiphy::Connection.create
adapter = Epiphy::Adapter::RethinkDB.new connection
RethinkDB::Repository.configure do |r|
r.adapter = adapter
end
Define your entity
class Movie
include Epiphy::Entity
self.attributes= :title, :url, :type
end
Define your repository
class MovieRepository
include Epiphy::Repository
end
Query
movie = MovieRepository.find id # Find by id
movie = MovieRepository.first :created_at # Find first entity, order by field :date
movie = MovieRepository.last :created_at # Find first entity, order by field :date
movie = Movie.new
movie.title = "A movie"
MovieRepository.create movie
puts movie.id # return the ID of inserted movie
movie.title = "A new title"
MovieRepository.update movie
movie = Movie.new title: 'Another one', url: "http://youtube.com/foo", type: 'anime'
movie.id = Time.now.to_i #Manually assign an id
MovieRepository.create movie
Custom query
From inside a Repository, we can call query
method and pass in a
block. The method expose two object
- Current ReQL command to play
- Global top name space
r
class MovieRepository
def lop
end
end
Contributing to epiphy
- Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
- Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
- Fork the project.
- Start a feature/bugfix branch.
- Commit and push until you are happy with your contribution.
- Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
- Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
Copyright
Copyright (c) 2014 kureikain. See LICENSE.txt for further details.