og 0.27.0 → 0.28.0

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.
Files changed (61) hide show
  1. data/ProjectInfo +2 -2
  2. data/README +8 -4
  3. data/Rakefile +1 -1
  4. data/doc/AUTHORS +1 -1
  5. data/doc/RELEASES +81 -0
  6. data/examples/README +7 -0
  7. data/lib/glue/cacheable.rb +152 -0
  8. data/lib/glue/hierarchical.rb +5 -4
  9. data/lib/glue/optimistic_locking.rb +0 -1
  10. data/lib/glue/orderable.rb +46 -44
  11. data/lib/glue/taggable.rb +7 -4
  12. data/lib/glue/timestamped.rb +1 -1
  13. data/lib/og.rb +13 -6
  14. data/lib/og/entity.rb +226 -9
  15. data/lib/og/evolution.rb +2 -2
  16. data/lib/og/ez/clause.rb +147 -0
  17. data/lib/og/ez/condition.rb +181 -0
  18. data/lib/og/manager.rb +31 -30
  19. data/lib/og/relation.rb +5 -5
  20. data/lib/og/relation/has_many.rb +3 -1
  21. data/lib/og/relation/joins_many.rb +1 -1
  22. data/lib/og/store.rb +6 -3
  23. data/lib/og/store/kirby.rb +3 -5
  24. data/lib/og/store/mysql.rb +0 -1
  25. data/lib/og/store/sql.rb +43 -7
  26. data/lib/og/store/sqlite.rb +97 -11
  27. data/lib/og/store/sqlite2.rb +231 -0
  28. data/lib/og/test/testcase.rb +1 -1
  29. data/lib/og/vendor/mysql.rb +103 -25
  30. data/test/glue/tc_revisable.rb +11 -11
  31. data/test/og/CONFIG.rb +20 -8
  32. data/test/og/mixin/tc_hierarchical.rb +5 -3
  33. data/test/og/mixin/tc_optimistic_locking.rb +6 -4
  34. data/test/og/mixin/tc_orderable.rb +22 -22
  35. data/test/og/mixin/tc_taggable.rb +15 -11
  36. data/test/og/mixin/tc_timestamped.rb +4 -2
  37. data/test/og/multi_validations_model.rb +8 -0
  38. data/test/og/store/tc_filesys.rb +15 -12
  39. data/test/og/store/tc_kirby.rb +14 -11
  40. data/test/og/tc_accumulator.rb +1 -3
  41. data/test/og/tc_cacheable.rb +58 -0
  42. data/test/og/tc_delete_all.rb +13 -16
  43. data/test/og/tc_ez.rb +33 -0
  44. data/test/og/tc_finder.rb +2 -4
  45. data/test/og/tc_inheritance.rb +3 -3
  46. data/test/og/tc_inheritance2.rb +2 -3
  47. data/test/og/tc_join.rb +3 -2
  48. data/test/og/tc_multi_validations.rb +3 -3
  49. data/test/og/tc_multiple.rb +3 -6
  50. data/test/og/tc_override.rb +19 -13
  51. data/test/og/tc_polymorphic.rb +1 -3
  52. data/test/og/tc_resolve.rb +32 -0
  53. data/test/og/tc_reverse.rb +27 -28
  54. data/test/og/tc_scoped.rb +2 -4
  55. data/test/og/tc_select.rb +1 -3
  56. data/test/og/tc_store.rb +3 -8
  57. data/test/og/tc_validation.rb +2 -2
  58. data/test/og/tc_validation2.rb +56 -58
  59. data/test/og/tc_validation_loop.rb +2 -5
  60. metadata +15 -7
  61. data/lib/og/vendor/mysql411.rb +0 -306
@@ -5,19 +5,19 @@ require 'test/unit'
5
5
  require 'og'
6
6
  require 'glue/revisable'
7
7
 
8
- class Article
9
- is Revisable
10
- property :body, String, :revisable => true
11
- property :title, String
12
-
13
- def initialize(t, b)
14
- @title, @body = t, b
15
- end
16
- end
8
+ class TestOgRevisable < Test::Unit::TestCase # :nodoc: all
17
9
 
18
- $og = Og.setup($og_config)
10
+ class Article
11
+ is Revisable
12
+ property :body, String, :revisable => true
13
+ property :title, String
14
+
15
+ def initialize(t, b)
16
+ @title, @body = t, b
17
+ end
18
+ end
19
19
 
20
- class TestOgRevisable < Test::Unit::TestCase # :nodoc: all
20
+ $og1.manage_classes(Article)
21
21
 
22
22
  def test_all
23
23
  a = Article.create('hello', 'world')
@@ -15,7 +15,7 @@ configB = :mysql
15
15
 
