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 +1 -0
- data/lib/medea/jasondb.rb +1 -0
- data/lib/medea/jasondeferredquery.rb +13 -17
- data/lib/medea/jasonlistproperty.rb +20 -13
- data/lib/medea/jasonobject.rb +12 -18
- data/lib/medea/version.rb +1 -1
- data/lib/testjdq.rb +1 -0
- data/lib/testjlp.rb +2 -1
- data/lib/testmeta.rb +1 -0
- data/lib/testsublist.rb +1 -1
- metadata +4 -4
    
        data/lib/medea.rb
    CHANGED
    
    
    
        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 | 
| 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  | 
| 9 | 
            -
                  self.type =  | 
| 10 | 
            -
                  self.filters =  | 
| 11 | 
            -
                   | 
| 12 | 
            -
             | 
| 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}=#{ | 
| 75 | 
            +
                              filter_array << URI.escape("#{name.to_s}=#{field}:#{i}", unsafe)
         | 
| 78 76 | 
             
                            end
         | 
| 79 77 | 
             
                          else
         | 
| 80 | 
            -
                            filter_array << "#{name.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 | 
            -
                         | 
| 127 | 
            -
                         | 
| 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 | 
            -
                   | 
| 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 | 
            -
                     | 
| 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 <<  | 
| 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
         | 
    
        data/lib/medea/jasonobject.rb
    CHANGED
    
    | @@ -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 | 
            -
             | 
| 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  | 
| 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
    
    
    
        data/lib/testjdq.rb
    CHANGED
    
    
    
        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 " | 
| 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
    
    
    
        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:  | 
| 4 | 
            +
              hash: 43
         | 
| 5 5 | 
             
              prerelease: false
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 8 | 
             
              - 2
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0.2. | 
| 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- | 
| 18 | 
            +
            date: 2011-01-06 00:00:00 +11:00
         | 
| 19 19 | 
             
            default_executable: 
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         |