dm-hibernate-adapter 0.1pre-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/dm-hibernate-adapter.rb +471 -0
- data/lib/dm-hibernate-adapter/dialects.rb +37 -0
- data/lib/dm-hibernate-adapter/hibernate.rb +403 -0
- data/lib/dm-hibernate-adapter/spec/setup.rb +27 -0
- data/lib/dm-hibernate-adapter/transaction.rb +27 -0
- data/lib/dm-hibernate-adapter_ext.jar +0 -0
- data/lib/jibernate.rb +2 -0
- data/spec/abstract_adapter/adapter_shared_spec.rb +514 -0
- data/spec/abstract_adapter/dm-hibernate-adapter_spec.rb +25 -0
- data/spec/abstract_adapter/rcov.opts +6 -0
- data/spec/abstract_adapter/spec.opts +4 -0
- data/spec/abstract_adapter/spec_helper.rb +8 -0
- data/spec/dm_core/adapter_spec.rb +12 -0
- data/spec/dm_core/rcov.opts +6 -0
- data/spec/dm_core/spec.opts +5 -0
- data/spec/dm_core/spec_helper.rb +42 -0
- data/spec/log4j.properties +11 -0
- data/spec/transient/dm-hibernate-adapter_spec.rb +57 -0
- data/spec/transient/lib/adapter_helpers.rb +107 -0
- data/spec/transient/lib/collection_helpers.rb +18 -0
- data/spec/transient/lib/counter_adapter.rb +38 -0
- data/spec/transient/lib/pending_helpers.rb +46 -0
- data/spec/transient/lib/rspec_immediate_feedback_formatter.rb +54 -0
- data/spec/transient/rcov.opts +6 -0
- data/spec/transient/shared/adapter_shared_spec.rb +408 -0
- data/spec/transient/shared/finder_shared_spec.rb +1513 -0
- data/spec/transient/shared/model_spec.rb +165 -0
- data/spec/transient/shared/property_spec.rb +412 -0
- data/spec/transient/shared/resource_shared_spec.rb +1226 -0
- data/spec/transient/shared/resource_spec.rb +133 -0
- data/spec/transient/shared/sel_shared_spec.rb +112 -0
- data/spec/transient/spec.opts +4 -0
- data/spec/transient/spec_helper.rb +14 -0
- metadata +210 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
dir = Pathname(__FILE__).dirname.expand_path.to_s
|
3
|
+
|
4
|
+
require dir + '/spec_helper'
|
5
|
+
|
6
|
+
require dir + '/adapter_shared_spec'
|
7
|
+
|
8
|
+
describe DataMapper::Adapters::HibernateAdapter do
|
9
|
+
DB_CONFIGS = {
|
10
|
+
:H2_EMB => { :adapter => "hibernate", :dialect => "H2", :username => "sa", :url => "jdbc:h2:target/jibernate" },
|
11
|
+
:DERBY_EMB => { :adapter => "hibernate", :dialect => "Derby", :url => "jdbc:derby:target/jibernate;create=true" },
|
12
|
+
:HSQL_EMB => { :adapter => "hibernate", :dialect => "HSQL", :username => "sa", :url => "jdbc:hsqldb:file:target/testdb;create=true" },
|
13
|
+
:MySQL5 => { :adapter => "hibernate", :dialect => "MySQL5", :username => "root", :password => "root",
|
14
|
+
:url => "jdbc:mysql://localhost:3306/jibernate"},
|
15
|
+
:PostgreSQL => { :adapter => "hibernate", :dialect => "PostgreSQL", :username => "postgres", :password => "postgres",
|
16
|
+
:url => "jdbc:postgresql://localhost:5432/jibernate"}
|
17
|
+
}
|
18
|
+
|
19
|
+
before :all do
|
20
|
+
@adapter = DataMapper.setup(:default,DB_CONFIGS[(ENV['DIALECT'] || :H2_EMB).to_sym])
|
21
|
+
end
|
22
|
+
|
23
|
+
it_should_behave_like 'An Adapter'
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'dm-core/spec/shared/adapter_spec'
|
4
|
+
|
5
|
+
describe 'DataMapper::Adapters::HibernateAdapter' do
|
6
|
+
before :all do
|
7
|
+
@adapter = DataMapper::Spec.adapter
|
8
|
+
@repository = DataMapper.repository(@adapter.name)
|
9
|
+
end
|
10
|
+
|
11
|
+
it_should_behave_like "An Adapter"
|
12
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'spec'
|
4
|
+
require 'dm-transactions'
|
5
|
+
require 'dm-migrations'
|
6
|
+
require 'dm-hibernate-adapter/spec/setup'
|
7
|
+
|
8
|
+
ENV['ADAPTER'] = 'hibernate'
|
9
|
+
ENV['ADAPTER_SUPPORTS'] = 'all'
|
10
|
+
|
11
|
+
SPEC_ROOT = Pathname(__FILE__).dirname.expand_path
|
12
|
+
LIB_ROOT = $:.select{|path| path =~ /.+dm-core.+lib/}.first
|
13
|
+
|
14
|
+
Pathname.glob((LIB_ROOT + '/dm-core/spec/**/*.rb' ).to_s).each { |file| require file }
|
15
|
+
Pathname.glob((SPEC_ROOT + '{lib,support,*/shared}/**/*.rb').to_s).each { |file| require file }
|
16
|
+
|
17
|
+
Spec::Runner.configure do |config|
|
18
|
+
|
19
|
+
config.extend( DataMapper::Spec::Adapters::Helpers)
|
20
|
+
config.include(DataMapper::Spec::PendingHelpers)
|
21
|
+
config.include(DataMapper::Spec::Helpers)
|
22
|
+
|
23
|
+
config.after :all do
|
24
|
+
DataMapper::Spec.cleanup_models
|
25
|
+
Hibernate.reset_config
|
26
|
+
end
|
27
|
+
|
28
|
+
config.after :all do
|
29
|
+
# global ivar cleanup
|
30
|
+
DataMapper::Spec.remove_ivars(self, instance_variables.reject { |ivar| ivar[0, 2] == '@_' })
|
31
|
+
end
|
32
|
+
|
33
|
+
config.after :all do
|
34
|
+
# WTF: rspec holds a reference to the last match for some reason.
|
35
|
+
# When the object ivars are explicitly removed, this causes weird
|
36
|
+
# problems when rspec uses it (!). Why rspec does this I have no
|
37
|
+
# idea because I cannot determine the intention from the code.
|
38
|
+
DataMapper::Spec.remove_ivars(Spec::Matchers.last_matcher, %w[ @expected ])
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
log4j.rootCategory=warn, stdout
|
2
|
+
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
3
|
+
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
4
|
+
log4j.appender.stdout.layout.ConversionPattern=(%c) - %m%n
|
5
|
+
|
6
|
+
log4j.category.org.hibernate=warn
|
7
|
+
log4j.category.org.hibernate.SQL=warn
|
8
|
+
log4j.category.DataMapper=debug
|
9
|
+
log4j.category.DataMapper.Adapters.HibernateAdapter=warn
|
10
|
+
log4j.category.Hibernate=debug
|
11
|
+
log4j.category.Hibernate.Model=info
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
dir = Pathname(__FILE__).dirname.expand_path.to_s
|
3
|
+
dir_shared = dir + "/shared"
|
4
|
+
|
5
|
+
require dir + '/spec_helper'
|
6
|
+
|
7
|
+
require dir_shared + '/adapter_shared_spec'
|
8
|
+
require dir_shared + '/model_spec'
|
9
|
+
require dir_shared + '/finder_shared_spec'
|
10
|
+
require dir_shared + '/property_spec'
|
11
|
+
require dir_shared + '/resource_spec'
|
12
|
+
require dir_shared + '/resource_shared_spec'
|
13
|
+
require dir_shared + '/sel_shared_spec'
|
14
|
+
|
15
|
+
describe DataMapper::Adapters::HibernateAdapter do
|
16
|
+
DB_CONFIGS = {
|
17
|
+
:H2_EMB => { :adapter => "hibernate", :dialect => "H2", :username => "sa", :url => "jdbc:h2:target/jibernate" },
|
18
|
+
:DERBY_EMB => { :adapter => "hibernate", :dialect => "Derby", :url => "jdbc:derby:target/jibernate;create=true" },
|
19
|
+
:HSQL_EMB => { :adapter => "hibernate", :dialect => "HSQL", :username => "sa", :url => "jdbc:hsqldb:file:target/testdb;create=true" },
|
20
|
+
:MySQL5 => { :adapter => "hibernate", :dialect => "MySQL5", :username => "root", :password => "root",
|
21
|
+
:url => "jdbc:mysql://localhost:3306/jibernate"},
|
22
|
+
:PostgreSQL => { :adapter => "hibernate", :dialect => "PostgreSQL", :username => "postgres", :password => "postgres",
|
23
|
+
:url => "jdbc:postgresql://localhost:5432/jibernate"}
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
# XXX Add drivers to run specs against them
|
27
|
+
DRIVERS = [ (ENV['DIALECT'] || :H2_EMB).to_sym ]
|
28
|
+
|
29
|
+
# "big ones"
|
30
|
+
# DRIVERS = [ :MySQL5, :PostgreSQL ].freeze
|
31
|
+
# "small ones"
|
32
|
+
# DRIVERS = [ :H2_EMB, :DERBY_EMB, :HSQL_EMB ].freeze
|
33
|
+
# all
|
34
|
+
# DRIVERS = [ :H2_EMB, :DERBY_EMB, :HSQL_EMB, :MySQL5, :PostgreSQL ].freeze
|
35
|
+
|
36
|
+
# iterate over selected drivers and run specs
|
37
|
+
DRIVERS.collect{|d| [d, DB_CONFIGS[d]]}.each do |driver, connection_options|
|
38
|
+
|
39
|
+
describe "with +#{driver}+ driver => " do
|
40
|
+
|
41
|
+
before :all do
|
42
|
+
@adapter = DataMapper.setup(:default, connection_options )
|
43
|
+
end
|
44
|
+
|
45
|
+
# Abstract adapter spec
|
46
|
+
# it_should_behave_like 'An Adapter' # STATUS: ~OK
|
47
|
+
# property_spec.rb
|
48
|
+
it_should_behave_like 'An Adapter with property_spec support'
|
49
|
+
|
50
|
+
# model_spec.rb
|
51
|
+
# it_should_behave_like 'An Adapter with model_spec support' # STATUS: PENDING
|
52
|
+
# resource_spec.rb
|
53
|
+
# it_should_behave_like 'An Adapter with resource_spec support' # STATUS: PENDING
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
|
3
|
+
module DataMapper::Spec
|
4
|
+
module AdapterHelpers
|
5
|
+
def self.current_adapters
|
6
|
+
@current_adapters ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def supported_by(*adapters, &block)
|
10
|
+
adapters = get_adapters(*adapters)
|
11
|
+
|
12
|
+
PRIMARY.only(*adapters).each do |adapter, connection_uri|
|
13
|
+
# keep track of the current adapters
|
14
|
+
AdapterHelpers.current_adapters << adapters
|
15
|
+
|
16
|
+
describe("with #{adapter}") do
|
17
|
+
before :all do
|
18
|
+
# store these in instance vars for the shared adapter specs
|
19
|
+
@adapter = DataMapper.setup(:default, connection_uri)
|
20
|
+
@repository = DataMapper.repository(@adapter.name)
|
21
|
+
|
22
|
+
# create all tables and constraints before each spec
|
23
|
+
if @repository.respond_to?(:auto_migrate!)
|
24
|
+
@repository.auto_migrate!
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
after :all do
|
29
|
+
# remove all tables and constraints after each spec
|
30
|
+
if DataMapper.respond_to?(:auto_migrate_down!, true)
|
31
|
+
DataMapper.send(:auto_migrate_down!, @repository.name)
|
32
|
+
end
|
33
|
+
|
34
|
+
DataMapper::Repository.adapters.delete(@repository.name)
|
35
|
+
end
|
36
|
+
|
37
|
+
# TODO: add destroy_model_storage and migrations code
|
38
|
+
# that removes the YAML file and remove this code
|
39
|
+
after :all do
|
40
|
+
if defined?(DataMapper::Adapters::YamlAdapter) && @adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
|
41
|
+
descendants = DataMapper::Model.descendants.to_a
|
42
|
+
while model = descendants.shift
|
43
|
+
descendants.concat(model.descendants.to_a - [ model ])
|
44
|
+
|
45
|
+
model.default_scope.clear
|
46
|
+
model.all(:repository => @repository).destroy!
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
instance_eval(&block)
|
52
|
+
end
|
53
|
+
|
54
|
+
AdapterHelpers.current_adapters.pop
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def with_alternate_adapter(&block)
|
59
|
+
adapters = AdapterHelpers.current_adapters.last
|
60
|
+
|
61
|
+
ALTERNATE.only(*adapters).each do |adapter, connection_uri|
|
62
|
+
describe("and #{adapter}") do
|
63
|
+
before :all do
|
64
|
+
@alternate_adapter = DataMapper.setup(:alternate, connection_uri)
|
65
|
+
@alternate_repository = DataMapper.repository(@alternate_adapter.name)
|
66
|
+
|
67
|
+
# create all tables and constraints before each spec
|
68
|
+
if @alternate_repository.respond_to?(:auto_migrate!)
|
69
|
+
@alternate_repository.auto_migrate!
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
after :all do
|
74
|
+
# remove all tables and constraints after each spec
|
75
|
+
if DataMapper.respond_to?(:auto_migrate_down!, true)
|
76
|
+
DataMapper.send(:auto_migrate_down!, @alternate_repository.name)
|
77
|
+
end
|
78
|
+
|
79
|
+
DataMapper::Repository.adapters.delete(@alternate_repository.name)
|
80
|
+
end
|
81
|
+
|
82
|
+
# TODO: add destroy_model_storage and migrations code
|
83
|
+
# that removes the YAML file and remove this code
|
84
|
+
after :all do
|
85
|
+
if defined?(DataMapper::Adapters::YamlAdapter) && @alternate_adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
|
86
|
+
descendants = DataMapper::Model.descendants.to_a
|
87
|
+
while model = descendants.shift
|
88
|
+
descendants.concat(model.descendants.to_a - [ model ])
|
89
|
+
|
90
|
+
model.default_scope.clear
|
91
|
+
model.all(:repository => @alternate_repository).destroy!
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
instance_eval(&block)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def get_adapters(*adapters)
|
102
|
+
adapters.map! { |adapter_name| adapter_name.to_s }
|
103
|
+
adapters = ADAPTERS if adapters.include?('all')
|
104
|
+
ADAPTERS & adapters
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DataMapper::Spec
|
2
|
+
module CollectionHelpers
|
3
|
+
module GroupMethods
|
4
|
+
def self.extended(base)
|
5
|
+
base.class_inheritable_accessor :loaded
|
6
|
+
base.loaded = false
|
7
|
+
end
|
8
|
+
|
9
|
+
def should_not_be_a_kicker(ivar = :@articles)
|
10
|
+
unless loaded
|
11
|
+
it 'should not be a kicker' do
|
12
|
+
instance_variable_get(ivar).should_not be_loaded
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class CounterAdapter < DataMapper::Adapters::AbstractAdapter
|
2
|
+
instance_methods.each do |method|
|
3
|
+
next if method =~ /\A__/ ||
|
4
|
+
%w[ send class dup object_id kind_of? instance_of? respond_to? equal? freeze frozen? should should_not instance_variables instance_variable_set instance_variable_get instance_variable_defined? remove_instance_variable extend hash inspect copy_object ].include?(method.to_s)
|
5
|
+
undef_method method
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :counts
|
9
|
+
|
10
|
+
def kind_of?(klass)
|
11
|
+
super || @adapter.kind_of?(klass)
|
12
|
+
end
|
13
|
+
|
14
|
+
def instance_of?(klass)
|
15
|
+
super || @adapter.instance_of?(klass)
|
16
|
+
end
|
17
|
+
|
18
|
+
def respond_to?(method, include_private = false)
|
19
|
+
super || @adapter.respond_to?(method, include_private)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def initialize(adapter)
|
25
|
+
@counts = Hash.new { |hash, key| hash[key] = 0 }
|
26
|
+
@adapter = adapter
|
27
|
+
@count = 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def increment_count_for(method)
|
31
|
+
@counts[method] += 1
|
32
|
+
end
|
33
|
+
|
34
|
+
def method_missing(method, *args, &block)
|
35
|
+
increment_count_for(method)
|
36
|
+
@adapter.send(method, *args, &block)
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module DataMapper::Spec
|
2
|
+
module PendingHelpers
|
3
|
+
def pending_if(*args)
|
4
|
+
message, boolean = parse_args(*args)
|
5
|
+
|
6
|
+
if boolean
|
7
|
+
pending(message) { yield }
|
8
|
+
else
|
9
|
+
yield
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def rescue_if(*args)
|
14
|
+
message, boolean = parse_args(*args)
|
15
|
+
|
16
|
+
if boolean
|
17
|
+
raised = nil
|
18
|
+
begin
|
19
|
+
yield
|
20
|
+
raised = false
|
21
|
+
rescue Exception
|
22
|
+
raised = true
|
23
|
+
end
|
24
|
+
|
25
|
+
raise "should have raised: #{message || 'TODO'}" if raised == false
|
26
|
+
else
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def parse_args(*args)
|
34
|
+
case args.map { |arg| arg.class }
|
35
|
+
when [ String, TrueClass ], [ String, FalseClass ] then args
|
36
|
+
when [ String, NilClass ] then [ args.first, false ]
|
37
|
+
when [ String ] then [ args.first, true ]
|
38
|
+
when [ TrueClass ], [ FalseClass ] then [ '', args.first ]
|
39
|
+
when [ NilClass ] then [ '', false ]
|
40
|
+
when [] then [ '', true ] # defaults
|
41
|
+
else
|
42
|
+
raise ArgumentError, "Invalid arguments: #{args.inspect}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec/runner/formatter/base_text_formatter'
|
2
|
+
|
3
|
+
# Code is based on standard SpecdocFormatter, but will print full error details as soon as they are found.
|
4
|
+
# Successful or pending examples are written only as a dot in the output. Header is only printed if errors occur.
|
5
|
+
#
|
6
|
+
# To use it, add the following to your spec/spec.opts:
|
7
|
+
# --require
|
8
|
+
# lib/rspec_immediate_feedback_formatter.rb
|
9
|
+
# --format
|
10
|
+
# Spec::Runner::Formatter::ImmediateFeedbackFormatter
|
11
|
+
|
12
|
+
module Spec
|
13
|
+
module Runner
|
14
|
+
module Formatter
|
15
|
+
class ImmediateFeedbackFormatter < BaseTextFormatter
|
16
|
+
|
17
|
+
def add_example_group(example_group)
|
18
|
+
super
|
19
|
+
@current_group = example_group.description
|
20
|
+
end
|
21
|
+
|
22
|
+
def example_failed(example, counter, failure)
|
23
|
+
if @current_group
|
24
|
+
output.puts
|
25
|
+
output.puts @current_group
|
26
|
+
@current_group = nil # only print the group name once
|
27
|
+
end
|
28
|
+
|
29
|
+
message = if failure.expectation_not_met?
|
30
|
+
"- #{example.description} (FAILED - #{counter})"
|
31
|
+
else
|
32
|
+
"- #{example.description} (ERROR - #{counter})"
|
33
|
+
end
|
34
|
+
|
35
|
+
output.puts(red(message))
|
36
|
+
# output.puts(failure.expectation_not_met? ? red(message) : message)
|
37
|
+
dump_failure(counter, failure) # dump stacktrace immediately
|
38
|
+
output.flush
|
39
|
+
end
|
40
|
+
|
41
|
+
def example_passed(*)
|
42
|
+
output.print green('.')
|
43
|
+
output.flush
|
44
|
+
end
|
45
|
+
|
46
|
+
def example_pending(*)
|
47
|
+
super
|
48
|
+
output.print yellow('*')
|
49
|
+
output.flush
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|