mem_model 0.2.0 → 0.3.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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +7 -0
- data/Gemfile.ci +0 -2
- data/Manifest.txt +8 -3
- data/README.md +1 -1
- data/Rakefile +5 -4
- data/lib/mem_model/base.rb +84 -41
- data/lib/mem_model/concern.rb +28 -0
- data/lib/mem_model/errors.rb +45 -0
- data/lib/mem_model/guid.rb +1 -3
- data/lib/mem_model/model_name.rb +7 -0
- data/lib/mem_model/rooted_base.rb +44 -3
- data/lib/mem_model/validations.rb +26 -0
- data/lib/mem_model/version.rb +1 -1
- data/lib/mem_model.rb +3 -11
- data/mem_model.gemspec +5 -11
- data/test/helper.rb +1 -5
- data/test/mem_model/test_base.rb +49 -8
- data/test/mem_model/{test_rooted_store.rb → test_rooted_base.rb} +11 -1
- data/test/mem_model/test_validations.rb +24 -0
- data/test/{test_version.rb → mem_model/test_version.rb} +1 -1
- data/test/support/active_model_lint.rb +110 -0
- metadata +13 -35
- data/lib/mem_model/rooted_store.rb +0 -28
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YjE0N2IyYTEwODVjYjExZDIxMzllMDIyMzk2ZDI2MzhiYjU5ZWY0Yw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YWVkM2FhMTUzOTlhODYwMjQ2NDRlN2M2MzMxYjc2MzMzNjY4NGE4YQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDlmOTM3M2VkZWJkYjdmYjg0MWFlZWU1YjcxYWRjZDA0MTk2ZTM1NGE4NGQy
|
10
|
+
MTdhODRmMmExM2M3NGM0ZTY3NmUyZGNmMWFiN2NkOTBhYjQ0ZDQxZDdiOGE1
|
11
|
+
NWEyOTA0MmUzYmQzNjgyOTU0YjhlYzg5NjI5M2I4ZWZiZjUxODM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjljNmVmMjkwYmUyMDFlOGNhY2Y3Yzk2NjQ3NWE3ZjgwNjQ1Mzg4Zjg0MmRi
|
14
|
+
MzIyZTNjZmQ3ODJmMzMzMDJmMjQ0YTcyNjI1ZjkzZWIzYmE1ZDcyOWM5ZWFi
|
15
|
+
Yzg2MmJiNTZhNzlhMWQyZWNmMDM1MDIwMDhjNjUxMTUzNWE2MWE=
|
data/CHANGELOG.md
CHANGED
data/Gemfile.ci
CHANGED
data/Manifest.txt
CHANGED
@@ -10,14 +10,19 @@ README.md
|
|
10
10
|
Rakefile
|
11
11
|
lib/mem_model.rb
|
12
12
|
lib/mem_model/base.rb
|
13
|
+
lib/mem_model/concern.rb
|
14
|
+
lib/mem_model/errors.rb
|
13
15
|
lib/mem_model/guid.rb
|
16
|
+
lib/mem_model/model_name.rb
|
14
17
|
lib/mem_model/rooted_base.rb
|
15
|
-
lib/mem_model/
|
18
|
+
lib/mem_model/validations.rb
|
16
19
|
lib/mem_model/version.rb
|
17
20
|
mem_model.gemspec
|
18
21
|
test/helper.rb
|
19
22
|
test/mem_model/test_active_model.rb
|
20
23
|
test/mem_model/test_base.rb
|
21
24
|
test/mem_model/test_guid.rb
|
22
|
-
test/mem_model/
|
23
|
-
test/
|
25
|
+
test/mem_model/test_rooted_base.rb
|
26
|
+
test/mem_model/test_validations.rb
|
27
|
+
test/mem_model/test_version.rb
|
28
|
+
test/support/active_model_lint.rb
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -29,6 +29,11 @@ task :changelog do
|
|
29
29
|
puts "Prepended these new changes:\n\n#{changes}"
|
30
30
|
end
|
31
31
|
|
32
|
+
desc 'Console'
|
33
|
+
task :console do
|
34
|
+
sh "irb -rubygems -r ./lib/mem_model"
|
35
|
+
end
|
36
|
+
|
32
37
|
if defined? Hoe
|
33
38
|
|
34
39
|
[ :debug, :deps, :gemcutter, :newb, :publish, :signing ].each do |plugin|
|
@@ -37,7 +42,6 @@ end
|
|
37
42
|
|
38
43
|
Hoe.plugin :git
|
39
44
|
Hoe.plugin :gemspec
|
40
|
-
#Hoe.plugin :rubygems
|
41
45
|
|
42
46
|
Hoe.spec 'mem_model' do
|
43
47
|
developer 'JohnnyT', 'ubergeek3141@gmail.com'
|
@@ -57,9 +61,6 @@ Hoe.spec 'mem_model' do
|
|
57
61
|
|
58
62
|
license 'MIT'
|
59
63
|
|
60
|
-
dependency 'active_attr', '>= 0.8.2'
|
61
|
-
dependency 'activesupport', '>= 3.2.15'
|
62
|
-
|
63
64
|
dependency 'minitest', '>= 5.0.0', :development
|
64
65
|
dependency 'minitest-reporters', '>= 1.0.0', :development
|
65
66
|
dependency 'coveralls', '>= 1.0.0', :development
|
data/lib/mem_model/base.rb
CHANGED
@@ -1,24 +1,41 @@
|
|
1
1
|
module MemModel
|
2
|
-
class UnknownRecord < ArgumentError; end
|
3
|
-
class InvalidRecord < StandardError; end
|
4
|
-
|
5
2
|
module Base
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
attribute :id
|
12
|
-
end
|
3
|
+
extend MemModel::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include MemModel::Validations
|
7
|
+
attr_accessor :id
|
13
8
|
end
|
14
9
|
|
15
10
|
module ClassMethods
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
include Enumerable
|
12
|
+
|
13
|
+
def each(&block)
|
14
|
+
store.each(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def model_name
|
18
|
+
@model_name ||= ModelName.new(self.name)
|
19
|
+
end
|
20
|
+
|
21
|
+
def store_class
|
22
|
+
MemModel.maglev? ? IdentitySet : Set
|
23
|
+
end
|
19
24
|
|
20
25
|
def store
|
21
|
-
@store ||=
|
26
|
+
@store ||= store_class.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def size
|
30
|
+
store.size
|
31
|
+
end
|
32
|
+
|
33
|
+
def all
|
34
|
+
store.to_a
|
35
|
+
end
|
36
|
+
|
37
|
+
def last
|
38
|
+
all[-1]
|
22
39
|
end
|
23
40
|
|
24
41
|
def generate_id
|
@@ -40,22 +57,6 @@ module MemModel
|
|
40
57
|
store.any?{ |record| record.id == id }
|
41
58
|
end
|
42
59
|
|
43
|
-
def update(id, atts)
|
44
|
-
find(id).update_attributes(atts)
|
45
|
-
end
|
46
|
-
|
47
|
-
def destroy(id)
|
48
|
-
find(id).destroy
|
49
|
-
end
|
50
|
-
|
51
|
-
# Removes all records and executes
|
52
|
-
# destroy callbacks.
|
53
|
-
def destroy_all
|
54
|
-
all.each {|r| r.destroy }
|
55
|
-
end
|
56
|
-
|
57
|
-
# Removes all records without executing
|
58
|
-
# destroy callbacks.
|
59
60
|
def delete_all
|
60
61
|
store.clear
|
61
62
|
end
|
@@ -68,8 +69,24 @@ module MemModel
|
|
68
69
|
rec.save && rec
|
69
70
|
end
|
70
71
|
|
71
|
-
def
|
72
|
-
|
72
|
+
def maglev?
|
73
|
+
MemModel.maglev?
|
74
|
+
end
|
75
|
+
|
76
|
+
def abort
|
77
|
+
# no-op
|
78
|
+
true
|
79
|
+
end
|
80
|
+
|
81
|
+
def commit
|
82
|
+
# no-op
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
alias_method :to_str, :to_s
|
87
|
+
|
88
|
+
def delete(record)
|
89
|
+
store.delete(record)
|
73
90
|
end
|
74
91
|
end
|
75
92
|
|
@@ -79,6 +96,34 @@ module MemModel
|
|
79
96
|
load_attributes(attributes)
|
80
97
|
end
|
81
98
|
|
99
|
+
|
100
|
+
def model_name; self.class.model_name; end
|
101
|
+
def persisted?; true; end
|
102
|
+
|
103
|
+
def to_key; end
|
104
|
+
def to_param; end
|
105
|
+
def to_partial_path; 'something'; end
|
106
|
+
|
107
|
+
def errors; @errors ||= Errors.new(self); end
|
108
|
+
|
109
|
+
|
110
|
+
def maglev?
|
111
|
+
self.class.maglev?
|
112
|
+
end
|
113
|
+
|
114
|
+
def abort
|
115
|
+
self.class.abort
|
116
|
+
end
|
117
|
+
|
118
|
+
def commit
|
119
|
+
self.class.commit
|
120
|
+
end
|
121
|
+
|
122
|
+
def persistent(&block)
|
123
|
+
# no-op
|
124
|
+
block.call
|
125
|
+
end
|
126
|
+
|
82
127
|
def new?
|
83
128
|
!exists?
|
84
129
|
end
|
@@ -92,19 +137,17 @@ module MemModel
|
|
92
137
|
new? ? create : update
|
93
138
|
end
|
94
139
|
|
95
|
-
def save!
|
96
|
-
save || raise(InvalidRecord)
|
97
|
-
end
|
98
|
-
|
99
140
|
def create
|
100
141
|
self.id ||= generate_id
|
101
|
-
|
102
|
-
|
142
|
+
persistent do
|
143
|
+
self.class.store << self
|
144
|
+
@persisted = true
|
145
|
+
end
|
103
146
|
self.id
|
104
147
|
end
|
105
148
|
|
106
149
|
def update
|
107
|
-
|
150
|
+
commit
|
108
151
|
true
|
109
152
|
end
|
110
153
|
|
@@ -113,8 +156,8 @@ module MemModel
|
|
113
156
|
save
|
114
157
|
end
|
115
158
|
|
116
|
-
def
|
117
|
-
self.class.
|
159
|
+
def delete
|
160
|
+
self.class.delete(self)
|
118
161
|
self
|
119
162
|
end
|
120
163
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module MemModel
|
2
|
+
module Concern
|
3
|
+
def self.extended(base)
|
4
|
+
base.instance_variable_set("@_dependencies", [])
|
5
|
+
end
|
6
|
+
|
7
|
+
def append_features(base)
|
8
|
+
if base.instance_variable_defined?("@_dependencies")
|
9
|
+
base.instance_variable_get("@_dependencies") << self
|
10
|
+
return false
|
11
|
+
else
|
12
|
+
return false if base < self
|
13
|
+
@_dependencies.each { |dep| base.send(:include, dep) }
|
14
|
+
super
|
15
|
+
base.extend const_get("ClassMethods") if const_defined?("ClassMethods")
|
16
|
+
base.class_eval(&@_included_block) if instance_variable_defined?("@_included_block")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def included(base = nil, &block)
|
21
|
+
if base.nil?
|
22
|
+
@_included_block = block
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module MemModel
|
2
|
+
class UnknownRecord < ArgumentError; end
|
3
|
+
class InvalidRecord < StandardError; end
|
4
|
+
|
5
|
+
class Errors
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
attr_reader :messages
|
9
|
+
|
10
|
+
def initialize(base)
|
11
|
+
@base = base
|
12
|
+
@messages = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def each
|
16
|
+
messages.each_key do |attribute|
|
17
|
+
self[attribute].each { |error| yield attribute, error }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def full_messages
|
22
|
+
map { |attribute, message| full_message(attribute, message) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def full_message(attribute, message)
|
26
|
+
[attribute, message].join(' ')
|
27
|
+
end
|
28
|
+
|
29
|
+
def [](attribute)
|
30
|
+
get(attribute.to_sym) || set(attribute.to_sym, [])
|
31
|
+
end
|
32
|
+
|
33
|
+
def []=(attribute, error)
|
34
|
+
self[attribute] << error
|
35
|
+
end
|
36
|
+
|
37
|
+
def get(key)
|
38
|
+
messages[key]
|
39
|
+
end
|
40
|
+
|
41
|
+
def set(key, value)
|
42
|
+
messages[key] = value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/mem_model/guid.rb
CHANGED
@@ -1,8 +1,49 @@
|
|
1
1
|
module MemModel
|
2
|
+
PERSISTENT_ROOT = {} if !MemModel.maglev?
|
3
|
+
|
2
4
|
module RootedBase
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
extend MemModel::Concern
|
6
|
+
include Base
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def root_container
|
10
|
+
MemModel.maglev? ? Maglev : MemModel
|
11
|
+
end
|
12
|
+
|
13
|
+
def container_key
|
14
|
+
name.to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
def store
|
18
|
+
root[:MemModel] ||= {}
|
19
|
+
root[:MemModel][container_key] ||= store_class.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def root
|
23
|
+
@root ||= root_container::PERSISTENT_ROOT
|
24
|
+
end
|
25
|
+
|
26
|
+
def abort
|
27
|
+
Maglev.abort_transaction if maglev?
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def commit
|
32
|
+
Maglev.commit_transaction if maglev?
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def persistent(&block)
|
37
|
+
abort
|
38
|
+
maglev? ?
|
39
|
+
Maglev.persistent { block.call } :
|
40
|
+
block.call
|
41
|
+
commit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def persistent(&block)
|
46
|
+
self.class.persistent(&block)
|
6
47
|
end
|
7
48
|
end
|
8
49
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MemModel
|
2
|
+
module Validations
|
3
|
+
extend MemModel::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
def validations
|
7
|
+
@validations ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def validates_presence_of(attr)
|
11
|
+
validations << [:presence, attr]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def valid?
|
16
|
+
validations.empty? || validations.all? do |kind, attr|
|
17
|
+
value = self.send(attr)
|
18
|
+
value && value != ''
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def validations
|
23
|
+
self.class.validations
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/mem_model/version.rb
CHANGED
data/lib/mem_model.rb
CHANGED
@@ -1,24 +1,16 @@
|
|
1
1
|
lib_dir = File.dirname(__FILE__)
|
2
2
|
$LOAD_PATH << lib_dir unless $LOAD_PATH.include? lib_dir
|
3
3
|
|
4
|
-
require 'active_attr'
|
5
4
|
require 'securerandom'
|
6
|
-
require 'forwardable'
|
7
5
|
require 'set'
|
8
|
-
require 'active_support/dependencies/autoload'
|
9
6
|
|
10
7
|
module MemModel
|
11
8
|
def maglev?
|
12
9
|
!defined?(Maglev).nil?
|
13
10
|
end
|
14
11
|
module_function :maglev?
|
15
|
-
|
16
|
-
extend ActiveSupport::Autoload
|
17
|
-
|
18
|
-
autoload :Base
|
19
|
-
autoload :Guid
|
20
|
-
autoload :RootedBase
|
21
|
-
autoload :RootedStore
|
22
12
|
end
|
23
13
|
|
24
|
-
|
14
|
+
%w[ concern base errors guid model_name rooted_base validations version ].each do |file|
|
15
|
+
load File.expand_path("../mem_model/#{file}.rb", __FILE__)
|
16
|
+
end
|
data/mem_model.gemspec
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: mem_model 0.
|
2
|
+
# stub: mem_model 0.3.0.20131227093624 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "mem_model"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.3.0.20131227093624"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.authors = ["JohnnyT"]
|
10
|
-
s.date = "2013-12-
|
10
|
+
s.date = "2013-12-27"
|
11
11
|
s.description = "MemModel persists Ruby objects using MagLev as a data storage engine. It's an ActiveModel implementation so it works stand-alone or in Rails 3 as a drop-in replacement for ActiveRecord or DataMapper. If MemModel is used in non-MagLev platforms, objects will be persisted to in-memory sets."
|
12
12
|
s.email = ["ubergeek3141@gmail.com"]
|
13
13
|
s.extra_rdoc_files = ["CHANGELOG.md", "CONTRIBUTING.md", "LICENSE.md", "Manifest.txt", "README.md"]
|
14
|
-
s.files = [".coveralls.yml", ".gitignore", ".travis.yml", "CHANGELOG.md", "CONTRIBUTING.md", "Gemfile.ci", "LICENSE.md", "Manifest.txt", "README.md", "Rakefile", "lib/mem_model.rb", "lib/mem_model/base.rb", "lib/mem_model/guid.rb", "lib/mem_model/rooted_base.rb", "lib/mem_model/rooted_store.rb", "lib/mem_model/version.rb", "mem_model.gemspec", "test/helper.rb", "test/mem_model/test_active_model.rb", "test/mem_model/test_base.rb", "test/mem_model/test_guid.rb", "test/mem_model/test_rooted_store.rb", "test/test_version.rb", ".gemtest"]
|
14
|
+
s.files = [".coveralls.yml", ".gitignore", ".travis.yml", "CHANGELOG.md", "CONTRIBUTING.md", "Gemfile.ci", "LICENSE.md", "Manifest.txt", "README.md", "Rakefile", "lib/mem_model.rb", "lib/mem_model/base.rb", "lib/mem_model/guid.rb", "lib/mem_model/rooted_base.rb", "lib/mem_model/rooted_store.rb", "lib/mem_model/version.rb", "mem_model.gemspec", "test/helper.rb", "test/mem_model/test_active_model.rb", "test/mem_model/test_base.rb", "test/mem_model/test_guid.rb", "test/mem_model/test_rooted_store.rb", "test/test_version.rb", "test/mem_model/test_rooted_base.rb", "test/mem_model/test_validations.rb", "test/mem_model/test_version.rb", ".gemtest"]
|
15
15
|
s.homepage = "https://github.com/johnnyt/mem_model"
|
16
16
|
s.licenses = ["MIT"]
|
17
17
|
s.rdoc_options = ["--main", "README.md"]
|
@@ -19,29 +19,23 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.rubyforge_project = "mem_model"
|
20
20
|
s.rubygems_version = "2.1.11"
|
21
21
|
s.summary = "ActiveModel-compliant MagLev persistence"
|
22
|
-
s.test_files = ["test/mem_model/test_guid.rb", "test/mem_model/test_base.rb", "test/mem_model/
|
22
|
+
s.test_files = ["test/mem_model/test_rooted_base.rb", "test/mem_model/test_guid.rb", "test/mem_model/test_base.rb", "test/mem_model/test_active_model.rb", "test/mem_model/test_validations.rb", "test/mem_model/test_version.rb"]
|
23
23
|
|
24
24
|
if s.respond_to? :specification_version then
|
25
25
|
s.specification_version = 4
|
26
26
|
|
27
27
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
28
|
-
s.add_runtime_dependency(%q<active_attr>, [">= 0.8.2"])
|
29
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 3.2.15"])
|
30
28
|
s.add_development_dependency(%q<minitest>, [">= 5.0.0"])
|
31
29
|
s.add_development_dependency(%q<minitest-reporters>, [">= 1.0.0"])
|
32
30
|
s.add_development_dependency(%q<coveralls>, [">= 1.0.0"])
|
33
31
|
s.add_development_dependency(%q<hoe>, ["~> 3.7"])
|
34
32
|
else
|
35
|
-
s.add_dependency(%q<active_attr>, [">= 0.8.2"])
|
36
|
-
s.add_dependency(%q<activesupport>, [">= 3.2.15"])
|
37
33
|
s.add_dependency(%q<minitest>, [">= 5.0.0"])
|
38
34
|
s.add_dependency(%q<minitest-reporters>, [">= 1.0.0"])
|
39
35
|
s.add_dependency(%q<coveralls>, [">= 1.0.0"])
|
40
36
|
s.add_dependency(%q<hoe>, ["~> 3.7"])
|
41
37
|
end
|
42
38
|
else
|
43
|
-
s.add_dependency(%q<active_attr>, [">= 0.8.2"])
|
44
|
-
s.add_dependency(%q<activesupport>, [">= 3.2.15"])
|
45
39
|
s.add_dependency(%q<minitest>, [">= 5.0.0"])
|
46
40
|
s.add_dependency(%q<minitest-reporters>, [">= 1.0.0"])
|
47
41
|
s.add_dependency(%q<coveralls>, [">= 1.0.0"])
|
data/test/helper.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
|
-
# Disable warning message
|
4
|
-
require 'i18n'
|
5
|
-
I18n.enforce_available_locales = false
|
6
|
-
|
7
3
|
# Only run coverage in MRI
|
8
4
|
unless defined? Maglev
|
9
5
|
if ENV['CI']
|
@@ -16,6 +12,6 @@ unless defined? Maglev
|
|
16
12
|
end
|
17
13
|
|
18
14
|
require File.expand_path('lib/mem_model')
|
19
|
-
require
|
15
|
+
Dir[File.expand_path('../support/*.rb', __FILE__)].each { |file| require file }
|
20
16
|
gem 'minitest', '5.2.0'
|
21
17
|
require 'minitest/autorun'
|
data/test/mem_model/test_base.rb
CHANGED
@@ -3,7 +3,7 @@ require File.expand_path('../../helper', __FILE__)
|
|
3
3
|
class TestBase < Minitest::Test
|
4
4
|
class Account
|
5
5
|
include MemModel::Base
|
6
|
-
|
6
|
+
attr_accessor :balance
|
7
7
|
end
|
8
8
|
|
9
9
|
def setup
|
@@ -25,14 +25,14 @@ class TestBase < Minitest::Test
|
|
25
25
|
assert Account.exists? @account.id
|
26
26
|
end
|
27
27
|
|
28
|
-
def test_update
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
#def test_update
|
29
|
+
# @account.save
|
30
|
+
# new_balance = 314
|
31
|
+
# refute_equal new_balance, @account.balance
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
end
|
33
|
+
# Account.update @account.id, :balance => new_balance
|
34
|
+
# assert_equal new_balance, @account.balance
|
35
|
+
#end
|
36
36
|
|
37
37
|
def test_new_model_is_new_record
|
38
38
|
assert @account.new_record?
|
@@ -53,4 +53,45 @@ class TestBase < Minitest::Test
|
|
53
53
|
@account.save
|
54
54
|
assert_equal @account, Account.find(@account.id)
|
55
55
|
end
|
56
|
+
|
57
|
+
def test_size
|
58
|
+
assert Account.size.zero?
|
59
|
+
@account.save
|
60
|
+
assert_equal 1, Account.size
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_last
|
64
|
+
@account.save
|
65
|
+
assert_equal @account, Account.last
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_all
|
69
|
+
@account.save
|
70
|
+
assert_equal [@account], Account.all
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_abort
|
74
|
+
# no-op in MRI
|
75
|
+
assert @account.abort
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_commit
|
79
|
+
# no-op in MRI
|
80
|
+
assert @account.commit
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_delete
|
84
|
+
@account.save
|
85
|
+
refute Account.size.zero?
|
86
|
+
@account.delete
|
87
|
+
assert Account.size.zero?
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_maglev?
|
91
|
+
if defined? Maglev
|
92
|
+
assert @account.maglev?
|
93
|
+
else
|
94
|
+
refute @account.maglev?
|
95
|
+
end
|
96
|
+
end
|
56
97
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path('../../helper', __FILE__)
|
2
2
|
|
3
|
-
class
|
3
|
+
class TestRootedBase < Minitest::Test
|
4
4
|
class Account
|
5
5
|
include MemModel::RootedBase
|
6
6
|
end
|
@@ -31,4 +31,14 @@ class TestRootedStore < Minitest::Test
|
|
31
31
|
assert_equal MemModel, Account.root_container
|
32
32
|
end
|
33
33
|
end
|
34
|
+
|
35
|
+
def test_abort
|
36
|
+
# no-op in MRI
|
37
|
+
assert @account.abort
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_commit
|
41
|
+
# no-op in MRI
|
42
|
+
assert @account.commit
|
43
|
+
end
|
34
44
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../../helper', __FILE__)
|
2
|
+
|
3
|
+
class TestValidations < Minitest::Test
|
4
|
+
class Account
|
5
|
+
include MemModel::Base
|
6
|
+
attr_accessor :balance
|
7
|
+
validates_presence_of :balance
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@account = Account.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
@account = nil
|
16
|
+
Account.delete_all
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_presence
|
20
|
+
refute @account.valid?
|
21
|
+
@account.balance = 0
|
22
|
+
assert @account.valid?
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Lint
|
3
|
+
# == Active \Model \Lint \Tests
|
4
|
+
#
|
5
|
+
# You can test whether an object is compliant with the Active \Model API by
|
6
|
+
# including <tt>ActiveModel::Lint::Tests</tt> in your TestCase. It will
|
7
|
+
# include tests that tell you whether your object is fully compliant,
|
8
|
+
# or if not, which aspects of the API are not implemented.
|
9
|
+
#
|
10
|
+
# Note an object is not required to implement all APIs in order to work
|
11
|
+
# with Action Pack. This module only intends to provide guidance in case
|
12
|
+
# you want all features out of the box.
|
13
|
+
#
|
14
|
+
# These tests do not attempt to determine the semantic correctness of the
|
15
|
+
# returned values. For instance, you could implement <tt>valid?</tt> to
|
16
|
+
# always return true, and the tests would pass. It is up to you to ensure
|
17
|
+
# that the values are semantically meaningful.
|
18
|
+
#
|
19
|
+
# Objects you pass in are expected to return a compliant object from a call
|
20
|
+
# to <tt>to_model</tt>. It is perfectly fine for <tt>to_model</tt> to return
|
21
|
+
# +self+.
|
22
|
+
module Tests
|
23
|
+
|
24
|
+
# == Responds to <tt>to_key</tt>
|
25
|
+
#
|
26
|
+
# Returns an Enumerable of all (primary) key attributes
|
27
|
+
# or nil if <tt>model.persisted?</tt> is false. This is used by
|
28
|
+
# <tt>dom_id</tt> to generate unique ids for the object.
|
29
|
+
def test_to_key
|
30
|
+
assert model.respond_to?(:to_key), "The model should respond to to_key"
|
31
|
+
def model.persisted?() false end
|
32
|
+
assert model.to_key.nil?, "to_key should return nil when `persisted?` returns false"
|
33
|
+
end
|
34
|
+
|
35
|
+
# == Responds to <tt>to_param</tt>
|
36
|
+
#
|
37
|
+
# Returns a string representing the object's key suitable for use in URLs
|
38
|
+
# or +nil+ if <tt>model.persisted?</tt> is +false+.
|
39
|
+
#
|
40
|
+
# Implementers can decide to either raise an exception or provide a
|
41
|
+
# default in case the record uses a composite primary key. There are no
|
42
|
+
# tests for this behavior in lint because it doesn't make sense to force
|
43
|
+
# any of the possible implementation strategies on the implementer.
|
44
|
+
# However, if the resource is not persisted?, then <tt>to_param</tt>
|
45
|
+
# should always return +nil+.
|
46
|
+
def test_to_param
|
47
|
+
assert model.respond_to?(:to_param), "The model should respond to to_param"
|
48
|
+
def model.to_key() [1] end
|
49
|
+
def model.persisted?() false end
|
50
|
+
assert model.to_param.nil?, "to_param should return nil when `persisted?` returns false"
|
51
|
+
end
|
52
|
+
|
53
|
+
# == Responds to <tt>to_partial_path</tt>
|
54
|
+
#
|
55
|
+
# Returns a string giving a relative path. This is used for looking up
|
56
|
+
# partials. For example, a BlogPost model might return "blog_posts/blog_post"
|
57
|
+
def test_to_partial_path
|
58
|
+
assert model.respond_to?(:to_partial_path), "The model should respond to to_partial_path"
|
59
|
+
assert_kind_of String, model.to_partial_path
|
60
|
+
end
|
61
|
+
|
62
|
+
# == Responds to <tt>persisted?</tt>
|
63
|
+
#
|
64
|
+
# Returns a boolean that specifies whether the object has been persisted
|
65
|
+
# yet. This is used when calculating the URL for an object. If the object
|
66
|
+
# is not persisted, a form for that object, for instance, will route to
|
67
|
+
# the create action. If it is persisted, a form for the object will routes
|
68
|
+
# to the update action.
|
69
|
+
def test_persisted?
|
70
|
+
assert model.respond_to?(:persisted?), "The model should respond to persisted?"
|
71
|
+
assert_boolean model.persisted?, "persisted?"
|
72
|
+
end
|
73
|
+
|
74
|
+
# == \Naming
|
75
|
+
#
|
76
|
+
# Model.model_name must return a string with some convenience methods:
|
77
|
+
# <tt>:human</tt>, <tt>:singular</tt> and <tt>:plural</tt>. Check
|
78
|
+
# ActiveModel::Naming for more information.
|
79
|
+
def test_model_naming
|
80
|
+
assert model.class.respond_to?(:model_name), "The model should respond to model_name"
|
81
|
+
model_name = model.class.model_name
|
82
|
+
assert model_name.respond_to?(:to_str)
|
83
|
+
assert model_name.human.respond_to?(:to_str)
|
84
|
+
assert model_name.singular.respond_to?(:to_str)
|
85
|
+
assert model_name.plural.respond_to?(:to_str)
|
86
|
+
end
|
87
|
+
|
88
|
+
# == \Errors Testing
|
89
|
+
#
|
90
|
+
# Returns an object that implements [](attribute) defined which returns an
|
91
|
+
# Array of Strings that are the errors for the attribute in question.
|
92
|
+
# If localization is used, the Strings should be localized for the current
|
93
|
+
# locale. If no error is present, this method should return an empty Array.
|
94
|
+
def test_errors_aref
|
95
|
+
assert model.respond_to?(:errors), "The model should respond to errors"
|
96
|
+
assert model.errors[:hello].is_a?(Array), "errors#[] should return an Array"
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
def model
|
101
|
+
assert @model.respond_to?(:to_model), "The object should respond to to_model"
|
102
|
+
@model.to_model
|
103
|
+
end
|
104
|
+
|
105
|
+
def assert_boolean(result, name)
|
106
|
+
assert result == true || result == false, "#{name} should be a boolean"
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
metadata
CHANGED
@@ -1,43 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mem_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JohnnyT
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: active_attr
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ! '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.8.2
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ! '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.8.2
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ! '>='
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 3.2.15
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ! '>='
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 3.2.15
|
41
13
|
- !ruby/object:Gem::Dependency
|
42
14
|
name: minitest
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -121,17 +93,22 @@ files:
|
|
121
93
|
- Rakefile
|
122
94
|
- lib/mem_model.rb
|
123
95
|
- lib/mem_model/base.rb
|
96
|
+
- lib/mem_model/concern.rb
|
97
|
+
- lib/mem_model/errors.rb
|
124
98
|
- lib/mem_model/guid.rb
|
99
|
+
- lib/mem_model/model_name.rb
|
125
100
|
- lib/mem_model/rooted_base.rb
|
126
|
-
- lib/mem_model/
|
101
|
+
- lib/mem_model/validations.rb
|
127
102
|
- lib/mem_model/version.rb
|
128
103
|
- mem_model.gemspec
|
129
104
|
- test/helper.rb
|
130
105
|
- test/mem_model/test_active_model.rb
|
131
106
|
- test/mem_model/test_base.rb
|
132
107
|
- test/mem_model/test_guid.rb
|
133
|
-
- test/mem_model/
|
134
|
-
- test/
|
108
|
+
- test/mem_model/test_rooted_base.rb
|
109
|
+
- test/mem_model/test_validations.rb
|
110
|
+
- test/mem_model/test_version.rb
|
111
|
+
- test/support/active_model_lint.rb
|
135
112
|
- .gemtest
|
136
113
|
homepage: https://github.com/johnnyt/mem_model
|
137
114
|
licenses:
|
@@ -160,8 +137,9 @@ signing_key:
|
|
160
137
|
specification_version: 4
|
161
138
|
summary: ActiveModel-compliant MagLev persistence
|
162
139
|
test_files:
|
140
|
+
- test/mem_model/test_rooted_base.rb
|
163
141
|
- test/mem_model/test_guid.rb
|
164
142
|
- test/mem_model/test_base.rb
|
165
|
-
- test/mem_model/test_rooted_store.rb
|
166
143
|
- test/mem_model/test_active_model.rb
|
167
|
-
- test/
|
144
|
+
- test/mem_model/test_validations.rb
|
145
|
+
- test/mem_model/test_version.rb
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module MemModel
|
2
|
-
PERSISTENT_ROOT = {} if !MemModel.maglev?
|
3
|
-
|
4
|
-
module RootedStore
|
5
|
-
def self.included(base)
|
6
|
-
base.send :extend, ClassMethods
|
7
|
-
end
|
8
|
-
|
9
|
-
module ClassMethods
|
10
|
-
def store_class
|
11
|
-
MemModel.maglev? ? IdentitySet : Set
|
12
|
-
end
|
13
|
-
|
14
|
-
def root_container
|
15
|
-
MemModel.maglev? ? Maglev : MemModel
|
16
|
-
end
|
17
|
-
|
18
|
-
def store
|
19
|
-
root[:MemModel] ||= {}
|
20
|
-
root[:MemModel][name] ||= store_class.new
|
21
|
-
end
|
22
|
-
|
23
|
-
def root
|
24
|
-
@root ||= root_container::PERSISTENT_ROOT
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|