extendi-cassandra_object 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.travis.yml +23 -0
  4. data/CHANGELOG +0 -0
  5. data/Gemfile +17 -0
  6. data/LICENSE +13 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +177 -0
  9. data/Rakefile +12 -0
  10. data/extendi-cassandra_object.gemspec +26 -0
  11. data/lib/cassandra_object.rb +73 -0
  12. data/lib/cassandra_object/adapters/abstract_adapter.rb +61 -0
  13. data/lib/cassandra_object/adapters/cassandra_adapter.rb +269 -0
  14. data/lib/cassandra_object/adapters/cassandra_schemaless_adapter.rb +306 -0
  15. data/lib/cassandra_object/attribute_methods.rb +96 -0
  16. data/lib/cassandra_object/attribute_methods/definition.rb +22 -0
  17. data/lib/cassandra_object/attribute_methods/dirty.rb +36 -0
  18. data/lib/cassandra_object/attribute_methods/primary_key.rb +25 -0
  19. data/lib/cassandra_object/attribute_methods/typecasting.rb +59 -0
  20. data/lib/cassandra_object/base.rb +33 -0
  21. data/lib/cassandra_object/base_schema.rb +11 -0
  22. data/lib/cassandra_object/base_schemaless.rb +11 -0
  23. data/lib/cassandra_object/base_schemaless_dynamic.rb +11 -0
  24. data/lib/cassandra_object/belongs_to.rb +63 -0
  25. data/lib/cassandra_object/belongs_to/association.rb +49 -0
  26. data/lib/cassandra_object/belongs_to/builder.rb +40 -0
  27. data/lib/cassandra_object/belongs_to/reflection.rb +30 -0
  28. data/lib/cassandra_object/callbacks.rb +29 -0
  29. data/lib/cassandra_object/core.rb +63 -0
  30. data/lib/cassandra_object/errors.rb +10 -0
  31. data/lib/cassandra_object/identity.rb +26 -0
  32. data/lib/cassandra_object/inspect.rb +25 -0
  33. data/lib/cassandra_object/log_subscriber.rb +44 -0
  34. data/lib/cassandra_object/model.rb +60 -0
  35. data/lib/cassandra_object/persistence.rb +203 -0
  36. data/lib/cassandra_object/railtie.rb +33 -0
  37. data/lib/cassandra_object/railties/controller_runtime.rb +45 -0
  38. data/lib/cassandra_object/schema.rb +83 -0
  39. data/lib/cassandra_object/schemaless.rb +83 -0
  40. data/lib/cassandra_object/scope.rb +86 -0
  41. data/lib/cassandra_object/scope/finder_methods.rb +54 -0
  42. data/lib/cassandra_object/scope/query_methods.rb +69 -0
  43. data/lib/cassandra_object/scoping.rb +27 -0
  44. data/lib/cassandra_object/serialization.rb +6 -0
  45. data/lib/cassandra_object/tasks/ks.rake +54 -0
  46. data/lib/cassandra_object/timestamps.rb +19 -0
  47. data/lib/cassandra_object/type.rb +16 -0
  48. data/lib/cassandra_object/types.rb +8 -0
  49. data/lib/cassandra_object/types/array_type.rb +16 -0
  50. data/lib/cassandra_object/types/base_type.rb +26 -0
  51. data/lib/cassandra_object/types/boolean_type.rb +20 -0
  52. data/lib/cassandra_object/types/date_type.rb +22 -0
  53. data/lib/cassandra_object/types/float_type.rb +16 -0
  54. data/lib/cassandra_object/types/integer_type.rb +20 -0
  55. data/lib/cassandra_object/types/json_type.rb +13 -0
  56. data/lib/cassandra_object/types/string_type.rb +19 -0
  57. data/lib/cassandra_object/types/time_type.rb +16 -0
  58. data/lib/cassandra_object/types/type_helper.rb +39 -0
  59. data/lib/cassandra_object/validations.rb +44 -0
  60. data/test/support/cassandra.rb +63 -0
  61. data/test/support/issue.rb +12 -0
  62. data/test/support/issue_dynamic.rb +12 -0
  63. data/test/support/issue_schema.rb +17 -0
  64. data/test/support/issue_schema_child.rb +17 -0
  65. data/test/support/issue_schema_father.rb +13 -0
  66. data/test/test_helper.rb +41 -0
  67. data/test/unit/active_model_test.rb +18 -0
  68. data/test/unit/adapters/adapter_test.rb +6 -0
  69. data/test/unit/attribute_methods/definition_test.rb +13 -0
  70. data/test/unit/attribute_methods/dirty_test.rb +72 -0
  71. data/test/unit/attribute_methods/primary_key_test.rb +26 -0
  72. data/test/unit/attribute_methods/typecasting_test.rb +119 -0
  73. data/test/unit/attribute_methods_test.rb +51 -0
  74. data/test/unit/base_test.rb +20 -0
  75. data/test/unit/belongs_to/reflection_test.rb +12 -0
  76. data/test/unit/belongs_to_test.rb +63 -0
  77. data/test/unit/callbacks_test.rb +46 -0
  78. data/test/unit/connection_test.rb +6 -0
  79. data/test/unit/connections/connections_test.rb +55 -0
  80. data/test/unit/core_test.rb +55 -0
  81. data/test/unit/identity_test.rb +26 -0
  82. data/test/unit/inspect_test.rb +26 -0
  83. data/test/unit/log_subscriber_test.rb +25 -0
  84. data/test/unit/persistence_schema_test.rb +156 -0
  85. data/test/unit/persistence_test.rb +266 -0
  86. data/test/unit/railties/controller_runtime_test.rb +48 -0
  87. data/test/unit/schema/tasks_test.rb +32 -0
  88. data/test/unit/schema_test.rb +115 -0
  89. data/test/unit/schemaless_test.rb +100 -0
  90. data/test/unit/scope/finder_methods_test.rb +117 -0
  91. data/test/unit/scope/query_methods_test.rb +32 -0
  92. data/test/unit/scoping_test.rb +7 -0
  93. data/test/unit/timestamps_test.rb +27 -0
  94. data/test/unit/types/array_type_test.rb +17 -0
  95. data/test/unit/types/base_type_test.rb +19 -0
  96. data/test/unit/types/boolean_type_test.rb +24 -0
  97. data/test/unit/types/date_type_test.rb +15 -0
  98. data/test/unit/types/float_type_test.rb +17 -0
  99. data/test/unit/types/integer_type_test.rb +19 -0
  100. data/test/unit/types/json_type_test.rb +23 -0
  101. data/test/unit/types/string_type_test.rb +25 -0
  102. data/test/unit/types/time_type_test.rb +14 -0
  103. data/test/unit/validations_test.rb +27 -0
  104. metadata +202 -0
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::BelongsTo::ReflectionTest < CassandraObject::TestCase
4
+ class ::Status < CassandraObject::Base; end
5
+ class ::User < CassandraObject::Base
6
+ belongs_to :status
7
+ end
8
+
9
+ test 'class_name' do
10
+ assert_equal 'Status', User.new.belongs_to_reflections[:status].class_name
11
+ end
12
+ end
@@ -0,0 +1,63 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::BelongsToTest < CassandraObject::TestCase
4
+ class TestObject < Issue
5
+ string :issue_id
6
+ belongs_to :issue
7
+
8
+ string :widget_id
9
+ belongs_to :widget, class_name: 'Issue'
10
+
11
+ string :target_id
12
+ string :target_type
13
+ belongs_to :target, polymorphic: true
14
+
15
+ end
16
+
17
+ test 'belongs_to' do
18
+ issue = Issue.create
19
+
20
+ record = TestObject.create(issue: issue)
21
+
22
+ assert_equal issue, record.issue
23
+ assert_equal issue.id, record.issue_id
24
+
25
+ record = TestObject.find(record.id)
26
+ assert_equal issue, record.issue
27
+ end
28
+
29
+ test 'belongs_to with class_name' do
30
+ issue = Issue.create
31
+
32
+ record = TestObject.create(widget: issue)
33
+
34
+ assert_equal issue, record.widget
35
+ assert_equal issue.id, record.widget_id
36
+
37
+ record = TestObject.find(record.id)
38
+ assert_equal issue, record.widget
39
+ end
40
+
41
+ test 'belongs_to with polymorphic' do
42
+ issue = Issue.create
43
+
44
+ record = TestObject.create(target: issue)
45
+
46
+ assert_equal issue, record.target
47
+ assert_equal issue.id, record.target_id
48
+ assert_equal 'Issue', record.target_type
49
+
50
+ record = TestObject.find(record.id)
51
+ assert_equal issue, record.target
52
+ end
53
+
54
+ test 'belongs_to clear cache after reload' do
55
+ issue = Issue.create
56
+ record = TestObject.create(issue: issue)
57
+ issue.destroy
58
+
59
+ assert_not_nil record.issue
60
+ assert_nil TestObject.find(record.id).issue
61
+ assert_nil record.reload.issue
62
+ end
63
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::CallbacksTest < CassandraObject::TestCase
4
+ class TestIssue < CassandraObject::BaseSchemaless
5
+ self.column_family = 'Issues'
6
+ string :description
7
+
8
+ %w(before_validation after_validation after_save after_create after_update after_destroy).each do |method|
9
+ send(method) do
10
+ callback_history << method
11
+ end
12
+ end
13
+
14
+ def reset_callback_history
15
+ @callback_history = []
16
+ end
17
+
18
+ def callback_history
19
+ @callback_history ||= []
20
+ end
21
+ end
22
+
23
+ test 'create' do
24
+ issue = TestIssue.create
25
+
26
+ assert_equal ['before_validation', 'after_validation', 'after_save', 'after_create'], issue.callback_history
27
+ end
28
+
29
+ test 'update' do
30
+ issue = TestIssue.create
31
+ issue.reset_callback_history
32
+
33
+ issue.update_attribute :description, 'foo'
34
+
35
+ assert_equal ['after_save', 'after_update'], issue.callback_history
36
+ end
37
+
38
+ test 'destroy' do
39
+ issue = TestIssue.create
40
+ issue.reset_callback_history
41
+
42
+ issue.destroy
43
+
44
+ assert_equal ['after_destroy'], issue.callback_history
45
+ end
46
+ end
@@ -0,0 +1,6 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::ConnectionTest < CassandraObject::TestCase
4
+ class TestObject < CassandraObject::Base
5
+ end
6
+ end
@@ -0,0 +1,55 @@
1
+ #!/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'test_helper'
5
+
6
+ class CassandraObject::ConnectionsTest < CassandraObject::TestCase
7
+
8
+ test 'test connections' do
9
+ IssueSchema.delete_all
10
+ ids = []
11
+ (1..10000).each do
12
+ i = IssueSchema.create(title: "fadjfjkadhsfkjldsa")
13
+ ids << i.id
14
+ end
15
+
16
+ threads = []
17
+
18
+ (0..10).collect do |i|
19
+
20
+ # puts "spawn thread #{i}"
21
+ thr = Thread.new do
22
+ begin
23
+ IssueSchema.find(ids)
24
+ rescue Exception => e
25
+ puts("\n\n\n\n" + e.message)
26
+
27
+ end
28
+ end
29
+ threads << thr
30
+ end
31
+
32
+ end
33
+
34
+ # test 'test create' do
35
+ #
36
+ # values = []
37
+ # threads = []
38
+ # (0..100).collect do |i|
39
+ #
40
+ #
41
+ # puts "spawn thread #{i}"
42
+ # thr = Thread.new do
43
+ # begin
44
+ # values << Issue.new(title: 'title', description: 'desc').search.results.size
45
+ # rescue Exception => e
46
+ # puts("\n\n\n\n" + e.message)
47
+ # retry
48
+ # end
49
+ # end
50
+ # threads << thr
51
+ # end
52
+ #
53
+ # end
54
+
55
+ end
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::CoreTest < CassandraObject::TestCase
4
+ test 'initialiaze' do
5
+ issue = Issue.new
6
+
7
+ assert issue.new_record?
8
+ assert !issue.destroyed?
9
+ end
10
+
11
+ test 'initialize yields self' do
12
+ issue = Issue.new { |i| i.description = 'bar' }
13
+ assert_equal 'bar', issue.description
14
+ end
15
+
16
+ test 'dup' do
17
+ issue = Issue.create description: 'foo'
18
+
19
+ dup_issue = issue.dup
20
+
21
+ assert dup_issue.new_record?
22
+ assert_not_equal issue.id, dup_issue.id
23
+ assert_nil dup_issue.created_at
24
+ assert_nil dup_issue.updated_at
25
+ assert_equal 'foo', issue.description
26
+ end
27
+
28
+ test 'equality of new records' do
29
+ assert_not_equal Issue.new, Issue.new
30
+ end
31
+
32
+ test 'equality' do
33
+ first_issue = Issue.create
34
+ second_issue = Issue.create
35
+
36
+ assert_equal first_issue, first_issue
37
+ assert_equal first_issue, Issue.find(first_issue.id)
38
+ assert_not_equal first_issue, second_issue
39
+ end
40
+
41
+ test 'to_param' do
42
+ issue = Issue.new
43
+ assert_equal issue.id, issue.to_param
44
+ end
45
+
46
+ test 'hash' do
47
+ issue = Issue.create
48
+ assert_equal issue.id.hash, issue.hash
49
+ end
50
+
51
+ test 'inspect' do
52
+ issue = Issue.create
53
+ assert issue.inspect =~ /^#<Issue id: \"\w+\", created_at: \".+\", updated_at: \".+\", description: \".+\">$/
54
+ end
55
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::IdentityTest < CassandraObject::TestCase
4
+ test 'primary_key' do
5
+ assert_equal 'id', Issue.primary_key
6
+ end
7
+
8
+ test 'default _generate_key' do
9
+ issue = Issue.new
10
+
11
+ assert_not_nil Issue._generate_key(issue)
12
+ end
13
+
14
+ test 'custom key' do
15
+ model = temp_object do
16
+ key do
17
+ "name:#{name}"
18
+ end
19
+ attr_accessor :name
20
+ end
21
+ record = model.new
22
+ record.name = 'bar'
23
+
24
+ assert_equal 'name:bar', model._generate_key(record)
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ require 'test_helper'
2
+
3
+ class CassandraObject::InspectTest < CassandraObject::TestCase
4
+ test 'attribute_for_inspect' do
5
+ object = temp_object do
6
+ string :long_string
7
+ time :the_time
8
+ integer :other
9
+ end
10
+
11
+ assert_equal "#{'x' * 51}...".inspect, object.new.attribute_for_inspect('x' * 100)
12
+ assert_equal "2012-02-14 12:01:02".inspect, object.new.attribute_for_inspect(Time.new(2012, 02, 14, 12, 01, 02))
13
+ assert_equal "\"foo\"", object.new.attribute_for_inspect('foo')
14
+ end
15
+
16
+ test 'inspect' do
17
+ object = temp_object do
18
+ string :description
19
+ integer :price
20
+ end.new(description: "yeah buddy", price: nil)
21
+
22
+ assert_match(/id/, object.inspect)
23
+ assert_match(/description/, object.inspect)
24
+ assert_no_match(/price/, object.inspect)
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+ require 'active_support/log_subscriber/test_helper'
3
+ require 'cassandra_object/log_subscriber'
4
+
5
+ class CassandraObject::LogSubscriberTest < CassandraObject::TestCase
6
+ include ActiveSupport::LogSubscriber::TestHelper
7
+
8
+ def setup
9
+ super
10
+
11
+ CassandraObject::LogSubscriber.attach_to :cassandra_object
12
+ end
13
+
14
+ def test_cql_notification
15
+ Issue.adapter.execute 'SELECT * FROM Issues'
16
+
17
+ wait
18
+
19
+ assert_match 'SELECT * FROM Issues', @logger.logged(:debug)[0]
20
+ end
21
+
22
+ def test_initializes_runtime
23
+ Thread.new { assert_equal 0, CassandraObject::LogSubscriber.runtime }.join
24
+ end
25
+ end
@@ -0,0 +1,156 @@
1
+ #!/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'test_helper'
5
+
6
+ class CassandraObject::PersistenceSchemaTest < CassandraObject::TestCase
7
+
8
+ test 'instantiate removes unknowns' do
9
+ assert_nil IssueSchema.instantiate('theid', 'z' => 'nooo').attributes['z']
10
+ end
11
+
12
+ test 'create' do
13
+ issue = IssueSchema.create title: 'tit', description: 'foo'
14
+ assert_equal 'foo', issue.description
15
+ assert_equal 'foo', IssueSchema.find(issue.id).description
16
+ end
17
+
18
+ test 'save' do
19
+ issue = IssueSchema.new
20
+ issue.title = 'tit'
21
+ issue.save
22
+
23
+ assert_equal issue, IssueSchema.find(issue.id)
24
+ end
25
+
26
+ test 'save!' do
27
+ record = IssueSchema.new(title: 'tit', description: 'bad')
28
+ record.save!
29
+
30
+ assert_raise CassandraObject::RecordInvalid do
31
+ record = IssueSchema.new(description: 'lololol')
32
+ record.save!
33
+ end
34
+
35
+ end
36
+
37
+ test 'destroy' do
38
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol')
39
+ issue.destroy
40
+
41
+ assert issue.destroyed?
42
+ assert !issue.persisted?
43
+ assert !issue.new_record?
44
+ end
45
+
46
+ test 'update_attribute' do
47
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol')
48
+ issue.update_attribute(:description, 'lol')
49
+
50
+ assert !issue.changed?
51
+ assert_equal 'lol', issue.description
52
+ end
53
+
54
+ test 'update_attributes' do
55
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol')
56
+ issue.update_attributes(title: 'lollete', description: 'lol')
57
+
58
+ assert !issue.changed?
59
+ assert_equal 'lol', issue.description
60
+ end
61
+
62
+ test 'update_attributes!' do
63
+ issue = IssueSchema.new(description: 'bad')
64
+ issue.title = 'titttt'
65
+ issue.save!
66
+
67
+ assert_raise CassandraObject::RecordInvalid do
68
+ issue.update_attributes! title: ''
69
+ end
70
+ end
71
+
72
+ test 'update nil attributes' do
73
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol')
74
+
75
+ issue.update_attributes description: nil
76
+
77
+ issue = IssueSchema.find issue.id
78
+ assert_nil issue.description
79
+ end
80
+
81
+ test 'becomes' do
82
+ klass = temp_object do
83
+ end
84
+
85
+ assert_kind_of klass, IssueSchema.new.becomes(klass)
86
+ end
87
+
88
+ test 'reload' do
89
+ persisted_issue = IssueSchema.create(title: 'I rule', description: 'lololol')
90
+ fresh_issue = IssueSchema.find(persisted_issue.id)
91
+ fresh_issue.update_attribute(:description, 'say what')
92
+
93
+ reloaded_issue = persisted_issue.reload
94
+ assert_equal 'say what', persisted_issue.description
95
+ assert_equal persisted_issue, reloaded_issue
96
+ end
97
+
98
+ test 'remove' do
99
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol')
100
+ id = issue.id
101
+ assert_equal id, IssueSchema.find(id).id
102
+ IssueSchema.remove(id)
103
+ assert_raise CassandraObject::RecordNotFound do
104
+ IssueSchema.find(id)
105
+ end
106
+ end
107
+
108
+ test 'remove multiple' do
109
+ ids = []
110
+ (1..10).each do
111
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol')
112
+ ids << issue.id
113
+ end
114
+
115
+ IssueSchema.remove(ids)
116
+
117
+ assert_equal [], IssueSchema.find(ids)
118
+ end
119
+
120
+ test 'ttl' do
121
+ issue = IssueSchema.create(title: 'I rule', description: 'lololol', ttl: 1)
122
+ assert_nothing_raised do
123
+ IssueSchema.find(issue.id)
124
+ end
125
+
126
+ sleep 2
127
+
128
+ assert_raise CassandraObject::RecordNotFound do
129
+ IssueSchema.find(issue.id)
130
+ end
131
+
132
+ end
133
+
134
+ test 'type tests' do
135
+ issue = IssueSchema.create(title: 'title', description: 'desc', field: 1.5, intero: 10)
136
+ assert_nothing_raised do
137
+ IssueSchema.find(issue.id)
138
+ end
139
+
140
+ from_db = IssueSchema.find(issue.id)
141
+ assert_equal Float, from_db.field.class
142
+ assert_equal Fixnum, from_db.intero.class
143
+ # TODO add other types
144
+ # byebug
145
+
146
+ end
147
+
148
+ test 'belongs_to schema' do
149
+ father = IssueSchemaFather.create title: 'father'
150
+ child = IssueSchemaChild.create title: 'child', issue_schema_father: father
151
+ child.save
152
+ assert_equal father, IssueSchemaChild.find(child.id).issue_schema_father
153
+ end
154
+
155
+
156
+ end