medea 0.2.29 → 0.2.30

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/lib/medea.rb CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
2
  module Medea
3
+ require 'rubygems'
3
4
  require 'medea/inheritable_attributes'
4
5
  require 'medea/active_model_methods'
5
6
  require 'medea/list_properties'
data/lib/medea/jasondb.rb CHANGED
@@ -2,6 +2,7 @@ module JasonDB
2
2
  #jason_url here doesn't include the http[s]:// part, but does include the domain and a trailing '/'
3
3
  #( so it's "rest.jasondb.com/<domain>/" )
4
4
  def JasonDB::db_auth_url mode=:secure
5
+ return "https://michael:password@rest.jasondb.com/medea-dev/"
5
6
  config = Rails.configuration.database_configuration[Rails.env]
6
7
 
7
8
  user = config["user"]
@@ -1,18 +1,15 @@
1
1
  module Medea
2
- class JasonDeferredQuery
2
+ class JasonDeferredQuery
3
3
  require 'rest_client'
4
4
  require 'uri'
5
5
 
6
6
  attr_accessor :time_limit, :result_format, :type, :time_limit, :state, :contents, :filters
7
7
 
8
- def initialize a_class, format=:search
9
- self.type = a_class
10
- self.filters = { :VERSION0 => nil }
11
- if self.type
12
- self.filters[:FILTER] = {:HTTP_X_CLASS => a_class.name.to_s}
13
- end
14
- self.result_format = format
15
- self.time_limit = 0
8
+ def initialize opts={}
9
+ self.type = opts[:class] if opts[:class]
10
+ self.filters = opts[:filters] if opts[:filters]
11
+ self.result_format = opts[:format] ? opts[:format] : :search
12
+ self.time_limit = opts[:time_limit] ? opts[:time_limit] : 0
16
13
  self.state = :prefetch
17
14
  self.contents = []
18
15
  end
@@ -62,9 +59,10 @@ module Medea
62
59
  def to_url
63
60
  url = "#{JasonDB::db_auth_url}@#{self.time_limit}.#{self.result_format}?"
64
61
  filter_array = []
62
+ unsafe = Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
65
63
  self.filters.each do |name, val|
66
64
  if not val
67
- filter_array << name.to_s
65
+ filter_array << URI.escape(name.to_s, unsafe)
68
66
  next
69
67
  else
70
68
  #FILTER's value is a hash (to avoid dupes)
@@ -74,10 +72,10 @@ module Medea
74
72
  val.each do |field ,value|
75
73
  if value.is_a? Array
76
74
  value.each do |i|
77
- filter_array << "#{name.to_s}=#{URI.escape(field)}:#{URI.escape(i)}"
75
+ filter_array << URI.escape("#{name.to_s}=#{field}:#{i}", unsafe)
78
76
  end
79
77
  else
80
- filter_array << "#{name.to_s}=#{URI.escape(field.to_s)}:#{URI.escape(value.to_s)}"
78
+ filter_array << URI.escape("#{name.to_s}=#{field.to_s}:#{value.to_s}", unsafe)
81
79
  end
82
80
  end
83
81
  end
@@ -112,7 +110,7 @@ module Medea
112
110
  end
113
111
  #end array interface
114
112
 
115
- def execute_query
113
+ def execute_query content=true
116
114
  #hit the URL
117
115
  #fill self.contents with :ghost versions of JasonObjects
118
116
  begin
@@ -123,10 +121,8 @@ module Medea
123
121
  result.keys.each do |k|
124
122
  if k =~ /^[0-9]+$/
125
123
  #this is a result! get the key
126
- /\/([^\/]*)\/([^\/]*)$/.match result[k]["POST_TO"]
127
- #$1 is the class name, $2 is the key
128
- item = type.new($2, :lazy)
129
- if result[k].has_key?("CONTENT") && result[k]["CONTENT"] != ""
124
+ item = type.new(result[k]["HTTP_X_KEY"], :lazy)
125
+ if content && result[k].has_key?("CONTENT") && result[k]["CONTENT"] != ""
130
126
  item.instance_variable_set(:@__jason_data, result[k]["CONTENT"])
131
127
  item.instance_variable_set(:@__jason_state, :stale)
132
128
  end
@@ -6,14 +6,18 @@ module Medea
6
6
  attr_accessor :list_name, :parent, :list_type
7
7
 
8
8
  def initialize parent, list_name, list_class, list_type
