gnoso-remote_entity 0.0.1

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.
@@ -0,0 +1,28 @@
1
+ module RemoteEntity
2
+ module EntityRecord
3
+
4
+ def self.included(base)
5
+ base.class_eval do
6
+ alias_method :old_to_xml, :to_xml
7
+ def to_xml(options = {})
8
+ if !options[:methods]
9
+ options[:methods] = [ :remote_entity_id ]
10
+ else
11
+ options[:methods] << :remote_entity_id
12
+ end
13
+
14
+ old_to_xml(options)
15
+ end
16
+ end
17
+ end
18
+
19
+ attr_accessor :remote_entity_id
20
+ def remote_entity_id
21
+ if id
22
+ return "#{RemoteEntity.service}-#{self.class.name.underscore.gsub("/", "_")}-#{id}"
23
+ else
24
+ return nil
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,97 @@
1
+ module RemoteEntity
2
+ module EntityRecord
3
+ module Assocations
4
+
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ def belongs_to_remote_entity(association_id, options = {})
11
+ if options[:class_name].nil?
12
+ options[:class_name] = association_id.to_s.camelize.to_sym
13
+ end
14
+
15
+ association_class =
16
+ Object.const_get(options[:class_name].to_sym)
17
+
18
+ define_accessible(association_id, options, association_class)
19
+ define_constructors(association_id, options, association_class)
20
+
21
+ if options[:dependent] == :destroy
22
+ define_destroy(association_id, options, association_class)
23
+ after_destroy "destroy_#{association_id}".to_sym
24
+ end
25
+ end
26
+
27
+ private
28
+ def define_accessible(association_id, options, association_class)
29
+
30
+
31
+ if !method_defined?("remote_entity_cache")
32
+ define_method("remote_entity_cache") do
33
+ @remote_entity_cache ||= {}
34
+ end
35
+ end
36
+ if !method_defined?("remote_entity_dirty_vals")
37
+ define_method("remote_entity_dirty_vals") do
38
+ @remote_entity_dirty_vals ||= {}
39
+ end
40
+ end
41
+
42
+ define_method("#{association_id.to_s}_remote_entity_object") do
43
+ service = association_class.service
44
+ resource = association_class.name.underscore
45
+
46
+ RemoteEntity.new(
47
+ self.send("#{association_id.to_s}_id").to_s)
48
+ end
49
+
50
+ define_method("#{association_id.to_s}".to_sym) do
51
+ if remote_entity_dirty_vals.has_key?(association_id)
52
+ remote_entity_dirty_vals[association_id]
53
+ elsif !self.send("#{association_id.to_s}_id").nil?
54
+ id = self.send("#{association_id.to_s}_remote_entity_object").id
55
+ remote_entity_cache[association_id] ||= association_class.find(id)
56
+ else
57
+ nil
58
+ end
59
+ end
60
+
61
+ define_method("#{association_id.to_s}=".to_sym) do |value|
62
+ remote_entity_cache[association_id] = nil
63
+
64
+ self.send("#{association_id.to_s}_id=", value.remote_entity_id)
65
+ remote_entity_dirty_vals[association_id] = value
66
+ end
67
+ end
68
+
69
+ def define_constructors(association_id, options, association_class)
70
+ define_method("build_#{association_id}") do |*params|
71
+ attributes = params.first
72
+
73
+ object = association_class.new(attributes)
74
+
75
+ self.send("#{association_id.to_s}=", object)
76
+ end
77
+
78
+ define_method("create_#{association_id}") do |*params|
79
+ attributes = params.first
80
+
81
+ object = association_class.new(attributes)
82
+ object.save
83
+
84
+ self.send("#{association_id}=", object)
85
+ end
86
+ end
87
+
88
+ def define_destroy(association_id, options, association_class)
89
+ define_method("destroy_#{association_id}") do
90
+ object = self.send("#{association_id}")
91
+ object.destroy
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,54 @@
1
+ require 'active_resource'
2
+
3
+ module RemoteEntity
4
+ class EntityResource < ActiveResource::Base
5
+
6
+ def initialize(attrs = {})
7
+ @@schema ||= []
8
+
9
+ attrs = HashWithIndifferentAccess.new(attrs)
10
+ @@schema.each do |attribute|
11
+ if !attrs.has_key?(attribute)
12
+ attrs[attribute] = nil
13
+ end
14
+ end
15
+ if !attrs.has_key?(:remote_entity_id)
16
+ attrs[:remote_entity_id] = nil
17
+ end
18
+
19
+ super(attrs)
20
+ end
21
+
22
+ # Defines methods for the following properties on every instance of this
23
+ # type that is created
24
+ def self.schema(*args)
25
+ @@schema = args
26
+ end
27
+
28
+ # Helps us set the site automatically.
29
+ def self.version=(version)
30
+ @@api_version = version
31
+ self.update_site
32
+ end
33
+
34
+ def self.version
35
+ return defined?(@@api_version) ? @@api_version : nil
36
+ end
37
+
38
+ # Helps us set the site automatically
39
+ def self.service=(service)
40
+ @@service = service
41
+ self.update_site
42
+ end
43
+
44
+ def self.service
45
+ return defined?(@@service) ? @@service : nil
46
+ end
47
+
48
+ private
49
+ def self.update_site
50
+ self.site = RemoteEntity.service_uri(self.service,
51
+ self.version)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,48 @@
1
+ module RemoteEntity
2
+ class RemoteEntity
3
+ attr_accessor :service
4
+ attr_accessor :resource
5
+ attr_accessor :id
6
+
7
+ # Constructs a new remote entity object.
8
+ def initialize(remote_entity_id)
9
+ parts = remote_entity_id.split('-', 3)
10
+ if parts.length != 3
11
+ raise "Entity id given is not a proper entity id"
12
+ end
13
+
14
+ self.service, self.resource, self.id = parts
15
+ end
16
+
17
+ # Returns the service uri for the given service at the given version
18
+ def self.service_uri(service, version)
19
+ return "#{lookup_service(service)[:uri]}/api/v#{version.to_s}/"
20
+ end
21
+
22
+ # Registers a service so that we can build urls from it. Holla!
23
+ def self.register_service(service_name, service_uri, service_api_key = "")
24
+ services[service_name.to_sym] = { :uri => service_uri,
25
+ :api_key => service_api_key }
26
+ end
27
+
28
+ def self.lookup_service(service)
29
+ result = services[service.to_sym]
30
+ raise "Service `#{service.to_s}` not found" if !result
31
+
32
+ return result
33
+ end
34
+
35
+ def self.service=(service)
36
+ @@service = service
37
+ end
38
+
39
+ def self.service
40
+ @@service ||= nil
41
+ end
42
+
43
+ private
44
+ def self.services
45
+ @@services ||= {}
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), 'remote_entity', 'remote_entity')
2
+ require File.join(File.dirname(__FILE__), 'remote_entity', 'entity_resource')
3
+ require File.join(File.dirname(__FILE__), 'remote_entity', 'entity_record')
4
+ require File.join(File.dirname(__FILE__), 'remote_entity',
5
+ 'entity_record_associations')
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gnoso-remote_entity
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gnoso, Inc.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-16 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activeresource
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "2.0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: activerecord
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "2.0"
34
+ version:
35
+ description: Remote Entity defines a pattern for working with REST services. It defines a versioning scheme, a remote entity identifier scheme, and adds some useful features to ActiveRecord and ActiveResource for working with those schemes.
36
+ email: alan@gnoso.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/remote_entity.rb
45
+ - lib/remote_entity/entity_record.rb
46
+ - lib/remote_entity/entity_record_associations.rb
47
+ - lib/remote_entity/entity_resource.rb
48
+ - lib/remote_entity/remote_entity.rb
49
+ has_rdoc: true
50
+ homepage: http://www.gnoso.com
51
+ licenses:
52
+ post_install_message:
53
+ rdoc_options: []
54
+
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.3.5
73
+ signing_key:
74
+ specification_version: 2
75
+ summary: Remote Entity defines a pattern for working with REST services.
76
+ test_files: []
77
+