From edc80dc6547a836f7f8f1003608385040e807322 Mon Sep 17 00:00:00 2001 From: Brian Underwood Date: Fri, 5 Feb 2016 12:26:27 +0700 Subject: [PATCH] Not there yet, but slowly slowly... --- .agignore | 1 + Gemfile | 3 +- lib/neo4j/active_base.rb | 5 +- lib/neo4j/active_node/labels.rb | 2 + lib/neo4j/active_node/persistence.rb | 6 +- lib/neo4j/shared.rb | 7 +- spec/e2e/active_model_spec.rb | 4 - spec/e2e/module_handling.rb | 2 - spec/e2e/query_spec.rb | 18 +-- spec/spec_helper.rb | 130 +++++++------------ spec/unit/active_rel/persistence_spec_bad.rb | 2 - 11 files changed, 67 insertions(+), 113 deletions(-) create mode 100644 .agignore diff --git a/.agignore b/.agignore new file mode 100644 index 000000000..30d85567b --- /dev/null +++ b/.agignore @@ -0,0 +1 @@ +*.rst diff --git a/Gemfile b/Gemfile index adc1873be..4c7507532 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,8 @@ source 'http://rubygems.org' gemspec -gem 'neo4j-core', github: 'neo4jrb/neo4j-core', branch: 'master' if ENV['CI'] +# gem 'neo4j-core', github: 'neo4jrb/neo4j-core', branch: 'master' if ENV['CI'] +gem 'neo4j-core', path: '../neo4j-core' # gem 'active_attr', github: 'neo4jrb/active_attr', branch: 'performance' # gem 'active_attr', path: '../active_attr' diff --git a/lib/neo4j/active_base.rb b/lib/neo4j/active_base.rb index 45acbe2aa..5f023c5be 100644 --- a/lib/neo4j/active_base.rb +++ b/lib/neo4j/active_base.rb @@ -4,9 +4,12 @@ module Neo4j module ActiveBase class << self def current_session - SessionRegistry.current_session + SessionRegistry.current_session.tap do |session| + fail 'No session defined!' if session.nil? + end end + # Should support setting session via config options def set_current_session(session) SessionRegistry.current_session = session end diff --git a/lib/neo4j/active_node/labels.rb b/lib/neo4j/active_node/labels.rb index 2555094c1..3c4f4d42e 100644 --- a/lib/neo4j/active_node/labels.rb +++ b/lib/neo4j/active_node/labels.rb @@ -1,3 +1,5 @@ +require 'neo4j/core/label' + module Neo4j module ActiveNode # Provides a mapping between neo4j labels and Ruby classes diff --git a/lib/neo4j/active_node/persistence.rb b/lib/neo4j/active_node/persistence.rb index 97f2fb204..df6dcd0ee 100644 --- a/lib/neo4j/active_node/persistence.rb +++ b/lib/neo4j/active_node/persistence.rb @@ -90,8 +90,6 @@ def labels_for_create private def destroy_query - require 'pry' - binding.pry query_as(:n).optional_match('(n)-[r]-()').delete(:n, :r) end @@ -135,7 +133,7 @@ def create!(*args) end def merge(attributes) - neo4j_query.merge(n: {self.mapped_label_names => attributes}) + new_query.merge(n: {self.mapped_label_names => attributes}) .on_create_set(n: on_create_props(attributes)) .on_match_set(n: on_match_props) .pluck(:n).first @@ -143,7 +141,7 @@ def merge(attributes) def find_or_create(find_attributes, set_attributes = {}) on_create_attributes = set_attributes.reverse_merge(on_create_props(find_attributes)) - neo4j_query.merge(n: {self.mapped_label_names => find_attributes}) + new_query.merge(n: {self.mapped_label_names => find_attributes}) .on_create_set(n: on_create_attributes) .pluck(:n).first end diff --git a/lib/neo4j/shared.rb b/lib/neo4j/shared.rb index 0ad13368e..930570e61 100644 --- a/lib/neo4j/shared.rb +++ b/lib/neo4j/shared.rb @@ -10,8 +10,6 @@ module Shared module ClassMethods # TODO: Deprecate neo4j_session_name(name) - SelfDeprecation.:neo4j_session_name - def neo4j_session Neo4j::ActiveBase.current_session end @@ -27,9 +25,12 @@ def neo4j_current_transaction_or_session # This should be used everywhere. Should make it easy # to support a session-per-model system def neo4j_query(*args) - puts 'querying...' neo4j_current_transaction_or_session.query(*args) end + + def new_query + Neo4j::ActiveBase.new_query + end end included do diff --git a/spec/e2e/active_model_spec.rb b/spec/e2e/active_model_spec.rb index b7621662d..689b1b577 100644 --- a/spec/e2e/active_model_spec.rb +++ b/spec/e2e/active_model_spec.rb @@ -1,7 +1,3 @@ -# class ExtendedIceLolly < IceLolly -# property :extended_property -# end - describe 'Neo4j::ActiveNode' do before(:each) do clear_model_memory_caches diff --git a/spec/e2e/module_handling.rb b/spec/e2e/module_handling.rb index 2a38a8dba..dff33de74 100644 --- a/spec/e2e/module_handling.rb +++ b/spec/e2e/module_handling.rb @@ -1,5 +1,3 @@ -require 'spec_helper' - describe 'Module handling from config: :module_handling option' do let(:clazz) do Class.new do diff --git a/spec/e2e/query_spec.rb b/spec/e2e/query_spec.rb index d633548f4..c5b22e15f 100644 --- a/spec/e2e/query_spec.rb +++ b/spec/e2e/query_spec.rb @@ -1,7 +1,5 @@ require 'set' - - describe 'Query API' do before(:each) do delete_db @@ -204,19 +202,9 @@ def self.ordered_by_subject end describe '.merge' do - # The ActiveNode stubbing is doing some odd things with the `name` method on the defined classes, - # so please excuse this kludge. - after(:all) do - Object.send(:remove_const, :TeacherFoo) - Object.send(:remove_const, :Substitute) - end - - class TeacherFoo - include Neo4j::ActiveNode - end - - class Substitute < TeacherFoo - include Neo4j::ActiveNode + before(:each) do + stub_active_node_class('TeacherFoo') + stub_named_class('Substitute', TeacherFoo) end it 'sets all expected labels' do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dea8cb676..bf4281081 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -62,51 +62,10 @@ def self.root I18n.enforce_available_locales = false module Neo4jSpecHelpers - extend ActiveSupport::Concern - - def server_username - ENV['NEO4J_USERNAME'] || 'neo4j' - end - - def server_password - ENV['NEO4J_PASSWORD'] || 'neo4jrb rules, ok?' - end - - def basic_auth_hash - { - username: server_username, - password: server_password - } - end - - def server_url - ENV['NEO4J_URL'] || 'http://localhost:7474' - end - - def session_mode - RUBY_PLATFORM == 'java' ? :embedded : :http - end - - def create_session(options = {}) - @current_session = Neo4j::Core::CypherSession.new(session_adaptor(options.merge(wrap_level: :proc))) - Neo4j::ActiveBase.set_current_session(@current_session) - end - def new_query Neo4j::Core::Query.new end - def session_adaptor(options = {}) - case session_mode - when :embedded - Neo4j::Core::CypherSession::Adaptors::Embedded.new(EMBEDDED_DB_PATH, {impermanent: true, auto_commit: true}.merge(options)) - when :http - Neo4j::Core::CypherSession::Adaptors::HTTP.new(server_url, {basic_auth: basic_auth_hash}.merge(options)) - else - fail "Invalid session_mode: #{session_mode.inspect}" - end - end - def session @current_session end @@ -121,18 +80,16 @@ def log_queries! Neo4j::Core::CypherSession::Adaptors::Embedded.subscribe_to_transaction(&method(:puts)) end - class_methods do - def let_config(var_name) - before do - @neo4j_config_vars ||= ActiveSupport::HashWithIndifferentAccess.new - @neo4j_config_vars[var_name] = Neo4j::Config[var_name] - Neo4j::Config[var_name] = yield - end + def self.let_config(var_name) + before do + @neo4j_config_vars ||= ActiveSupport::HashWithIndifferentAccess.new + @neo4j_config_vars[var_name] = Neo4j::Config[var_name] + Neo4j::Config[var_name] = yield + end - after do - Neo4j::Config[var_name] = @neo4j_config_vars[var_name] - @neo4j_config_vars.delete(var_name) - end + after do + Neo4j::Config[var_name] = @neo4j_config_vars[var_name] + @neo4j_config_vars.delete(var_name) end end @@ -158,9 +115,9 @@ def clear_model_memory_caches Neo4j::ActiveNode::Labels.clear_wrapped_models end -def delete_db(session = current_session) +def delete_db # clear_model_memory_caches - session.query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r') + Neo4j::ActiveBase.current_session.query('MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r') end Dir[File.dirname(__FILE__) + '/support/**/*.rb'].each { |f| require f } @@ -210,43 +167,54 @@ def to_s end end -def before_session - @current_session.close if @current_session && @current_session.respond_to?(:close) - yield - create_session -end +RSpec.configure do |config| + config.include Neo4jSpecHelpers + config.include ActiveNodeRelStubHelpers -def current_transaction - Neo4j::Transaction.current_for(@current_session) -end + # Setup the current session + config.before(:suite) do + puts 'before suite' + session_mode = RUBY_PLATFORM == 'java' ? :embedded : :http -RSpec.configure do |c| - c.include Neo4jSpecHelpers + session_adaptor = case session_mode + when :embedded + Neo4j::Core::CypherSession::Adaptors::Embedded.new(EMBEDDED_DB_PATH, impermanent: true, auto_commit: true, wrap_level: :proc) + when :http + server_url = ENV['NEO4J_URL'] || 'http://localhost:7474' + server_username = ENV['NEO4J_USERNAME'] || 'neo4j' + server_password = ENV['NEO4J_PASSWORD'] || 'neo4jrb rules, ok?' - c.before(:all) do - @current_session.close if @current_session - create_session - end + basic_auth_hash = {username: server_username, password: server_password} + + Neo4j::Core::CypherSession::Adaptors::HTTP.new(server_url, basic_auth: basic_auth_hash, wrap_level: :proc) + end - c.before(:each) do - # TODO: What to do about this? - Neo4j::Session._listeners.clear - @current_session || create_session + Neo4j::ActiveBase.set_current_session(Neo4j::Core::CypherSession.new(session_adaptor)) end - c.after(:each) do - if current_transaction - puts 'WARNING forgot to close transaction' - Neo4j::ActiveBase.wait_for_schema_changes - current_transaction.close - end + config.after(:suite) do + # Ability to close? end - c.exclusion_filter = { + # config.before(:each) do + # puts 'before each' + # # TODO: What to do about this? + # Neo4j::Session._listeners.clear + # @current_session || create_session + # end + + # config.after(:each) do + # puts 'after each' + # if current_transaction + # puts 'WARNING forgot to close transaction' + # Neo4j::ActiveBase.wait_for_schema_changes + # current_transaction.close + # end + # end + + config.exclusion_filter = { api: lambda do |ed| RUBY_PLATFORM == 'java' && ed == :server end } - - c.include ActiveNodeRelStubHelpers end diff --git a/spec/unit/active_rel/persistence_spec_bad.rb b/spec/unit/active_rel/persistence_spec_bad.rb index cfbabf933..c927b9ff1 100644 --- a/spec/unit/active_rel/persistence_spec_bad.rb +++ b/spec/unit/active_rel/persistence_spec_bad.rb @@ -1,5 +1,3 @@ -require 'spec_helper' - describe Neo4j::ActiveRel::Persistence do let(:session) { double('Session') } let(:node1) { double('first persisted node') }