curly_mustache 0.1.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.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +106 -0
- data/Rakefile +56 -0
- data/TODO +0 -0
- data/VERSION.yml +4 -0
- data/curly_mustache.gemspec +89 -0
- data/lib/curly_mustache.rb +23 -0
- data/lib/curly_mustache/adapters.rb +61 -0
- data/lib/curly_mustache/adapters/abstract.rb +86 -0
- data/lib/curly_mustache/adapters/cassandra.rb +35 -0
- data/lib/curly_mustache/adapters/memcached.rb +56 -0
- data/lib/curly_mustache/attributes.rb +85 -0
- data/lib/curly_mustache/attributes/definition.rb +24 -0
- data/lib/curly_mustache/attributes/manager.rb +41 -0
- data/lib/curly_mustache/attributes/types.rb +49 -0
- data/lib/curly_mustache/base.rb +36 -0
- data/lib/curly_mustache/connection.rb +65 -0
- data/lib/curly_mustache/crud.rb +244 -0
- data/lib/curly_mustache/default_types.rb +18 -0
- data/lib/curly_mustache/errors.rb +14 -0
- data/lib/curly_mustache/locking.rb +83 -0
- data/test/abstract_adapter_test.rb +22 -0
- data/test/adapters.yml +6 -0
- data/test/attributes_test.rb +96 -0
- data/test/callbacks_test.rb +22 -0
- data/test/crud_test.rb +169 -0
- data/test/locking_test.rb +57 -0
- data/test/models/account.rb +31 -0
- data/test/models/feed.rb +13 -0
- data/test/models/page.rb +4 -0
- data/test/models/user.rb +10 -0
- data/test/serialization_test.rb +22 -0
- data/test/test_helper.rb +35 -0
- data/test/types_test.rb +13 -0
- data/test/validations_test.rb +65 -0
- metadata +112 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
class Account < CurlyMustache::Base
|
2
|
+
attribute :name, :string, :allow_nil => false
|
3
|
+
attribute :created_at, :time
|
4
|
+
attribute :updated_at, :time
|
5
|
+
|
6
|
+
CALLBACKS = %w[before_create after_create
|
7
|
+
before_save after_save
|
8
|
+
before_update after_update
|
9
|
+
before_destroy after_destroy
|
10
|
+
before_validation after_validation
|
11
|
+
before_validation_on_create after_validation_on_create
|
12
|
+
before_validation_on_update after_validation_on_update
|
13
|
+
after_find]
|
14
|
+
|
15
|
+
attr_accessor :callbacks_made
|
16
|
+
|
17
|
+
# This just defines methods for each callback that simply records in #callbacks_made that
|
18
|
+
# the callback was called.
|
19
|
+
CALLBACKS.each do |callback_name|
|
20
|
+
class_eval <<-end_eval
|
21
|
+
#{callback_name} :#{callback_name}_cb
|
22
|
+
def #{callback_name}_cb
|
23
|
+
@callbacks_made ||= []
|
24
|
+
@callbacks_made << :#{callback_name}
|
25
|
+
end
|
26
|
+
end_eval
|
27
|
+
end
|
28
|
+
|
29
|
+
validates_presence_of :name
|
30
|
+
|
31
|
+
end
|
data/test/models/feed.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
class Feed < CurlyMustache::Base
|
2
|
+
attribute :title, :string
|
3
|
+
attribute :url, :string
|
4
|
+
|
5
|
+
def send_attributes(attributes)
|
6
|
+
{ "BLOB" => Marshal.dump(attributes) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def recv_attributes(attributes)
|
10
|
+
Marshal.load(attributes["BLOB"])
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
data/test/models/page.rb
ADDED
data/test/models/user.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
class User < CurlyMustache::Base
|
2
|
+
allow_settable_id!
|
3
|
+
attribute :id, :integer
|
4
|
+
attribute :name, :string
|
5
|
+
attribute :phone_number, :integer
|
6
|
+
attribute :balance, :float
|
7
|
+
attribute :is_admin, :boolean
|
8
|
+
attribute :created_at, :time
|
9
|
+
attribute :updated_at, :time
|
10
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class SerializationTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_basic
|
6
|
+
feed = Feed.create(:title => "blah", :url => "http://www.blah.com")
|
7
|
+
feed = Feed.find(feed.id)
|
8
|
+
assert_equal "blah", feed.title
|
9
|
+
assert_equal "http://www.blah.com", feed.url
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_proper_connection
|
13
|
+
feed = Feed.create(:title => "blah", :url => "http://www.blah.com")
|
14
|
+
assert_equal %w[BLOB],
|
15
|
+
Feed.connection.get(Feed.send(:id_to_key, feed.id)).keys
|
16
|
+
|
17
|
+
account = Account.create(:name => "blah", :created_at => Time.now, :updated_at => Time.now)
|
18
|
+
assert_equal %w[id name created_at updated_at].sort,
|
19
|
+
Account.connection.get(Account.send(:id_to_key, account.id)).keys.sort
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'mocha'
|
4
|
+
|
5
|
+
require 'curly_mustache'
|
6
|
+
|
7
|
+
# This has to go before the model definitions or class_inheritable_accessor won't inherit.
|
8
|
+
adapter = ENV["ADAPTER"] || ENV["adapter"] || "memcached"
|
9
|
+
configs = YAML.load(File.open(File.dirname(__FILE__)+"/adapters.yml"){ |f| f.read })
|
10
|
+
CurlyMustache::Base.establish_connection(configs[adapter].merge(:adapter => adapter))
|
11
|
+
|
12
|
+
# This also has to go before the model definitions or class_inheritable_accessor won't inherit.
|
13
|
+
class CurlyMustache::Base
|
14
|
+
if connection.adapter_name == :cassandra
|
15
|
+
def send_attributes(attributes)
|
16
|
+
attributes.inject({}) do |memo, (k, v)|
|
17
|
+
memo[k] = String(v)
|
18
|
+
memo
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Load model definitions.
|
25
|
+
Dir.glob(File.dirname(__FILE__) + "/models/*").each{ |file_name| require file_name }
|
26
|
+
|
27
|
+
class ActiveSupport::TestCase
|
28
|
+
|
29
|
+
def disable_tests
|
30
|
+
methods.select{ |method| method =~ /^test_/ }.each do |method|
|
31
|
+
self.class.send(:define_method, method){ nil }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/test/types_test.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class TypesTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_clear
|
6
|
+
assert !CurlyMustache::Attributes::Types.definitions.blank?
|
7
|
+
CurlyMustache::Attributes::Types.clear
|
8
|
+
assert CurlyMustache::Attributes::Types.definitions.blank?
|
9
|
+
load File.dirname(__FILE__) + "/../lib/curly_mustache/default_types.rb"
|
10
|
+
assert !CurlyMustache::Attributes::Types.definitions.blank?
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ValidationsTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def test_basic
|
6
|
+
account = Account.new
|
7
|
+
assert !account.valid?
|
8
|
+
assert_equal 1, account.errors.length
|
9
|
+
assert_equal ["can't be blank"], account.errors[:name]
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_create
|
13
|
+
account = Account.create
|
14
|
+
assert account.new_record?
|
15
|
+
assert_equal({}, account.attributes)
|
16
|
+
assert_equal [:before_validation_on_create, :before_validation], account.callbacks_made
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_create!
|
20
|
+
begin
|
21
|
+
Account.create!
|
22
|
+
assert false
|
23
|
+
rescue CurlyMustache::RecordInvalid => e
|
24
|
+
assert e.message.index("Validation failed:") == 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_save
|
29
|
+
account = Account.new
|
30
|
+
assert_equal false, account.save
|
31
|
+
assert_equal({}, account.attributes)
|
32
|
+
assert_equal [:before_validation_on_create, :before_validation], account.callbacks_made
|
33
|
+
|
34
|
+
# Now make sure the callback changed to on_update.
|
35
|
+
account = Account.create!(:name => "blah")
|
36
|
+
account.callbacks_made = []
|
37
|
+
account.name = nil
|
38
|
+
assert_equal false, account.save
|
39
|
+
assert_equal [:before_validation_on_update, :before_validation], account.callbacks_made
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_save!
|
43
|
+
begin
|
44
|
+
account = Account.new
|
45
|
+
account.save!
|
46
|
+
assert false
|
47
|
+
rescue CurlyMustache::RecordInvalid => e
|
48
|
+
assert e.message.index("Validation failed:") == 0
|
49
|
+
assert_equal [:before_validation_on_create, :before_validation], account.callbacks_made
|
50
|
+
end
|
51
|
+
|
52
|
+
# Now make sure the callback changed to on_update.
|
53
|
+
account = Account.create!(:name => "blah")
|
54
|
+
account.callbacks_made = []
|
55
|
+
begin
|
56
|
+
account.name = nil
|
57
|
+
account.save!
|
58
|
+
assert false
|
59
|
+
rescue CurlyMustache::RecordInvalid => e
|
60
|
+
assert e.message.index("Validation failed:") == 0
|
61
|
+
assert_equal [:before_validation_on_update, :before_validation], account.callbacks_made
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: curly_mustache
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Christopher J Bottaro
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-02-24 00:00:00 -06:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description:
|
22
|
+
email: cjbottaro@alumni.cs.utexas.edu
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE
|
29
|
+
- README.rdoc
|
30
|
+
- TODO
|
31
|
+
files:
|
32
|
+
- .document
|
33
|
+
- .gitignore
|
34
|
+
- LICENSE
|
35
|
+
- README.rdoc
|
36
|
+
- Rakefile
|
37
|
+
- TODO
|
38
|
+
- VERSION.yml
|
39
|
+
- curly_mustache.gemspec
|
40
|
+
- lib/curly_mustache.rb
|
41
|
+
- lib/curly_mustache/adapters.rb
|
42
|
+
- lib/curly_mustache/adapters/abstract.rb
|
43
|
+
- lib/curly_mustache/adapters/cassandra.rb
|
44
|
+
- lib/curly_mustache/adapters/memcached.rb
|
45
|
+
- lib/curly_mustache/attributes.rb
|
46
|
+
- lib/curly_mustache/attributes/definition.rb
|
47
|
+
- lib/curly_mustache/attributes/manager.rb
|
48
|
+
- lib/curly_mustache/attributes/types.rb
|
49
|
+
- lib/curly_mustache/base.rb
|
50
|
+
- lib/curly_mustache/connection.rb
|
51
|
+
- lib/curly_mustache/crud.rb
|
52
|
+
- lib/curly_mustache/default_types.rb
|
53
|
+
- lib/curly_mustache/errors.rb
|
54
|
+
- lib/curly_mustache/locking.rb
|
55
|
+
- test/abstract_adapter_test.rb
|
56
|
+
- test/adapters.yml
|
57
|
+
- test/attributes_test.rb
|
58
|
+
- test/callbacks_test.rb
|
59
|
+
- test/crud_test.rb
|
60
|
+
- test/locking_test.rb
|
61
|
+
- test/models/account.rb
|
62
|
+
- test/models/feed.rb
|
63
|
+
- test/models/page.rb
|
64
|
+
- test/models/user.rb
|
65
|
+
- test/serialization_test.rb
|
66
|
+
- test/test_helper.rb
|
67
|
+
- test/types_test.rb
|
68
|
+
- test/validations_test.rb
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: http://github.com/cjbottaro/curly_mustache
|
71
|
+
licenses: []
|
72
|
+
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options:
|
75
|
+
- --charset=UTF-8
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
version: "0"
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
requirements: []
|
93
|
+
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.3.6
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: ActiveRecord-like interface to various data stores, using ActiveModel.
|
99
|
+
test_files:
|
100
|
+
- test/abstract_adapter_test.rb
|
101
|
+
- test/attributes_test.rb
|
102
|
+
- test/callbacks_test.rb
|
103
|
+
- test/crud_test.rb
|
104
|
+
- test/locking_test.rb
|
105
|
+
- test/models/account.rb
|
106
|
+
- test/models/feed.rb
|
107
|
+
- test/models/page.rb
|
108
|
+
- test/models/user.rb
|
109
|
+
- test/serialization_test.rb
|
110
|
+
- test/test_helper.rb
|
111
|
+
- test/types_test.rb
|
112
|
+
- test/validations_test.rb
|