9
- @type = list_class
9
+ super :class => list_class,
10
+ :format => :search,
11
+ :filters => {
12
+ :VERSION0 => nil,
13
+ :FILTER => {:HTTP_X_LIST => list_name}}
14
+
15
+ self.filters[:FILTER][:HTTP_X_CLASS] = list_class.name if list_type == :value
10
16
  @list_name = list_name
11
- @list_type = list_type
12
17
  @parent = parent
13
- @result_format = :search
14
- @time_limit = 0
15
18
  @state = :prefetch
16
19
  @contents = []
20
+ @list_type = list_type
17
21
  end
18
22
 
19
23
  def method_missing name, *args, &block
@@ -39,11 +43,9 @@ module Medea
39
43
  member.jason_parent_list = @list_name
40
44
  elsif @list_type == :reference
41
45
 
42
- #post to JasonDB::db_auth_url/a_class.name/
43
- url = "#{JasonDB::db_auth_url}#{@type.name}/#{@parent.jason_key}/#{@list_name}/#{member.jason_key}"
46
+ url = "#{JasonDB::db_auth_url}#{@parent.class.name}/#{@parent.jason_key}/#{@list_name}/#{member.jason_key}"
44
47
  post_headers = {
45
48
  :content_type => 'application/json',
46
- "X-CLASS" => @list_name.to_s,
47
49
  "X-KEY" => member.jason_key,
48
50
  "X-PARENT" => @parent.jason_key,
49
51
  "X-LIST" => @list_name.to_s
@@ -106,26 +108,31 @@ module Medea
106
108
  @state = :prefetch
107
109
  end
108
110
 
111
+ def execute_query
112
+ #call super, but don't use the content to populate if this is a reference list
113
+ content = @list_type == :reference ? false : true
114
+ super content
115
+ end
116
+
117
+
109
118
  def to_url
110
119
  url = "#{JasonDB::db_auth_url}@#{@time_limit}.#{@result_format}?"
111
120
  params = ["VERSION0"]
112
-
113
- params << "FILTER=HTTP_X_CLASS:#{@list_name.to_s}"
121
+ params << "FILTER=HTTP_X_LIST:#{@list_name.to_s}"
114
122
 
115
123
  if @parent.is_a? JasonObject
116
124
  params << "FILTER=HTTP_X_PARENT:#{@parent.jason_key}"
117
125
  else # @parent.is_a? JasonListProperty ##(or DeferredQuery?)
118
126
  #we can get the insecure url here, because it will be resolved and executed at JasonDB - on a secure subnet.
119
127
 
120
- #subquery = "<%@LANGUAGE=\"URL\" #{@parent.to_url}%>"
121
128
  #puts " = Fetching subquery stupidly. (#{@parent.to_url})"
122
-
129
+ @parent.result_format = :keylist
123
130
  subquery = (RestClient.get @parent.to_url).strip
124
131
  #puts " = Result: #{subquery}"
125
- params << URI.escape("FILTER={HTTP_X_PARENT:#{subquery}}", Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
132
+ params << "FILTER={HTTP_X_PARENT:#{subquery}}"
126
133
  end
127
134
 
128
- url << params.join("&")
135
+ url << URI.escape(params.join("&"), Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
129
136
  end
130
137
  end
131
138
  end
@@ -24,7 +24,7 @@ module Medea
24
24
  #create a JasonDeferredQuery with no conditions, other than HTTP_X_CLASS=self.name
25
25
  #if mode is set to :eager, we create the JasonDeferredQuery, invoke it's execution and then return it
26
26
  def JasonObject.all(mode=:lazy)
27
- JasonDeferredQuery.new self
27
+ JasonDeferredQuery.new :class => self, :filters => {:FILTER => {:HTTP_X_CLASS => self}}
28
28
  end
29
29
 
30
30
  #returns the JasonObject by directly querying the URL
@@ -38,7 +38,8 @@ module Medea
38
38
  #find_by_<property>(value)
39
39
  #Will return a JasonDeferredQuery for this class with the appropriate data filter set
40
40
  def JasonObject.method_missing(name, *args, &block)
41
- q = JasonDeferredQuery.new self
41
+
42
+ q = all
42
43
  if name.to_s =~ /^members_of$/
43
44
  #use the type and key of the first arg (being a JasonObject)
44
45
  return q.members_of args[0]
@@ -57,7 +58,7 @@ module Medea
57
58
  #the resolve method takes a key and returns the JasonObject that has that key
58
59
  #This is useful when you have the key, but not the class
59
60
  def JasonObject.resolve(key, mode=:lazy)
60
- q = JasonDeferredQuery.new nil
61
+ q = JasonDeferredQuery.new :filters => {:FILTER => {:HTTP_X_KEY => key}}
61
62
  q.filters[:FILTER] ||= {}
62
63
  q.filters[:FILTER][:HTTP_X_KEY] = key
63
64
  resp = JSON.parse(RestClient.get(q.to_url))
@@ -183,7 +184,6 @@ module Medea
183
184
  payload = self.to_json
184
185
  post_headers = {
185
186
  :content_type => 'application/json',
186
-
187
187
  "X-KEY" => self.jason_key,
188
188
  "X-CLASS" => self.class.name
189
189
  #also want to add the eTag here!
@@ -194,12 +194,12 @@ module Medea
194
194
  if self.class.owned
195
195
  #the parent object needs to be defined!
196
196
  raise "#{self.class.name} cannot be saved without setting a parent and list!" unless self.jason_parent && self.jason_parent_list
197
- post_headers["X-PARENT"] = self.jason_parent.jason_key
198
- #url = "#{JasonDB::db_auth_url}#{self.jason_parent.class.name}/#{self.jason_parent.jason_key}/#{self.jason_parent_list}/#{self.jason_key}"
199
- post_headers["X-LIST"] = self.jason_parent_list
200
- #override the class to be the list name. Much simpler to search on.
201
- post_headers["X-CLASS"] = self.jason_parent_list
202
197
  end
198
+
199
+ post_headers["X-PARENT"] = self.jason_parent.jason_key if self.jason_parent
200
+ post_headers["X-LIST"] = self.jason_parent_list if self.jason_parent_list
201
+
202
+
203
203
  url = JasonDB::db_auth_url + self.class.name + "/" + self.jason_key
204
204
 
205
205
  #puts "Posted to JasonDB!"
@@ -241,15 +241,9 @@ module Medea
241
241
  url = "#{JasonDB::db_auth_url}@0.content?"
242
242
  params = [
243
243
  "VERSION0",
244
- "FILTER=HTTP_X_KEY:#{self.jason_key}"
245
- ]
246
-
247
- if not self.class.owned
248
- #if the class is owned, we don't want to filter by class name (X-CLASS will be the list name)
249
- #if it isn't owned, it is safe to filter by X-CLASS
250
- #if this item is "had" rather than owned, we MUST filter by class, otherwise we get the references.
251
- params << "FILTER=HTTP_X_CLASS:#{self.class.name}"
252
- end
244
+ "FILTER=HTTP_X_KEY:#{self.jason_key}",
245
+ "FILTER=HTTP_X_CLASS:#{self.class.name}"
246
+ ]
253
247
 
254
248
  url << params.join("&")
255
249
  #url = "#{JasonDB::db_auth_url}#{self.class.name}/#{self.jason_key}"
data/lib/medea/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Medea
2
- VERSION = "0.2.29"
2
+ VERSION = "0.2.30"
3
3
  end
data/lib/testjdq.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $: << "~/Projects/Medea/lib"
2
+ require 'rubygems'
2
3
  require 'medea'
3
4
 
4
5
  class Person < Medea::JasonObject
data/lib/testjlp.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  $: << "~/Projects/Medea/lib"
2
+ require 'rubygems'
2
3
  require 'medea'
3
4
 
4
5
  class Person < Medea::JasonObject
5
6
  has_many :followees, Person
6
7
  end
7
8
 
8
- p = Person.get_by_key "p6c75c02f-ed93-4ee8-9746-3603e915be23"
9
+ p = Person.get_by_key "pa76b65a2-ba64-4cf0-8b37-7ad6a30ee8db"
9
10
 
10
11
  puts p.followees.to_url
11
12
  puts p.followees.count
data/lib/testmeta.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $: << "~/Projects/Medea/lib"
2
+ require 'rubygems'
2
3
  require 'medea'
3
4
 
4
5
  class Message < Medea::JasonObject
data/lib/testsublist.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  $: << "~/Projects/Medea/lib"
2
+ require 'rubygems'
2
3
  require 'medea'
3
4
 
4
5
  class Message < Medea::JasonObject; end
@@ -17,7 +18,6 @@ u2.name = "George"
17
18
  u2.save!
18
19
 
19
20
  u1.followees.add! u2
20
- u1.followees.add! (User.get_by_key "p438639000")
21
21
  u1.followees.add! u1
22
22
 
23
23
  m1 = Message.new
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: 45
4
+ hash: 43
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 29
10
- version: 0.2.29
9
+ - 30
10
+ version: 0.2.30
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Jensen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-05 00:00:00 +11:00
18
+ date: 2011-01-06 00:00:00 +11:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency