medea 0.2.29 → 0.2.30

Sign up to get free protection for your applications and to get access to all the features.
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