mirror of
https://github.com/DatabaseCleaner/database_cleaner
synced 2023-03-27 23:22:03 -04:00
Neo4j support
This commit is contained in:
parent
84cabcaa4f
commit
6288ee1b79
17 changed files with 237 additions and 1 deletions
1
Gemfile
1
Gemfile
|
@ -24,6 +24,7 @@ group :development, :test do
|
|||
|
||||
gem "mongo_mapper"
|
||||
gem "moped"
|
||||
gem "neo4j-core"
|
||||
gem "couch_potato"
|
||||
|
||||
gem "sequel", "~>3.21.0"
|
||||
|
|
42
Gemfile.lock
42
Gemfile.lock
|
@ -29,9 +29,13 @@ GEM
|
|||
arel (1.0.1)
|
||||
activesupport (~> 3.0.0)
|
||||
bcrypt (3.1.7)
|
||||
bcrypt (3.1.7-java)
|
||||
bcrypt-ruby (3.1.5)
|
||||
bcrypt (>= 3.1.3)
|
||||
bcrypt-ruby (3.1.5-java)
|
||||
bcrypt (>= 3.1.3)
|
||||
bson (1.11.1)
|
||||
bson (1.11.1-java)
|
||||
bson_ext (1.11.1)
|
||||
bson (~> 1.11.1)
|
||||
builder (2.1.2)
|
||||
|
@ -190,11 +194,18 @@ GEM
|
|||
data_objects (= 0.10.14)
|
||||
erubis (2.6.6)
|
||||
abstract (>= 1.0.0)
|
||||
faraday (0.9.0)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday_middleware (0.9.1)
|
||||
faraday (>= 0.7.4, < 0.10)
|
||||
fastercsv (1.5.5)
|
||||
ffi (1.9.6)
|
||||
ffi (1.9.6-java)
|
||||
formatador (0.2.5)
|
||||
gherkin (2.11.6)
|
||||
json (>= 1.7.6)
|
||||
gherkin (2.11.6-java)
|
||||
json (>= 1.7.6)
|
||||
git (1.2.8)
|
||||
guard (1.8.3)
|
||||
formatador (>= 0.2.4)
|
||||
|
@ -205,6 +216,10 @@ GEM
|
|||
guard-rspec (2.5.4)
|
||||
guard (>= 1.1)
|
||||
rspec (~> 2.11)
|
||||
httparty (0.13.3)
|
||||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
httpclient (2.5.3.3)
|
||||
i18n (0.4.2)
|
||||
jeweler (1.8.4)
|
||||
bundler (~> 1.0)
|
||||
|
@ -212,6 +227,7 @@ GEM
|
|||
rake
|
||||
rdoc
|
||||
json (1.8.1)
|
||||
json (1.8.1-java)
|
||||
json_pure (1.8.1)
|
||||
linecache (0.46)
|
||||
rbx-require-relative (> 0.0.4)
|
||||
|
@ -239,12 +255,28 @@ GEM
|
|||
mongoid (~> 2.0)
|
||||
moped (1.5.2)
|
||||
multi_json (1.2.0)
|
||||
multi_xml (0.5.5)
|
||||
multipart-post (2.0.0)
|
||||
mysql (2.8.1)
|
||||
mysql2 (0.3.16)
|
||||
neo4j-community (2.1.5)
|
||||
neo4j-core (3.0.8)
|
||||
activesupport
|
||||
faraday (~> 0.9.0)
|
||||
faraday_middleware (~> 0.9.1)
|
||||
httparty
|
||||
httpclient
|
||||
json
|
||||
neo4j-community (~> 2.1.1)
|
||||
net-http-persistent
|
||||
os
|
||||
zip
|
||||
nest (1.1.2)
|
||||
redis
|
||||
net-http-persistent (2.9.4)
|
||||
ohm (0.1.5)
|
||||
nest (~> 1.0)
|
||||
os (0.9.6)
|
||||
pg (0.17.1)
|
||||
plucky (0.5.2)
|
||||
mongo (~> 1.5)
|
||||
|
@ -252,6 +284,11 @@ GEM
|
|||
coderay (~> 1.1.0)
|
||||
method_source (~> 0.8.1)
|
||||
slop (~> 3.4)
|
||||
pry (0.10.1-java)
|
||||
coderay (~> 1.1.0)
|
||||
method_source (~> 0.8.1)
|
||||
slop (~> 3.4)
|
||||
spoon (~> 0.0)
|
||||
rack (1.2.8)
|
||||
rack-mount (0.6.14)
|
||||
rack (>= 1.0.0)
|
||||
|
@ -305,6 +342,8 @@ GEM
|
|||
archive-tar-minitar (>= 0.5.2)
|
||||
sequel (3.21.0)
|
||||
slop (3.6.0)
|
||||
spoon (0.0.4)
|
||||
ffi
|
||||
sqlite3 (1.3.9)
|
||||
sqlite3-ruby (1.3.3)
|
||||
sqlite3 (>= 1.3.3)
|
||||
|
@ -312,8 +351,10 @@ GEM
|
|||
thor (0.14.6)
|
||||
tzinfo (0.3.41)
|
||||
uuidtools (2.1.5)
|
||||
zip (2.0.2)
|
||||
|
||||
PLATFORMS
|
||||
java
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
|
@ -336,6 +377,7 @@ DEPENDENCIES
|
|||
moped
|
||||
mysql (~> 2.8.1)
|
||||
mysql2
|
||||
neo4j-core
|
||||
ohm (~> 0.1.3)
|
||||
pg
|
||||
rake
|
||||
|
|
|
@ -67,9 +67,17 @@ Here is an overview of the strategies supported for each library:
|
|||
<td>No</td>
|
||||
<td>No</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Neo4j</td>
|
||||
<td>Yes</td>
|
||||
<td>Yes*</td>
|
||||
<td>Yes*</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
* Truncation and Deletion strategies for Neo4j will just delete all nodes and relationships from the database.
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
|
|
31
examples/features/step_definitions/neo4j_steps.rb
Normal file
31
examples/features/step_definitions/neo4j_steps.rb
Normal file
|
@ -0,0 +1,31 @@
|
|||
Given /^I have setup database cleaner to clean multiple databases using neo4j$/ do
|
||||
#DatabaseCleaner
|
||||
# require "#{File.dirname(__FILE__)}/../../../lib/neo4j_models"
|
||||
#
|
||||
# DatabaseCleaner[:neo4j, :connection => {:type => :server_db, :path => 'http://localhost:7475'} ]
|
||||
# DatabaseCleaner[:neo4j, :connection => {:type => :server_db, :path => 'http://localhost:7476'} ]
|
||||
end
|
||||
|
||||
When /^I create a widget using neo4j$/ do
|
||||
Neo4jWidget.create!
|
||||
end
|
||||
|
||||
Then /^I should see ([\d]+) widget using neo4j$/ do |widget_count|
|
||||
Neo4jWidget.count.should == widget_count.to_i
|
||||
end
|
||||
|
||||
When /^I create a widget in one db using neo4j$/ do
|
||||
Neo4jWidgetUsingDatabaseOne.create!
|
||||
end
|
||||
|
||||
When /^I create a widget in another db using neo4j$/ do
|
||||
Neo4jWidgetUsingDatabaseTwo.create!
|
||||
end
|
||||
|
||||
Then /^I should see ([\d]+) widget in one db using neo4j$/ do |widget_count|
|
||||
Neo4jWidgetUsingDatabaseOne.count.should == widget_count.to_i
|
||||
end
|
||||
|
||||
Then /^I should see ([\d]+) widget in another db using neo4j$/ do |widget_count|
|
||||
Neo4jWidgetUsingDatabaseTwo.count.should == widget_count.to_i
|
||||
end
|
|
@ -47,6 +47,9 @@ if orm && strategy
|
|||
when :active_record
|
||||
DatabaseCleaner[:active_record, {:model => ActiveRecordWidgetUsingDatabaseOne} ].strategy = strategy.to_sym
|
||||
DatabaseCleaner[:active_record, {:model => ActiveRecordWidgetUsingDatabaseTwo} ].strategy = strategy.to_sym
|
||||
when :neo4j
|
||||
DatabaseCleaner[:neo4j, {:connection => {:type => :server_db, :path => 'http://localhost:7475/'}} ].strategy = strategy.to_sym
|
||||
DatabaseCleaner[:neo4j, {:connection => {:type => :server_db, :path => 'http://localhost:7476/'}} ].strategy = strategy.to_sym
|
||||
else
|
||||
DatabaseCleaner[ orm_sym, {:connection => :one} ].strategy = strategy.to_sym
|
||||
DatabaseCleaner[ orm_sym, {:connection => :two} ].strategy = strategy.to_sym
|
||||
|
|
17
examples/lib/neo4j_models.rb
Normal file
17
examples/lib/neo4j_models.rb
Normal file
|
@ -0,0 +1,17 @@
|
|||
require 'neo4j-core'
|
||||
|
||||
class Neo4jWidget < Neo4j::Node
|
||||
def self.create!(*args)
|
||||
create(*args)
|
||||
end
|
||||
|
||||
def self.count
|
||||
Neo4j::Session.query.pluck('count(*) AS result').first
|
||||
end
|
||||
end
|
||||
|
||||
class Neo4jWidgetUsingDatabaseOne < Neo4jWidget
|
||||
end
|
||||
|
||||
class Neo4jWidgetUsingDatabaseTwo < Neo4jWidget
|
||||
end
|
|
@ -22,3 +22,6 @@ Feature: database cleaning
|
|||
| CouchPotato | truncation |
|
||||
| Redis | truncation |
|
||||
| Ohm | truncation |
|
||||
| Neo4j | deletion |
|
||||
| Neo4j | truncation |
|
||||
| Neo4j | transaction |
|
||||
|
|
|
@ -19,3 +19,4 @@ Feature: database cleaning
|
|||
| CouchPotato |
|
||||
| Redis |
|
||||
| Ohm |
|
||||
| Neo4j |
|
||||
|
|
|
@ -18,3 +18,6 @@ Feature: multiple database cleaning
|
|||
| MongoMapper | truncation |
|
||||
| DataMapper | transaction |
|
||||
| ActiveRecord | transaction |
|
||||
| Neo4j | deletion |
|
||||
| Neo4j | truncation |
|
||||
| Neo4j | transaction |
|
||||
|
|
|
@ -46,3 +46,7 @@ Feature: database cleaning using multiple ORMs
|
|||
| Redis | Mongoid |
|
||||
| Redis | CouchPotato |
|
||||
| Redis | Ohm |
|
||||
| Neo4j | ActiveRecord |
|
||||
| Neo4j | Redis |
|
||||
| Neo4j | Ohm |
|
||||
| Neo4j | MongoMapper |
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
orms_pattern = /(ActiveRecord|DataMapper|MongoMapper|Mongoid|CouchPotato|Redis|Ohm)/
|
||||
orms_pattern = /(ActiveRecord|DataMapper|MongoMapper|Mongoid|CouchPotato|Redis|Ohm|Neo4j)/
|
||||
|
||||
Given /^I am using #{orms_pattern}$/ do |orm|
|
||||
@feature_runner = FeatureRunner.new
|
||||
|
|
|
@ -120,6 +120,8 @@ module DatabaseCleaner
|
|||
:ohm
|
||||
elsif defined? ::Redis
|
||||
:redis
|
||||
elsif defined? ::Neo4j
|
||||
:neo4j
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -153,6 +155,8 @@ module DatabaseCleaner
|
|||
self.strategy = :transaction
|
||||
when :mongo_mapper, :mongoid, :couch_potato, :moped, :ohm, :redis
|
||||
self.strategy = :truncation
|
||||
when :neo4j
|
||||
self.strategy = :transaction
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -123,6 +123,8 @@ module DatabaseCleaner
|
|||
DatabaseCleaner::Ohm
|
||||
when :redis
|
||||
DatabaseCleaner::Redis
|
||||
when :neo4j
|
||||
DatabaseCleaner::Neo4j
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
58
lib/database_cleaner/neo4j/base.rb
Normal file
58
lib/database_cleaner/neo4j/base.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
require 'database_cleaner/generic/base'
|
||||
module DatabaseCleaner
|
||||
module Neo4j
|
||||
def self.available_strategies
|
||||
%w[transaction truncation deletion]
|
||||
end
|
||||
|
||||
module Base
|
||||
include ::DatabaseCleaner::Generic::Base
|
||||
|
||||
def db=(desired_db)
|
||||
@db = desired_db == :default ? nil : desired_db
|
||||
end
|
||||
|
||||
def db
|
||||
@db ||= nil
|
||||
end
|
||||
|
||||
def start
|
||||
if db_type == :embedded_db and not session.running?
|
||||
session.start
|
||||
else
|
||||
session
|
||||
end
|
||||
end
|
||||
|
||||
def database
|
||||
db && default_db.merge(db) || default_db
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def default_db
|
||||
{type: default_db_type, path: default_db_path}
|
||||
end
|
||||
|
||||
def default_db_type
|
||||
:server_db
|
||||
end
|
||||
|
||||
def default_db_path(type = default_db_type)
|
||||
type == :server_db ? 'http://localhost:7475/' : './db/test'
|
||||
end
|
||||
|
||||
def db_type
|
||||
database[:type]
|
||||
end
|
||||
|
||||
def db_path
|
||||
database[:path]
|
||||
end
|
||||
|
||||
def session
|
||||
@session ||= ::Neo4j::Session.open(db_type, db_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
16
lib/database_cleaner/neo4j/deletion.rb
Normal file
16
lib/database_cleaner/neo4j/deletion.rb
Normal file
|
@ -0,0 +1,16 @@
|
|||
require 'database_cleaner/neo4j/base'
|
||||
require 'neo4j-core'
|
||||
|
||||
module DatabaseCleaner
|
||||
module Neo4j
|
||||
class Deletion
|
||||
include ::DatabaseCleaner::Neo4j::Base
|
||||
|
||||
def clean
|
||||
::Neo4j::Transaction.run do
|
||||
session._query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
34
lib/database_cleaner/neo4j/transaction.rb
Normal file
34
lib/database_cleaner/neo4j/transaction.rb
Normal file
|
@ -0,0 +1,34 @@
|
|||
require 'database_cleaner/neo4j/base'
|
||||
require 'database_cleaner/generic/transaction'
|
||||
require 'neo4j-core'
|
||||
|
||||
module DatabaseCleaner
|
||||
module Neo4j
|
||||
class Transaction
|
||||
include ::DatabaseCleaner::Generic::Transaction
|
||||
include ::DatabaseCleaner::Neo4j::Base
|
||||
|
||||
attr_accessor :tx
|
||||
|
||||
def start
|
||||
super
|
||||
rollback
|
||||
self.tx = ::Neo4j::Transaction.new
|
||||
end
|
||||
|
||||
def clean
|
||||
rollback
|
||||
end
|
||||
|
||||
|
||||
private
|
||||
|
||||
def rollback
|
||||
return unless tx
|
||||
tx.failure
|
||||
tx.close
|
||||
self.tx = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
9
lib/database_cleaner/neo4j/truncation.rb
Normal file
9
lib/database_cleaner/neo4j/truncation.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
require 'database_cleaner/neo4j/base'
|
||||
require 'database_cleaner/neo4j/deletion'
|
||||
|
||||
module DatabaseCleaner
|
||||
module Neo4j
|
||||
class Truncation < DatabaseCleaner::Neo4j::Deletion
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue