humble 0.0.1374296843 → 0.0.1374368890
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/humble/column.rb +35 -8
- data/lib/humble/configuration.rb +1 -1
- data/lib/humble/database_table.rb +26 -4
- data/lib/humble/mapping_configuration.rb +9 -7
- data/lib/humble/result_set.rb +1 -1
- data/lib/humble/session.rb +8 -4
- data/spec/integration/delete_spec.rb +17 -0
- data/spec/integration/fixtures/movie_mapping.rb +11 -0
- data/spec/integration/insert_spec.rb +34 -0
- data/spec/integration/select_spec.rb +30 -0
- data/spec/integration/update_spec.rb +29 -0
- data/spec/integration_helper.rb +24 -0
- data/spec/spec_helper.rb +3 -2
- data/spec/unit/default_data_row_mapper_spec.rb +24 -0
- data/spec/unit/result_set_spec.rb +39 -0
- metadata +16 -5
- data/spec/integration/example_spec.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4d776c0dc39127d48e8304daf498aeb28e6cf3b
|
4
|
+
data.tar.gz: 410eae8dedd880bd4f69677258c0718a1543a69e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f28e890a7ec4cc0c97086584403406166672f1dba3e3ffa7a8654893594c3d482ea219480d62ea27c6f1d46a916f4483bc1a4f0fbf87507500d0ab67b75a1efb
|
7
|
+
data.tar.gz: 2f3a253eab67e2f9cfe80970b44c8b2a9dcc3de1fc5158647c75acfacc777d17aedc7137ba80d7b19a1badca2661c3eef092260a09b219fa6cf4217c2e23f7bb
|
data/lib/humble/column.rb
CHANGED
@@ -1,18 +1,45 @@
|
|
1
1
|
module Humble
|
2
2
|
class Column
|
3
|
-
def initialize(
|
4
|
-
@
|
3
|
+
def initialize(name)
|
4
|
+
@column_name = name
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
8
|
-
return {} if primary_key?
|
9
|
-
|
10
|
-
value = item.instance_variable_get("@#{key}")
|
11
|
-
{ key.to_sym => value }
|
7
|
+
def prepare(item)
|
8
|
+
return {} if primary_key? && has_default_value?
|
9
|
+
{ column_name.to_sym => item.instance_variable_get("@#{column_name}") }
|
12
10
|
end
|
13
11
|
|
14
12
|
def primary_key?
|
15
|
-
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
attr_reader :column_name
|
19
|
+
end
|
20
|
+
|
21
|
+
class PrimaryKeyColumn < Column
|
22
|
+
attr_reader :default
|
23
|
+
|
24
|
+
def initialize(name, default)
|
25
|
+
super(name)
|
26
|
+
@default = default
|
27
|
+
end
|
28
|
+
|
29
|
+
def apply(id, entity)
|
30
|
+
entity.instance_variable_set("@#{column_name}", id )
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy(connection, entity)
|
34
|
+
connection.where(column_name.to_sym => entity.id).delete
|
35
|
+
end
|
36
|
+
|
37
|
+
def primary_key?
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def has_default_value?(item)
|
42
|
+
@default == item.id
|
16
43
|
end
|
17
44
|
end
|
18
45
|
end
|
data/lib/humble/configuration.rb
CHANGED
@@ -11,17 +11,39 @@ module Humble
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def primary_key(name, default: 0)
|
14
|
-
@
|
14
|
+
@primary_key = PrimaryKeyColumn.new(name, default)
|
15
15
|
end
|
16
16
|
|
17
17
|
def add_column(name)
|
18
|
-
@columns << Column.new(
|
18
|
+
@columns << Column.new(name)
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def persist(connection, item)
|
22
|
+
if @primary_key.has_default_value?(item)
|
23
|
+
@primary_key.apply(insert(item, connection[@name]) , item)
|
24
|
+
else
|
25
|
+
update(item, connection[@name])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def destroy(connection, entity)
|
30
|
+
@primary_key.destroy(connection[@name], entity)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def prepare_statement_for(item)
|
22
36
|
@columns.inject({}) do |result, column|
|
23
|
-
result.merge(column.
|
37
|
+
result.merge(column.prepare(item))
|
24
38
|
end
|
25
39
|
end
|
40
|
+
|
41
|
+
def insert(item, dataset)
|
42
|
+
dataset.insert(prepare_statement_for(item))
|
43
|
+
end
|
44
|
+
|
45
|
+
def update(item, dataset)
|
46
|
+
dataset.update(prepare_statement_for(item))
|
47
|
+
end
|
26
48
|
end
|
27
49
|
end
|
@@ -9,13 +9,16 @@ module Humble
|
|
9
9
|
ResultSet.new(connection[@table.name], mapper)
|
10
10
|
end
|
11
11
|
|
12
|
-
def save_using(connection,
|
13
|
-
|
14
|
-
item.instance_variable_set('@id', id)
|
12
|
+
def save_using(connection, entity)
|
13
|
+
@table.persist(connection, entity)
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
18
|
-
|
16
|
+
def delete_using(connection, entity)
|
17
|
+
@table.destroy(connection, entity)
|
18
|
+
end
|
19
|
+
|
20
|
+
def matches?(item)
|
21
|
+
self[:type] == item || item.is_a?(self[:type])
|
19
22
|
end
|
20
23
|
|
21
24
|
def [](key)
|
@@ -25,8 +28,7 @@ module Humble
|
|
25
28
|
private
|
26
29
|
|
27
30
|
def mapper
|
28
|
-
|
31
|
+
self[:mapper] || DefaultDataRowMapper.new(self)
|
29
32
|
end
|
30
33
|
end
|
31
|
-
|
32
34
|
end
|
data/lib/humble/result_set.rb
CHANGED
data/lib/humble/session.rb
CHANGED
@@ -11,14 +11,18 @@ module Humble
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def save(
|
15
|
-
mapping_for(
|
14
|
+
def save(entity)
|
15
|
+
mapping_for(entity).save_using(create_connection, entity)
|
16
16
|
end
|
17
17
|
|
18
18
|
def find_all(clazz)
|
19
19
|
mapping_for(clazz).find_all_using(create_connection)
|
20
20
|
end
|
21
21
|
|
22
|
+
def delete(entity)
|
23
|
+
mapping_for(entity).delete_using(create_connection, entity)
|
24
|
+
end
|
25
|
+
|
22
26
|
private
|
23
27
|
|
24
28
|
attr_reader :connection_factory, :mapper_registry
|
@@ -27,8 +31,8 @@ module Humble
|
|
27
31
|
@connection ||= connection_factory.create_connection
|
28
32
|
end
|
29
33
|
|
30
|
-
def mapping_for(
|
31
|
-
mapper_registry.mapping_for(
|
34
|
+
def mapping_for(entity)
|
35
|
+
mapper_registry.mapping_for(entity)
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "integration_helper"
|
2
|
+
|
3
|
+
describe "deletion" do
|
4
|
+
include_context "orm"
|
5
|
+
|
6
|
+
context "when deleting a record" do
|
7
|
+
before :each do
|
8
|
+
connection[:movies].insert(:name => 'mo money')
|
9
|
+
movie = session.find_all(Movie).first
|
10
|
+
session.delete(movie)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should remove it from the database" do
|
14
|
+
connection[:movies].all.count.should == 0
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -5,6 +5,17 @@ class Movie
|
|
5
5
|
@id = attributes[:id] || -1
|
6
6
|
@name = attributes[:name]
|
7
7
|
end
|
8
|
+
|
9
|
+
def name=(new_name)
|
10
|
+
@name = new_name
|
11
|
+
end
|
12
|
+
|
13
|
+
def ==(other)
|
14
|
+
return false unless other
|
15
|
+
return false if other.id == -1
|
16
|
+
return false if @id == -1
|
17
|
+
@id == other.id
|
18
|
+
end
|
8
19
|
end
|
9
20
|
|
10
21
|
class MovieMapping < Humble::DatabaseMapping
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "integration_helper"
|
2
|
+
|
3
|
+
describe "orm" do
|
4
|
+
include_context "orm"
|
5
|
+
|
6
|
+
context "when inserting a new record" do
|
7
|
+
let(:movie) { Movie.new(:name => 'oop') }
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
session.begin_transaction do |session|
|
11
|
+
session.save(movie)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:results) { connection[:movies].all }
|
16
|
+
|
17
|
+
it "should insert the correct number of records" do
|
18
|
+
results.count.should == 1
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should insert the record with the a new id" do
|
22
|
+
results.first[:id].should_not == -1
|
23
|
+
results.first[:id].should > 0
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should insert the name" do
|
27
|
+
results.first[:name].should == 'oop'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should update the new item with the new id" do
|
31
|
+
movie.id.should_not == -1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "integration_helper"
|
2
|
+
|
3
|
+
describe "select items" do
|
4
|
+
include_context "orm"
|
5
|
+
|
6
|
+
context "when fetching all items" do
|
7
|
+
before :each do
|
8
|
+
@id = connection[:movies].insert(:name => 'monsters inc')
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:results) { session.find_all Movie }
|
12
|
+
|
13
|
+
it "should return the correct number of movies" do
|
14
|
+
results.count.should == 1
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should return each movie with its name" do
|
18
|
+
results.first.name.should == 'monsters inc'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return instances of the target type" do
|
22
|
+
results.first.should be_instance_of(Movie)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should include the saved movie" do
|
26
|
+
results.should include(Movie.new(:id => @id, :name => 'monsters inc'))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "integration_helper"
|
2
|
+
|
3
|
+
describe "updating a record" do
|
4
|
+
include_context "orm"
|
5
|
+
|
6
|
+
context "when updating a record" do
|
7
|
+
let(:movie) { Movie.new(:name => "old name") }
|
8
|
+
|
9
|
+
before :each do
|
10
|
+
session.begin_transaction do |session|
|
11
|
+
session.save(movie)
|
12
|
+
end
|
13
|
+
movie.name="new name"
|
14
|
+
session.begin_transaction do |session|
|
15
|
+
session.save(movie)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:results) { connection[:movies].all }
|
20
|
+
|
21
|
+
it "should save the changes" do
|
22
|
+
results.first[:name].should == 'new name'
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not create any new records" do
|
26
|
+
results.count.should == 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require_relative 'integration/fixtures/movie_mapping.rb'
|
3
|
+
|
4
|
+
shared_context "orm" do
|
5
|
+
let(:connection) { Sequel.connect(connection_string) }
|
6
|
+
let(:connection_string) { 'sqlite://test.db' }
|
7
|
+
let(:configuration) { Humble::Configuration.new(connection_string) }
|
8
|
+
let(:session_factory) { configuration.build_session_factory }
|
9
|
+
let(:session) { session_factory.create_session }
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
connection.create_table :movies do
|
13
|
+
primary_key :id
|
14
|
+
String :name
|
15
|
+
end
|
16
|
+
|
17
|
+
configuration.add(MovieMapping.new)
|
18
|
+
end
|
19
|
+
|
20
|
+
after :each do
|
21
|
+
connection.drop_table :movies
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
class Book
|
3
|
+
attr_reader :id, :name
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
@id = attributes[:id]
|
7
|
+
@name = attributes[:name]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe Humble::DefaultDataRowMapper do
|
12
|
+
let(:sut) { Humble::DefaultDataRowMapper.new(configuration) }
|
13
|
+
let(:configuration) { { :type => Book } }
|
14
|
+
|
15
|
+
let(:result) { sut.map_from({:id => 1, :name => 'blah'}) }
|
16
|
+
|
17
|
+
it "should map the id" do
|
18
|
+
result.id.should == 1
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should map the name" do
|
22
|
+
result.name.should == "blah"
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Humble::ResultSet do
|
4
|
+
let(:sut) { Humble::ResultSet.new(rows, mapper) }
|
5
|
+
let(:mapper) { fake }
|
6
|
+
let(:rows) { [{:id => 1}, {id: 2}] }
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
mapper.stub(:map_from).with({:id => 1}).and_return(1)
|
10
|
+
mapper.stub(:map_from).with({:id => 2}).and_return(2)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe :inspect do
|
14
|
+
let(:result) { sut.inspect }
|
15
|
+
|
16
|
+
it "should display each row" do
|
17
|
+
result.should == "[1, 2]"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe :each do
|
22
|
+
it "should visit each mapped item" do
|
23
|
+
collect = []
|
24
|
+
sut.each { |item| collect << item }
|
25
|
+
collect.first.should == 1
|
26
|
+
collect.last.should == 2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe :include? do
|
31
|
+
it "should return true" do
|
32
|
+
sut.include?(1).should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return false" do
|
36
|
+
sut.include?(0).should be_false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: humble
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1374368890
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mo khan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -120,7 +120,6 @@ files:
|
|
120
120
|
- .ruby-version
|
121
121
|
- .travis.yml
|
122
122
|
- Gemfile
|
123
|
-
- Gemfile.lock
|
124
123
|
- LICENSE.txt
|
125
124
|
- README.md
|
126
125
|
- Rakefile
|
@@ -137,9 +136,15 @@ files:
|
|
137
136
|
- lib/humble/session.rb
|
138
137
|
- lib/humble/session_factory.rb
|
139
138
|
- lib/humble/version.rb
|
140
|
-
- spec/integration/
|
139
|
+
- spec/integration/delete_spec.rb
|
141
140
|
- spec/integration/fixtures/movie_mapping.rb
|
141
|
+
- spec/integration/insert_spec.rb
|
142
|
+
- spec/integration/select_spec.rb
|
143
|
+
- spec/integration/update_spec.rb
|
144
|
+
- spec/integration_helper.rb
|
142
145
|
- spec/spec_helper.rb
|
146
|
+
- spec/unit/default_data_row_mapper_spec.rb
|
147
|
+
- spec/unit/result_set_spec.rb
|
143
148
|
homepage: ''
|
144
149
|
licenses:
|
145
150
|
- MIT
|
@@ -165,6 +170,12 @@ signing_key:
|
|
165
170
|
specification_version: 4
|
166
171
|
summary: an nhibernate like orm for ruby.
|
167
172
|
test_files:
|
168
|
-
- spec/integration/
|
173
|
+
- spec/integration/delete_spec.rb
|
169
174
|
- spec/integration/fixtures/movie_mapping.rb
|
175
|
+
- spec/integration/insert_spec.rb
|
176
|
+
- spec/integration/select_spec.rb
|
177
|
+
- spec/integration/update_spec.rb
|
178
|
+
- spec/integration_helper.rb
|
170
179
|
- spec/spec_helper.rb
|
180
|
+
- spec/unit/default_data_row_mapper_spec.rb
|
181
|
+
- spec/unit/result_set_spec.rb
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require_relative 'fixtures/movie_mapping.rb'
|
3
|
-
|
4
|
-
describe "orm" do
|
5
|
-
let(:connection) { Sequel.connect(connection_string) }
|
6
|
-
let(:connection_string) { 'sqlite://test.db' }
|
7
|
-
let(:configuration) { Humble::Configuration.new(connection_string) }
|
8
|
-
let(:session_factory) { configuration.build_session_factory }
|
9
|
-
let(:session) { session_factory.create_session }
|
10
|
-
|
11
|
-
before :each do
|
12
|
-
connection.create_table :movies do
|
13
|
-
primary_key :id
|
14
|
-
String :name
|
15
|
-
end
|
16
|
-
|
17
|
-
configuration.add(MovieMapping.new)
|
18
|
-
end
|
19
|
-
|
20
|
-
after :each do
|
21
|
-
connection.drop_table :movies
|
22
|
-
end
|
23
|
-
|
24
|
-
context "when fetching all items" do
|
25
|
-
before :each do
|
26
|
-
@id = connection[:movies].insert(:name => 'monsters inc')
|
27
|
-
end
|
28
|
-
|
29
|
-
let(:results) { session.find_all Movie }
|
30
|
-
|
31
|
-
it "should return the correct number of movies" do
|
32
|
-
results.count.should == 1
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should return each movie with its name" do
|
36
|
-
results.first.name.should == 'monsters inc'
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should return instances of the target type" do
|
40
|
-
results.first.should be_instance_of(Movie)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should include the saved movie" do
|
44
|
-
results.should include(Movie.new(:id => @id, :name => 'monsters inc'))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "when inserting a new record" do
|
49
|
-
let(:movie) { Movie.new(:name => 'oop') }
|
50
|
-
|
51
|
-
before :each do
|
52
|
-
session.begin_transaction do |session|
|
53
|
-
session.save(movie)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
let(:results) { connection[:movies].all }
|
58
|
-
|
59
|
-
it "should insert the correct number of records" do
|
60
|
-
results.count.should == 1
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should insert the record with the a new id" do
|
64
|
-
results.first[:id].should_not == -1
|
65
|
-
results.first[:id].should > 0
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should insert the name" do
|
69
|
-
results.first[:name].should == 'oop'
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should update the new item with the new id" do
|
73
|
-
movie.id.should_not == -1
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|