medea 0.2.31 → 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.
- data/Rakefile +8 -1
- data/lib/medea/jasonlistproperty.rb +3 -3
- data/lib/medea/jasonobject.rb +18 -1
- data/lib/medea/version.rb +1 -1
- data/spec/jason_object_spec.rb +45 -0
- data/spec/list_properties_spec.rb +73 -0
- data/spec/spec_helper.rb +19 -0
- metadata +7 -9
- data/lib/test.rb +0 -31
- data/lib/testjdq.rb +0 -41
- data/lib/testjlp.rb +0 -31
- data/lib/testmeta.rb +0 -39
- data/lib/testsublist.rb +0 -46
data/Rakefile
CHANGED
@@ -79,7 +79,7 @@ module Medea
|
|
79
79
|
@state = :prefetch
|
80
80
|
end
|
81
81
|
|
82
|
-
def remove! member
|
82
|
+
def remove! member, cascade=false
|
83
83
|
raise RuntimeError, "You can only remove an item if you are accessing this list from an object." unless @parent.is_a? JasonObject
|
84
84
|
raise ArgumentError, "You can only remove #{@type.name} items from this collection!" unless member.is_a? @type
|
85
85
|
raise ArgumentError, "This item (#{member.jason_key}) doesn't exist in the list you're trying to remove it from!" unless self.include? member
|
@@ -87,11 +87,11 @@ module Medea
|
|
87
87
|
if @list_type == :value
|
88
88
|
member.jason_parent = nil
|
89
89
|
member.jason_parent_list = nil
|
90
|
-
member.
|
90
|
+
member.delete! if cascade
|
91
91
|
elsif @list_type == :reference
|
92
92
|
|
93
93
|
#send DELETE to JasonDB::db_auth_url/a_class.name/
|
94
|
-
url = "#{JasonDB::db_auth_url}#{@
|
94
|
+
url = "#{JasonDB::db_auth_url}#{@parent.class.name}/#{@parent.jason_key}/#{@list_name}/#{member.jason_key}"
|
95
95
|
|
96
96
|
response = RestClient.delete url
|
97
97
|
|
data/lib/medea/jasonobject.rb
CHANGED
@@ -80,6 +80,11 @@ module Medea
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
def ==(other)
|
84
|
+
return false if not other.is_a? JasonObject
|
85
|
+
jason_key == other.jason_key
|
86
|
+
end
|
87
|
+
|
83
88
|
#"flexihash" access interface
|
84
89
|
def []=(key, value)
|
85
90
|
@__jason_data ||= {}
|
@@ -219,7 +224,19 @@ module Medea
|
|
219
224
|
@__jason_state = :stale
|
220
225
|
end
|
221
226
|
|
222
|
-
def delete!
|
227
|
+
def delete! cascade=false
|
228
|
+
#TODO: Put this into some kind of async method or have JasonDB able to set flags on many records at once
|
229
|
+
#This will be REALLY REALLY slowww!
|
230
|
+
if cascade && (self.class.class_variable_defined? :@@lists)
|
231
|
+
@@lists.keys.each do |list_name|
|
232
|
+
#for each list that I have
|
233
|
+
list = send(list_name)
|
234
|
+
list.each do |item|
|
235
|
+
#remove each item from the list, deleting it if possible
|
236
|
+
list.remove! item, true
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
223
240
|
url = "#{JasonDB::db_auth_url}#{self.class.name}/#{self.jason_key}"
|
224
241
|
response = RestClient.delete url
|
225
242
|
raise "DELETE failed!" unless response.code == 201
|
data/lib/medea/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "JasonObject" do
|
4
|
+
before :each do
|
5
|
+
@user = User.new
|
6
|
+
end
|
7
|
+
|
8
|
+
after :each do
|
9
|
+
@user.delete!
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be comparable to other JasonObjects" do
|
13
|
+
@user.save!
|
14
|
+
(@user == User.new).should eq(false)
|
15
|
+
(@user == @user).should eq(true)
|
16
|
+
(@user == User.get_by_key(@user.jason_key, :lazy)).should eq(true)
|
17
|
+
(@user == User.get_by_key(@user.jason_key)).should eq(true)
|
18
|
+
(@user == "Hello world?").should eq(false)
|
19
|
+
(@user == @user.jason_key).should eq(false)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be persistable" do
|
23
|
+
@user.name = "Freddy"
|
24
|
+
@user.save!
|
25
|
+
|
26
|
+
@user.jason_state.should eq(:stale)
|
27
|
+
|
28
|
+
retrieved_user = User.get_by_key @user.jason_key
|
29
|
+
retrieved_user.name.should eq(@user.name)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should track it's state" do
|
33
|
+
@user.jason_state.should eq(:new)
|
34
|
+
@user.save!
|
35
|
+
@user.name = "Freddy"
|
36
|
+
@user.jason_state.should eq(:dirty)
|
37
|
+
@user.save!
|
38
|
+
@user.jason_state.should eq(:stale)
|
39
|
+
|
40
|
+
retrieved_user = User.get_by_key @user.jason_key, :lazy
|
41
|
+
retrieved_user.jason_state.should eq(:ghost)
|
42
|
+
retrieved_user.name
|
43
|
+
retrieved_user.jason_state.should eq(:stale)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "list properties" do
|
4
|
+
before :all do
|
5
|
+
@user_list = []
|
6
|
+
@user = User.new
|
7
|
+
@user_list << @user
|
8
|
+
(1..4).collect do |i|
|
9
|
+
other_user = User.new
|
10
|
+
other_user.name = "Automaton #{i}"
|
11
|
+
@user_list << other_user
|
12
|
+
@user.followees.add! other_user
|
13
|
+
m = Message.new
|
14
|
+
m.message = "Hello world! #automaton"
|
15
|
+
other_user.messages.add! m
|
16
|
+
end
|
17
|
+
|
18
|
+
["Hello? #user", "Is this thing on? #user", "I love Mondays! #user"].each do |m|
|
19
|
+
msg = Message.new
|
20
|
+
msg.message = m
|
21
|
+
@user.messages.add! msg
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
after :all do
|
27
|
+
@user_list.each do |user|
|
28
|
+
user.messages.each do |m|
|
29
|
+
user.remove! m, true
|
30
|
+
end
|
31
|
+
user.delete!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should add a method to the class" do
|
36
|
+
@user.respond_to?(:followees).should eq(true)
|
37
|
+
@user.respond_to?(:messages).should eq(true)
|
38
|
+
@user.respond_to?(:products).should eq(false)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return a JasonListProperty" do
|
42
|
+
@user.followees.is_a?(Medea::JasonListProperty).should eq(true)
|
43
|
+
@user.messages.is_a?(Medea::JasonListProperty).should eq(true)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should resolve to objects" do
|
47
|
+
@user.followees.each do |f|
|
48
|
+
f.is_a?(Medea::JasonObject).should eq(true)
|
49
|
+
end
|
50
|
+
|
51
|
+
@user.messages.each do |m|
|
52
|
+
m.is_a?(Medea::JasonObject).should eq(true)
|
53
|
+
m.message.should include("#user")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should resolve sub-lists" do
|
58
|
+
@user.followees.messages.is_a?(Medea::JasonListProperty).should eq(true)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should resolve items in a sub-list as objects" do
|
62
|
+
@user.followees.messages.each do |msg|
|
63
|
+
msg.is_a?(Medea::JasonObject).should eq(true)
|
64
|
+
msg.message.should include("#automaton")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should count correctly" do
|
69
|
+
@user.messages.count.should eq(3)
|
70
|
+
@user.followees.messages.count.should eq(4)
|
71
|
+
@user.followees.count.should eq(4)
|
72
|
+
end
|
73
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
$: << File.join(File.dirname(__FILE__), '/../lib')
|
2
|
+
require 'rspec'
|
3
|
+
require 'rspec/mocks'
|
4
|
+
require 'medea'
|
5
|
+
|
6
|
+
class Message < Medea::JasonObject
|
7
|
+
end
|
8
|
+
|
9
|
+
class User < Medea::JasonObject
|
10
|
+
has_many :followees, User
|
11
|
+
owns_many :messages, Message
|
12
|
+
end
|
13
|
+
|
14
|
+
#mock the db url
|
15
|
+
module JasonDB
|
16
|
+
def JasonDB::db_auth_url mode=:secure
|
17
|
+
"https://michael:password@rest.jasondb.com/medea-test/"
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: medea
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Michael Jensen
|
@@ -98,12 +98,10 @@ files:
|
|
98
98
|
- lib/medea/jasonobject.rb
|
99
99
|
- lib/medea/list_properties.rb
|
100
100
|
- lib/medea/version.rb
|
101
|
-
- lib/test.rb
|
102
|
-
- lib/testjdq.rb
|
103
|
-
- lib/testjlp.rb
|
104
|
-
- lib/testmeta.rb
|
105
|
-
- lib/testsublist.rb
|
106
101
|
- medea.gemspec
|
102
|
+
- spec/jason_object_spec.rb
|
103
|
+
- spec/list_properties_spec.rb
|
104
|
+
- spec/spec_helper.rb
|
107
105
|
has_rdoc: true
|
108
106
|
homepage: ""
|
109
107
|
licenses: []
|
data/lib/test.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
$: << "~/Projects/Medea/lib"
|
2
|
-
require 'rubygems'
|
3
|
-
require 'medea'
|
4
|
-
|
5
|
-
class Person < Medea::JasonObject
|
6
|
-
end
|
7
|
-
|
8
|
-
mikey = Person.new
|
9
|
-
puts "state: #{mikey.jason_state}"
|
10
|
-
mikey.name = "Michael"
|
11
|
-
mikey.age = 21
|
12
|
-
mikey.location = {:longitude => -30.123213, :latitude => 130.1231458}
|
13
|
-
puts mikey.jason_key
|
14
|
-
puts mikey.to_json
|
15
|
-
mikey.save!
|
16
|
-
|
17
|
-
puts "state: #{mikey.jason_state}"
|
18
|
-
|
19
|
-
puts "Changing name => Bob"
|
20
|
-
mikey.name = "Bob"
|
21
|
-
|
22
|
-
puts "state: #{mikey.jason_state}"
|
23
|
-
puts mikey.to_json
|
24
|
-
mikey.save!
|
25
|
-
puts "state: #{mikey.jason_state}"
|
26
|
-
|
27
|
-
puts "Enter a Person key to retrieve: "
|
28
|
-
id = gets.strip
|
29
|
-
|
30
|
-
person = Person.new id
|
31
|
-
puts person.to_json
|
data/lib/testjdq.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
$: << "~/Projects/Medea/lib"
|
2
|
-
require 'rubygems'
|
3
|
-
require 'medea'
|
4
|
-
|
5
|
-
class Person < Medea::JasonObject
|
6
|
-
end
|
7
|
-
|
8
|
-
class Company < Medea::JasonObject
|
9
|
-
has_many :employees, Person
|
10
|
-
end
|
11
|
-
|
12
|
-
puts "Lets make a person!"
|
13
|
-
p = Person.new
|
14
|
-
puts "Name?"
|
15
|
-
p.name = gets.strip
|
16
|
-
puts "Age?"
|
17
|
-
p.age = gets.strip.to_i
|
18
|
-
puts "OK - Saving"
|
19
|
-
p.save!
|
20
|
-
|
21
|
-
puts "", "Lets make a company!"
|
22
|
-
c = Company.new
|
23
|
-
puts "Name?"
|
24
|
-
c.name = gets.strip
|
25
|
-
puts "Address?"
|
26
|
-
c.address = gets.strip
|
27
|
-
puts "OK - Saving"
|
28
|
-
c.save!
|
29
|
-
|
30
|
-
puts "", "Making #{p.name} a member of #{c.name}"
|
31
|
-
c.employees.add! p
|
32
|
-
puts "OK - Saving"
|
33
|
-
p.save!
|
34
|
-
|
35
|
-
puts "", "Now querying for Persons that are members of #{c.name}"
|
36
|
-
r = c.employees
|
37
|
-
puts "Query: #{r.to_url}"
|
38
|
-
puts "Got #{r.count} items:"
|
39
|
-
r.each do |p|
|
40
|
-
puts p.name
|
41
|
-
end
|
data/lib/testjlp.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
$: << "~/Projects/Medea/lib"
|
2
|
-
require 'rubygems'
|
3
|
-
require 'medea'
|
4
|
-
|
5
|
-
class Person < Medea::JasonObject
|
6
|
-
has_many :followees, Person
|
7
|
-
end
|
8
|
-
|
9
|
-
p = Person.get_by_key "pa76b65a2-ba64-4cf0-8b37-7ad6a30ee8db"
|
10
|
-
|
11
|
-
puts p.followees.to_url
|
12
|
-
puts p.followees.count
|
13
|
-
|
14
|
-
puts "Let's make a new person!"
|
15
|
-
|
16
|
-
p1 = Person.new
|
17
|
-
puts "Name?"
|
18
|
-
p1.name = gets.strip
|
19
|
-
if p1.name != ""
|
20
|
-
puts "Saving..."
|
21
|
-
p1.save!
|
22
|
-
|
23
|
-
puts "Making #{p.name} follow #{p1.name}..."
|
24
|
-
p.followees.add! p1
|
25
|
-
end
|
26
|
-
puts "Done!"
|
27
|
-
list = p.followees
|
28
|
-
puts "#{p.name} now following #{list.count} users:"
|
29
|
-
list.each do |f|
|
30
|
-
puts " - #{f.jason_key}: #{f.name}\n"
|
31
|
-
end
|
data/lib/testmeta.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
$: << "~/Projects/Medea/lib"
|
2
|
-
require 'rubygems'
|
3
|
-
require 'medea'
|
4
|
-
|
5
|
-
class Message < Medea::JasonObject
|
6
|
-
end
|
7
|
-
|
8
|
-
class User < Medea::JasonObject
|
9
|
-
owns_many :messages, Message
|
10
|
-
end
|
11
|
-
|
12
|
-
puts "Enter an id, or blank to make a new user:"
|
13
|
-
id = gets.strip
|
14
|
-
if id == ""
|
15
|
-
u = User.new
|
16
|
-
puts "User's name?"
|
17
|
-
u.name = gets.strip
|
18
|
-
|
19
|
-
puts "Saving"
|
20
|
-
u.save!
|
21
|
-
else
|
22
|
-
u = User.get_by_key id
|
23
|
-
puts "#{u.name} has posted #{u.messages.count} messages"
|
24
|
-
end
|
25
|
-
|
26
|
-
while true
|
27
|
-
puts "Enter a message (blank to stop):"
|
28
|
-
message = gets.strip
|
29
|
-
break if message == ""
|
30
|
-
m = Message.new
|
31
|
-
m.message = message
|
32
|
-
m.from = u.name
|
33
|
-
u.messages.add! m
|
34
|
-
end
|
35
|
-
|
36
|
-
puts "Fetching messages..."
|
37
|
-
u.messages.each do |e|
|
38
|
-
puts " - #{e.message}\n"
|
39
|
-
end
|
data/lib/testsublist.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
$: << "~/Projects/Medea/lib"
|
2
|
-
require 'rubygems'
|
3
|
-
require 'medea'
|
4
|
-
|
5
|
-
class Message < Medea::JasonObject; end
|
6
|
-
|
7
|
-
class User < Medea::JasonObject
|
8
|
-
owns_many :messages, Message
|
9
|
-
has_many :followees, User
|
10
|
-
end
|
11
|
-
|
12
|
-
u1 = User.new
|
13
|
-
u1.name = "Fred"
|
14
|
-
u1.save!
|
15
|
-
|
16
|
-
u2 = User.new
|
17
|
-
u2.name = "George"
|
18
|
-
u2.save!
|
19
|
-
|
20
|
-
u1.followees.add! u2
|
21
|
-
u1.followees.add! u1
|
22
|
-
|
23
|
-
m1 = Message.new
|
24
|
-
m1.from = u2.name
|
25
|
-
m1.message = "Hello! This is George"
|
26
|
-
u2.messages.add! m1
|
27
|
-
|
28
|
-
m3 = Message.new
|
29
|
-
m3.from = u1.name
|
30
|
-
m3.message = "George sent me here, hope it's fun!"
|
31
|
-
u1.messages.add! m3
|
32
|
-
|
33
|
-
m2 = Message.new
|
34
|
-
m2.from = u2.name
|
35
|
-
m2.message = "Man, this is a long day!"
|
36
|
-
u2.messages.add! m2
|
37
|
-
|
38
|
-
puts "#{u2.name} has posted #{u2.messages.count} messages"
|
39
|
-
|
40
|
-
puts "#{u1.name} is following #{u1.followees.count} users"
|
41
|
-
puts "#{u1.name}'s timeline has #{u1.followees.messages.count} messages in it"
|
42
|
-
|
43
|
-
u1.followees.messages.each do |m|
|
44
|
-
puts "#{m.from}:"
|
45
|
-
puts " #{m.message}"
|
46
|
-
end
|