16
16
  # SET THIS TO true TO ENABLE EXTRA DEBUG CODE
17
17
 
18
- debug = true
18
+ debug = false
19
19
 
20
20
  # TO TEST AGAINST AN INSTALLATION OF OG INSTEAD THIS LOCAL
21
21
  # DISTRIBUTION, SET THE FOLLOWING TO true.
@@ -32,7 +32,7 @@ end
32
32
 
33
33
  $DBG = debug
34
34
 
35
- $og_mysql = {
35
+ og_mysql = {
36
36
  :destroy => true,
37
37
  :store => :mysql,
38
38
  :user => 'root',
@@ -41,7 +41,7 @@ $og_mysql = {
41
41
  # :socket => '/var/run/mysqld/mysqld.sock'
42
42
  }
43
43
 
44
- $og_psql = {
44
+ og_psql = {
45
45
  :destroy => true,
46
46
  :store => :psql,
47
47
  :user => 'postgres',
@@ -49,20 +49,20 @@ $og_psql = {
49
49
  :name => 'test'
50
50
  }
51
51
 
52
- $og_sqlite = {
52
+ og_sqlite = {
53
53
  :destroy => true,
54
54
  :store => :sqlite,
55
55
  :name => 'test'
56
56
  }
57
57
 
58
- $og_kirby = {
58
+ og_kirby = {
59
59
  :destroy => true,
60
60
  :store => :kirby,
61
61
  :name => 'test',
62
62
  :embedded => true
63
63
  }
64
64
 
65
- $og_memory = {
65
+ og_memory = {
66
66
  :store => :memory,
67
67
  :name => :test,
68
68
  :destroy => true
@@ -71,9 +71,21 @@ $og_memory = {
71
71
  # This sets the common global vars to be used by the tests.
72
72
 
73
73
  eval %{
74
- $og_config1 = $og_config = $og_#{configA}
75
- $og_config2 = $og_#{configB}
74
+ @og_config1 = og_config = og_#{configA}
75
+ @og_config2 = og_#{configB}
76
76
  }
77
77
 
78
+ require 'stringio'
79
+ require 'glue'
80
+ require 'glue/logger'
81
+ require 'og'
82
+
83
+ Logger.set(Logger.new(StringIO.new)) unless $DBG
84
+
85
+ Og.thread_safe = false
86
+
87
+ $og1 ||= Og.setup(@og_config1)
88
+ $og2 ||= Og.setup(@og_config2)
89
+
78
90
  # * Tom Sawyer <transfire@gmail.com>
79
91
  # * George Moschovitis <gm@navel.gr>
@@ -8,6 +8,7 @@ require 'ostruct'
8
8
  require 'og'
9
9
  require 'glue/hierarchical'
10
10
 
11
+ =begin
11
12
  $og = Og.setup(
12
13
  :store => 'mysql',
13
14
  :name => 'test',
@@ -15,6 +16,7 @@ $og = Og.setup(
15
16
  :password => 'navelrulez',
16
17
  :destroy => true
17
18
  )
19
+ =end
18
20
 
19
21
  class TC_OgHierarchical < Test::Unit::TestCase # :nodoc: all
20
22
 
@@ -22,7 +24,7 @@ class TC_OgHierarchical < Test::Unit::TestCase # :nodoc: all
22
24
  property :body, String
23
25
  property :create_time, Time
24
26
 
25
- include Og::NestedSets
27
+ include Glue::NestedSets
26
28
 
27
29
  def initialize(body = nil)
28
30
  @body = body
@@ -34,9 +36,9 @@ class TC_OgHierarchical < Test::Unit::TestCase # :nodoc: all
34
36
  end
35
37
  end
36
38
 
37
- def test_all
38
- $og.manage_classes
39
+ $og1.manage_classes Comment
39
40
 
41
+ def test_all
40
42
  root = Comment.create('root')
41
43
  c1 = Comment.new('1')
42
44
  root.add_comment c1
@@ -7,6 +7,7 @@ require 'test/unit'
7
7
  require 'og'
8
8
  require 'glue/optimistic_locking'
9
9
 
10
+ =begin
10
11
  $og = Og.setup(
11
12
  :store => 'psql',
12
13
  :name => 'test',
@@ -14,22 +15,23 @@ $og = Og.setup(
14
15
  :password => 'navelrulez',
15
16
  :destroy => true
16
17
  )
18
+ =end
17
19
 
18
20
  class TC_OgLocking < Test::Unit::TestCase # :nodoc: all
19
21
  include Og
20
22
 
21
23
  class Article
22
24
  property :body, String
23
- include Og::Locking
25
+ include Glue::Locking
24
26
 
25
27
  def initialize(body)
26
28
  @body = body
27
29
  end
28
30
  end
29
31
 
30
- def test_all
31
- $og.manage_classes
32
+ $og1.manage_classes Article
32
33
 
34
+ def test_all
33
35
  Article.create('test')
34
36
 
35
37
  a = Article[1]
@@ -42,7 +44,7 @@ class TC_OgLocking < Test::Unit::TestCase # :nodoc: all
42
44
  end
43
45
 
44
46
  b.body = 'Ooops'
45
- assert_raise(Og::StaleObjectError) do
47
+ assert_raise(Glue::StaleObjectError) do
46
48
  b.update
47
49
  end
48
50
 
@@ -8,23 +8,7 @@ require 'ostruct'
8
8
  require 'og'
9
9
  require 'glue/orderable'
10
10
 
11
- class Playlist
12
- prop :name, String
13
- has_many Track
14
- end
15
-
16
- class Track
17
- include Og::Orderable, :scope => :playlist
18
-
19
- belongs_to Playlist
20
- prop :name, String
21
-
22
- def initialize(name, playlist)
23
- @name = name
24
- self.playlist = playlist
25
- end
26
- end
27
-
11
+ =begin
28
12
  $og = Og.setup(
29
13
  :store => 'psql',
30
14
  # :store => :memory,
@@ -33,11 +17,10 @@ $og = Og.setup(
33
17
  :password => 'navelrulez',
34
18
  :destroy => true
35
19
  )
20
+ =end
36
21
 
37
22
  class TestCaseOgOrderable < Test::Unit::TestCase # :nodoc: all
38
23
 
39
- class Comment; end
40
-
41
24
  class Article
42
25
  property :title, :body, String
43
26
  has_many :comments, Comment, :list => true, :order => 'position DESC'
@@ -51,16 +34,33 @@ class TestCaseOgOrderable < Test::Unit::TestCase # :nodoc: all
51
34
  property :body, String
52
35
  belongs_to :article, Article
53
36
 
54
- include Og::Orderable #, :scope => :article
37
+ is Orderable, :scope => :article
55
38
 
56
39
  def initialize(body = nil)
57
40
  @body = body
58
41
  end
59
42
  end
60
43
 
61
- def test_all
62
- $og.manage_classes
44
+ class Playlist
45
+ prop :name, String
46
+ has_many Track
47
+ end
48
+
49
+ class Track
50
+ prop :name, String
51
+ is Orderable, :scope => :playlist
52
+
53
+ belongs_to Playlist
54
+
55
+ def initialize(name, playlist)
56
+ @name = name
57
+ self.playlist = playlist
58
+ end
59
+ end
63
60
 
61
+ $og1.manage_classes(Article, Comment, Playlist, Track)
62
+
63
+ def test_all
64
64
  a = Article.create('article')
65
65
  a.save
66
66
 
@@ -8,15 +8,7 @@ require 'ostruct'
8
8
  require 'og'
9
9
  require 'glue/taggable'
10
10
 
11
- class Article
12
- property :title, :body, String
13
- is Taggable
14
-
15
- def initialize(title = nil)
16
- @title = title
17
- end
18
- end
19
-
11
+ =begin
20
12
  $og = Og.setup(
21
13
  :store => 'mysql',
22
14
  :name => 'test',
@@ -24,20 +16,32 @@ $og = Og.setup(
24
16
  :password => 'navelrulez',
25
17
  :destroy => true
26
18
  )
19
+ =end
27
20
 
28
21
  class TestOgTaggable < Test::Unit::TestCase # :nodoc: all
29
22
 
23
+ class Article
24
+ property :title, :body, String
25
+ is Taggable
26
+
27
+ def initialize(title = nil)
28
+ @title = title
29
+ end
30
+ end
31
+
32
+ $og1.manage_classes(Article)
33
+
30
34
  def test_all
31
35
  a1 = Article.create('Hello')
32
36
  a1.tag('navel gmosx sexy')
33
37
  a1.save
34
38
 
35
39
  a2 = Article.create('Other')
36
- a2.tag('gmosx', 'rain')
40
+ a2.tag('gmosx rain')
37
41
  a2.save
38
42
 
39
43
  a3 = Article.create('George')
40
- a3.tag('phd', 'name')
44
+ a3.tag('phd name')
41
45
  a3.save
42
46
 
43
47
  assert_equal 3, a1.tags.size
@@ -8,6 +8,7 @@ require 'ostruct'
8
8
  require 'og'
9
9
  require 'glue/timestamped'
10
10
 
11
+ =begin
11
12
  $og = Og.setup(
12
13
  :store => 'psql',
13
14
  :name => 'test',
@@ -15,6 +16,7 @@ $og = Og.setup(
15
16
  :password => 'navelrulez',
16
17
  :destroy => true
17
18
  )
19
+ =end
18
20
 
19
21
  class TestCaseOgTimestamped < Test::Unit::TestCase # :nodoc: all
20
22
 
@@ -27,9 +29,9 @@ class TestCaseOgTimestamped < Test::Unit::TestCase # :nodoc: all
27
29
  end
28
30
  end
29
31
 
30
- def test_all
31
- $og.manage_classes
32
+ $og1.manage_classes Article
32
33
 
34
+ def test_all
33
35
  a = Article.create('article')
34
36
  a.save
35
37
 
@@ -0,0 +1,8 @@
1
+ class TC_MultiValidation < Test::Unit::TestCase # :nodoc: all
2
+ class User
3
+ property :name
4
+
5
+ validate_value :name
6
+ validate_unique :name
7
+ end
8
+ end
@@ -1,14 +1,14 @@
1
-
2
1
  require File.join(File.dirname(__FILE__), '..', 'CONFIG.rb')
3
2
  require 'rubygems'
4
3
  require 'facets'
5
4
  require 'test/unit'
6
5
  require 'og'
7
6
 
7
+ =begin FileSys is currently inaccessible through Og.setup?
8
8
  class TestCaseOgFilesys < Test::Unit::TestCase # :nodoc: all
9
9
  include Og
10
10
 
11
- class Comment; end
11
+ @og = Og.setup(:store => :filesys, :name => 'test')
12
12
 
13
13
  class Article
14
14
  property :body, String
@@ -32,12 +32,14 @@ class TestCaseOgFilesys < Test::Unit::TestCase # :nodoc: all
32
32
  property :name, :name_key => true
33
33
  end
34
34
 
35
- def setup
36
- @og = Og.setup(:store => 'filesys', :name => 'test')
35
+ @og.manage_classes(Article, Comment, User)
36
+
37
+ def self.og
38
+ @og
37
39
  end
38
40
 
39
- def teardown
40
- @og = nil
41
+ def og
42
+ self.class.og
41
43
  end
42
44
 
43
45
  def test_all
@@ -45,19 +47,19 @@ class TestCaseOgFilesys < Test::Unit::TestCase # :nodoc: all
45
47
  # p Article.metadata
46
48
 
47
49
  a1 = Article.new('Article 1')
48
- @og.store.save(a1)
50
+ og.store.save(a1)
49
51
 
50
- a2 = @og.store.load(1, Article)
52
+ a2 = og.store.load(1, Article)
51
53
 
52
54
  assert_equal a1.body, a2.body
53
55
 
54
56
  a3 = Article.new('Article 3')
55
57
  a3.save
56
58
 
57
- @og.store.delete(a3)
59
+ og.store.delete(a3)
58
60
 
59
- assert @og.store.load(1, Article)
60
- assert !@og.store.load(2, Article)
61
+ assert og.store.load(1, Article)
62
+ assert !og.store.load(2, Article)
61
63
 
62
64
  a2.delete
63
65
 
@@ -65,8 +67,9 @@ class TestCaseOgFilesys < Test::Unit::TestCase # :nodoc: all
65
67
  # a.save
66
68
  # a = Article[1]
67
69
 
68
- @og.store.close
70
+ og.store.close
69
71
  # @og.store.class.destroy(@og.options)
70
72
  end
71
73
 
72
74
  end
75
+ =end
@@ -3,22 +3,24 @@ require 'facets'
3
3
  require 'test/unit'
4
4
  require 'og'
5
5
 
6
- $DBG = true
6
+ # $DBG = true
7
7
 
8
- class Track
9
- prop_accessor :name, String
10
- belongs_to Disc
11
- end
8
+ =begin
9
+ class TC_Kirby < Test::Unit::TestCase # :nodoc: all
12
10
 
13
- class Disc
14
- prop_accessor :name, String
15
- has_many Track
16
- end
11
+ og = Og.setup( :destroy => true, :store => :kirby, :manual_management => true)
17
12
 
18
- Og.setup( :destroy => true, :store => :kirby )
13
+ class Track
14
+ prop_accessor :name, String
15
+ belongs_to Disc
16
+ end
19
17
 
18
+ class Disc
19
+ prop_accessor :name, String
20
+ has_many Track
21
+ end
20
22
 
21
- class TC_Kirby < Test::Unit::TestCase # :nodoc: all
23
+ og.manage_classes(Track, Disc)
22
24
 
23
25
  def test_all
24
26
  d = Disc.create
@@ -29,5 +31,6 @@ class TC_Kirby < Test::Unit::TestCase # :nodoc: all
29
31
  end
30
32
 
31
33
  end
34
+ =end
32
35
 
33
36
  # * Guillaume Pierronnet <guillaume.pierronnet@gmail.com>