kelredd-resourceful 0.2.0 → 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 CHANGED
@@ -37,7 +37,7 @@ Rake::TestTask.new do |t|
37
37
  end
38
38
 
39
39
  desc 'Generate the gemspec to serve this Gem from Github'
40
- task :github do
40
+ task :gemspec do
41
41
  file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
42
42
  File.open(file, 'w') {|f| f << spec.to_ruby }
43
43
  puts "Created gemspec: #{file}"
@@ -1,26 +1,22 @@
1
- Feature: Resource Models
1
+ Feature: Models
2
2
  In order to consume rest based resources
3
3
  As an object
4
- I want to define and initialize a model class from xml resource data
4
+ I want to define and initialize a model class from resource data
5
5
 
6
6
  Scenario: Get JSON user
7
- Given I have a configured resource host
8
- And I am user with the screen_name "kelredd"
7
+ Given I am user with the screen_name "kelredd"
9
8
  When I load my "Json" user model
10
9
  Then the result should be a valid User model
11
10
 
12
11
  Scenario: Get XML user
13
- Given I have a configured resource host
14
- And I am user with the screen_name "kelredd"
12
+ Given I am user with the screen_name "kelredd"
15
13
  When I load my "Xml" user model
16
14
  Then the result should be a valid User model
17
15
 
18
16
  Scenario: Get JSON status collection
19
- Given I have a configured resource host
20
17
  When I load the "Json" status "public_timeline"
21
18
  Then the result should be a collection of valid Status models
22
19
 
23
20
  Scenario: Get XML status collection
24
- Given I have a configured resource host
25
21
  When I load the "Xml" status "public_timeline"
26
22
  Then the result should be a collection of valid Status models
@@ -3,6 +3,33 @@ Feature: Get Resource
3
3
  As an object
4
4
  I want to get data from a web resource as a formatted object
5
5
 
6
+ Scenario: JSON Format definition
7
+ Given I want to use the json resource format
8
+ Then the format should be .json
9
+
10
+ Scenario: XML Format definition
11
+ Given I want to use the xml resource format
12
+ Then the format should be .xml
13
+
14
+ Scenario: Host not configured
15
+ Given I have no host server configured
16
+ Then resourceful should complain about a configuration error
17
+
18
+ Scenario: Host configured
19
+ Given I have a configured resource host
20
+ Then the host should be set
21
+
22
+ Scenario: Resource logger
23
+ Given I have a configured resource host set to log
24
+ Then verify the log settings
25
+
26
+ Scenario: Resource logging
27
+ Given I have a configured resource host set to log
28
+ When I get a json formatted resource
29
+ Then the set log file should exist
30
+
31
+
32
+
6
33
  Scenario: Get JSON resource
7
34
  Given I have a configured resource host
8
35
  When I get a json formatted resource
@@ -0,0 +1,84 @@
1
+ Given /^I want to use the (.+) resource format$/ do |format|
2
+ @format = Resourceful::Resource::Format.get(format)
3
+ end
4
+
5
+ Given /^I have no host server configured$/ do
6
+ @agent = Resourceful::Agent::RestClient.new
7
+ end
8
+
9
+ Given /^I have a configured resource host$/ do
10
+ @agent = Resourceful::Agent::RestClient.new(:host => RESOURCE_CONFIG[:host])
11
+ end
12
+
13
+ Given /^I have a configured resource host set to log$/ do
14
+ log_file = File.expand_path(RESOURCE_CONFIG[:log])
15
+ FileUtils.rm(log_file) if File.exists?(log_file)
16
+ @agent = Resourceful::Agent::RestClient.new(:host => RESOURCE_CONFIG[:host]) {
17
+ RESOURCE_CONFIG[:log]
18
+ }
19
+ end
20
+
21
+ Then /^the format should be \.(.+)$/ do |format|
22
+ assert_equal @format.to_s, format
23
+ end
24
+
25
+ Then /^the host should be set$/ do
26
+ assert_equal @agent.host, RESOURCE_CONFIG[:host]
27
+ end
28
+
29
+ Then /^resourceful should complain about a configuration error$/ do
30
+ assert_raise Resourceful::Exceptions::ConfigurationError do
31
+ @agent.get RESOURCE_CONFIG[:resource], :format => 'json', :params => RESOURCE_CONFIG[:params]
32
+ end
33
+ end
34
+
35
+ Then /^verify the log settings$/ do
36
+ assert_equal @agent.logger.outputters.detect{|out| out.respond_to?('filename')}.filename, RESOURCE_CONFIG[:log]
37
+ end
38
+
39
+ Then /^the set log file should exist$/ do
40
+ log_file = File.expand_path(RESOURCE_CONFIG[:log])
41
+ assert File.exists?(log_file)
42
+ FileUtils.rm(log_file) if File.exists?(log_file)
43
+ end
44
+
45
+
46
+
47
+
48
+ When /^I get a[n]* (.+) formatted resource$/ do |format|
49
+ @result = ResourcefulFeature::Helpers.safe_run_get do
50
+ @agent.get RESOURCE_CONFIG[:resource], :format => format, :params => RESOURCE_CONFIG[:params]
51
+ end
52
+ end
53
+
54
+ When /^I get a[n]* (.+) formatted implicitly resource$/ do |format|
55
+ @result = ResourcefulFeature::Helpers.safe_run_get do
56
+ @agent.get RESOURCE_CONFIG[:resource]+".#{format}", :params => RESOURCE_CONFIG[:params]
57
+ end
58
+ end
59
+
60
+ When /^I get a resource that does not exist$/ do
61
+ @result = ResourcefulFeature::Helpers.safe_run_get do
62
+ @agent.get '/unknown', :format => 'xml', :params => RESOURCE_CONFIG[:params]
63
+ end
64
+ end
65
+
66
+ Then /^the result should be a hash object$/ do
67
+ assert_kind_of Hash, @result.first
68
+ end
69
+
70
+ Then /^the result should be an xml object$/ do
71
+ assert_kind_of Nokogiri::XML::Document, @result
72
+ end
73
+
74
+ Then /^resourceful should complain about a format error$/ do
75
+ assert @result
76
+ assert_kind_of Resourceful::Exceptions::FormatError, @result
77
+ assert @result.message.length > 0
78
+ end
79
+
80
+ Then /^resourceful should complain about the resource not being found$/ do
81
+ assert @result
82
+ assert_kind_of RestClient::ResourceNotFound, @result
83
+ assert @result.message.length > 0
84
+ end
@@ -2,10 +2,13 @@ require 'test/unit/assertions'
2
2
  World(Test::Unit::Assertions)
3
3
 
4
4
  RESOURCE_CONFIG = {
5
- :host => 'twitter.com',
5
+ :host => 'http://twitter.com',
6
6
  :resource => '/statuses/public_timeline',
7
7
  :params => {},
8
8
  :log => "./test.log"
9
9
  }
10
10
 
11
11
  require File.dirname(__FILE__) + '/../../../lib/resourceful'
12
+
13
+ REST_CLIENT_TWITTER = Resourceful::Agent::RestClient.new(:host => RESOURCE_CONFIG[:host])
14
+
@@ -1,5 +1,7 @@
1
1
  class UserXml < Resourceful::Model::Xml
2
2
 
3
+ agent REST_CLIENT_TWITTER
4
+
3
5
  def self.find(screen_name, force=false)
4
6
  get("/users/#{screen_name}", {}, "//user")
5
7
  end
@@ -22,6 +24,8 @@ end
22
24
 
23
25
  class UserJson < Resourceful::Model::Json
24
26
 
27
+ agent REST_CLIENT_TWITTER
28
+
25
29
  def self.find(screen_name, force=false)
26
30
  get("/users/#{screen_name}", {})
27
31
  end
@@ -44,6 +48,8 @@ end
44
48
 
45
49
  class StatusXml < Resourceful::Model::Xml
46
50
 
51
+ agent REST_CLIENT_TWITTER
52
+
47
53
  def self.find(collection, force=false)
48
54
  get_collection("/statuses/#{collection}", {}, "//statuses/status")
49
55
  end
@@ -67,6 +73,8 @@ end
67
73
 
68
74
  class StatusJson < Resourceful::Model::Json
69
75
 
76
+ agent REST_CLIENT_TWITTER
77
+
70
78
  def self.find(collection, force=false)
71
79
  get_collection("/statuses/#{collection}", {})
72
80
  end
@@ -0,0 +1,34 @@
1
+ require 'log4r'
2
+ require File.join(File.dirname(__FILE__), '..', 'resource', 'cache.rb')
3
+
4
+ module Resourceful
5
+ module Agent
6
+ class Base
7
+
8
+ attr_reader :logger, :cache
9
+
10
+ def initialize(args={})
11
+ @cache = Resourceful::Resource::Cache.new
12
+ @logger = Log4r::Logger.new('Resourceful Base')
13
+ @logger.add(Log4r::StdoutOutputter.new('console'))
14
+ end
15
+
16
+ protected
17
+
18
+ def log(msg, level = :info) # :nodoc:
19
+ if(msg)
20
+ if @logger && @logger.respond_to?(level)
21
+ @logger.send(level.to_s, msg)
22
+ else
23
+ puts "** [#{level.to_s.upcase}]: #{msg}"
24
+ end
25
+ end
26
+ end
27
+
28
+ def log=(file)
29
+ @logger.add(Log4r::FileOutputter.new('fileOutputter', :filename => file, :trunc => false, :formatter => Log4r::PatternFormatter.new(:pattern => "[%l] %d :: %m"))) rescue nil
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,61 @@
1
+ require 'rest_client'
2
+ require File.join(File.dirname(__FILE__), '..', 'resource', 'format.rb')
3
+ require File.join(File.dirname(__FILE__), 'base.rb')
4
+
5
+ module Resourceful
6
+ module Agent
7
+ class RestClient < Resourceful::Agent::Base
8
+
9
+ ATTRS = [:host, :user, :password]
10
+ ATTRS.each { |a| attr_reader a }
11
+
12
+ def initialize(args={})
13
+ ATTRS.each { |a| instance_variable_set("@#{a.to_s}", args.delete(a)) }
14
+ super(args)
15
+ self.log = ::RestClient.log = yield if block_given?
16
+ @agent = ::RestClient::Resource.new(@host, :user => @user, :password => @password)
17
+ end
18
+
19
+ def get(path, opts={})
20
+ path, opts = check_config(path, opts)
21
+ format = Resourceful::Resource::Format.get(opts[:format])
22
+
23
+ full_resource_path = self.class.resource_path(path, format, opts[:params])
24
+ resource_summary = summary('get', full_resource_path)
25
+ cache_key = Resourceful::Resource::Cache.key(@host, 'get', full_resource_path)
26
+
27
+ if opts[:force] || (resp = cache.read(cache_key)).nil?
28
+ log "Resource call: #{resource_summary}"
29
+ resp = cache.write(cache_key, @agent[full_resource_path].get)
30
+ else
31
+ log "Resource call: [CACHE] #{resource_summary}"
32
+ end
33
+ format.build(resp)
34
+ end
35
+
36
+ protected
37
+
38
+ def check_config(path, opts)
39
+ raise Resourceful::Exceptions::ConfigurationError, "invalid RestClient agent" unless @agent && @agent.url
40
+ opts ||= {}
41
+ opts[:force] ||= false
42
+ if path =~ /^(.+)\.(.+)$/
43
+ path = $1
44
+ opts[:format] ||= $2
45
+ end
46
+ opts[:format] ||= Resourceful::Resource::Json.to_s
47
+ opts[:params] ||= {}
48
+ [path, opts]
49
+ end
50
+
51
+ def self.resource_path(path, format, params) # :nodoc:
52
+ "#{path}.#{format}#{params.to_http_query_str unless params.empty?}"
53
+ end
54
+
55
+ def summary(verb, full_resource_path) # :nodoc:
56
+ "#{verb.upcase} #{@agent.url}#{full_resource_path}"
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,3 @@
1
+ Dir[File.join(File.dirname(__FILE__), "agent" ,"*.rb")].each do |file|
2
+ require file
3
+ end
@@ -3,17 +3,16 @@ module Resourceful
3
3
 
4
4
  class Base
5
5
 
6
- # KDR: override this to have a per model Resource handler
7
- # => TODO: need to support creating resource instances first though
8
- def self.resource
9
- Resourceful::Resource
6
+ @@agent = nil
7
+ def self.agent(a)
8
+ @@agent = a
10
9
  end
11
10
 
12
- def self.get(path, opts={}, force=false)
13
- resource.get(path, opts, force)
11
+ def self.get(path, opts={})
12
+ @@agent.get(path, opts)
14
13
  end
15
- def self.get_collection(path, opts={}, force=false)
16
- (yield resource.get(path, opts, force)).collect{|data| new(data)}
14
+ def self.get_collection(path, opts={})
15
+ (yield @@agent.get(path, opts)).collect{|data| new(data)}
17
16
  end
18
17
 
19
18
  def initialize(data)
@@ -8,16 +8,18 @@ module Resourceful
8
8
  def self.get(path, params, force=false)
9
9
  opts = {
10
10
  :format => 'json',
11
- :params => params || {}
11
+ :params => params || {},
12
+ :force => force
12
13
  }
13
- new(super(path, opts, force))
14
+ new(super(path, opts))
14
15
  end
15
16
  def self.get_collection(path, params, force=false)
16
17
  opts = {
17
18
  :format => 'json',
18
- :params => params || {}
19
+ :params => params || {},
20
+ :force => force
19
21
  }
20
- super(path, opts, force) do |data|
22
+ super(path, opts) do |data|
21
23
  data
22
24
  end
23
25
  end
@@ -35,10 +37,7 @@ module Resourceful
35
37
 
36
38
  def attribute(config)
37
39
  paths = config[:path].to_s.split('/')
38
- paths.inject(@json) do |val,path|
39
- #raise Resourceful::Exceptions::AttributeError, "no matching attribute data for'#{config[:path]}'" if val.nil?
40
- val.fetch(path, nil) rescue nil
41
- end
40
+ paths.inject(@json) { |val,path| val.fetch(path, nil) rescue nil }
42
41
  end
43
42
 
44
43
 
@@ -8,16 +8,18 @@ module Resourceful
8
8
  def self.get(path, params, xpath, force=false)
9
9
  opts = {
10
10
  :format => 'xml',
11
- :params => params || {}
11
+ :params => params || {},
12
+ :force => force
12
13
  }
13
- new(super(path, opts, force).xpath(xpath))
14
+ new(super(path, opts).xpath(xpath))
14
15
  end
15
16
  def self.get_collection(path, params, xpath, force=false)
16
17
  opts = {
17
18
  :format => 'xml',
18
- :params => params || {}
19
+ :params => params || {},
20
+ :force => force
19
21
  }
20
- super(path, opts, force) do |data|
22
+ super(path, opts) do |data|
21
23
  data.xpath(xpath)
22
24
  end
23
25
  end
@@ -35,7 +37,6 @@ module Resourceful
35
37
 
36
38
  def attribute(config)
37
39
  node = get_node("./#{config[:path]}")
38
- #raise Resourceful::Exceptions::AttributeError, "no matching attribute data for'#{config[:path]}'" unless node
39
40
  node.content rescue nil
40
41
  end
41
42
 
@@ -2,44 +2,30 @@ module Resourceful
2
2
  module Resource
3
3
  class Cache
4
4
 
5
- @@cache = {}
6
-
7
- def self.clear(key=nil)
8
- if key
9
- @@cache[key] = nil
10
- else
11
- @@cache = {}
12
- end
13
- end
14
-
15
- def self.read(key)
16
- @@cache[key]
17
- end
5
+ attr_reader :store
18
6
 
19
- def self.write(key, value)
20
- @@cache[key] = value
7
+ def self.key(host, verb, resource)
8
+ "#{host}_#{verb}_#{resource}"
21
9
  end
22
10
 
23
- def self.key(server, verb, path, format, params)
24
- "#{server}_#{verb}_#{path}_#{format.to_s}_#{params.to_s}"
11
+ def initialize
12
+ @store = {}
25
13
  end
26
-
27
- attr_reader :key
28
-
29
- def initialize(server, verb, path, format, params)
30
- @key = self.class.key(server, verb, path, format, params)
31
- end
32
-
33
- def read
34
- self.class.read(@key)
14
+
15
+ def clear(key=nil)
16
+ if key
17
+ @store[key] = nil
18
+ else
19
+ @store = {}
20
+ end
35
21
  end
36
22
 
37
- def write(value)
38
- self.class.write(@key, value)
23
+ def read(key)
24
+ @store[key]
39
25
  end
40
26
 
41
- def clear
42
- self.class.clear(@key)
27
+ def write(key, value)
28
+ @store[key] = value
43
29
  end
44
30
 
45
31
  end
@@ -1,25 +1,3 @@
1
1
  Dir[File.join(File.dirname(__FILE__), "resource" ,"*.rb")].each do |file|
2
2
  require file
3
3
  end
4
-
5
- module Resourceful
6
- module Resource
7
-
8
- def self.configure(opts={}, &block)
9
- Resourceful::Resource::Base.configure(opts, &block)
10
- end
11
-
12
- def self.get(resource, opts={}, force=false)
13
- Resourceful::Resource::Base.get(resource, opts, force)
14
- end
15
-
16
- def self.host
17
- Resourceful::Resource::Base.host
18
- end
19
-
20
- def self.logger
21
- Resourceful::Resource::Base.logger
22
- end
23
-
24
- end
25
- end
@@ -2,7 +2,7 @@ module Resourceful
2
2
  module Version
3
3
 
4
4
  MAJOR = 0
5
- MINOR = 2
5
+ MINOR = 3
6
6
  TINY = 0
7
7
 
8
8
  def self.to_s # :nodoc:
data/lib/resourceful.rb CHANGED
@@ -1,7 +1,7 @@
1
- %w(rubygems nokogiri json rest_client log4r).each do |lib|
1
+ %w(rubygems nokogiri json log4r).each do |lib|
2
2
  require lib
3
3
  end
4
4
 
5
- %w(exceptions extensions resource model).each do |file|
5
+ %w(exceptions extensions resource agent model).each do |file|
6
6
  require File.join(File.dirname(__FILE__), 'resourceful', "#{file}.rb")
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kelredd-resourceful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -73,19 +73,20 @@ extra_rdoc_files:
73
73
  files:
74
74
  - README.rdoc
75
75
  - Rakefile
76
- - features/config_resource.feature
77
- - features/get_resource.feature
78
- - features/resource_models.feature
76
+ - features/models.feature
77
+ - features/rest_client.feature
79
78
  - features/step_definitions
80
- - features/step_definitions/resource_config_steps.rb
81
- - features/step_definitions/resource_get_steps.rb
82
- - features/step_definitions/resource_models_steps.rb
79
+ - features/step_definitions/model_steps.rb
80
+ - features/step_definitions/rest_client_steps.rb
83
81
  - features/step_definitions/support
84
82
  - features/step_definitions/support/env.rb
85
83
  - features/step_definitions/support/helpers.rb
86
84
  - features/step_definitions/support/models.rb
87
- - features/step_definitions/support/resources.rb
88
85
  - lib/resourceful
86
+ - lib/resourceful/agent
87
+ - lib/resourceful/agent/base.rb
88
+ - lib/resourceful/agent/rest_client.rb
89
+ - lib/resourceful/agent.rb
89
90
  - lib/resourceful/exceptions.rb
90
91
  - lib/resourceful/extensions.rb
91
92
  - lib/resourceful/model
@@ -94,7 +95,6 @@ files:
94
95
  - lib/resourceful/model/xml.rb
95
96
  - lib/resourceful/model.rb
96
97
  - lib/resourceful/resource
97
- - lib/resourceful/resource/base.rb
98
98
  - lib/resourceful/resource/cache.rb
99
99
  - lib/resourceful/resource/format.rb
100
100
  - lib/resourceful/resource.rb
@@ -1,29 +0,0 @@
1
- Feature: Config Resource
2
- In order to consume rest based resources
3
- As an user
4
- I want to configure Resourceful for a particular resource format and host
5
-
6
- Scenario: JSON Format definition
7
- Given I want to use the json resource format
8
- Then the format should be .json
9
-
10
- Scenario: XML Format definition
11
- Given I want to use the xml resource format
12
- Then the format should be .xml
13
-
14
- Scenario: Host not configured
15
- Given I have no host server configured
16
- Then resourceful should complain about a configuration error
17
-
18
- Scenario: Host configured
19
- Given I have a configured resource host
20
- Then the host should be set
21
-
22
- Scenario: Resource logger
23
- Given I have a configured resource host set to log
24
- Then verify the log settings
25
-
26
- Scenario: Resource logging
27
- Given I have a configured resource host set to log
28
- When I get a json formatted resource
29
- Then the set log file should exist
@@ -1,23 +0,0 @@
1
- Then /^the format should be \.(.+)$/ do |format|
2
- assert_equal @format.to_s, format
3
- end
4
-
5
- Then /^the host should be set$/ do
6
- assert_equal Resourceful::Resource.host, RESOURCE_CONFIG[:host]
7
- end
8
-
9
- Then /^resourceful should complain about a configuration error$/ do
10
- assert_raise Resourceful::Exceptions::ConfigurationError do
11
- Resourceful::Resource::Base.get RESOURCE_CONFIG[:resource], :format => 'json', :params => RESOURCE_CONFIG[:params]
12
- end
13
- end
14
-
15
- Then /^verify the log settings$/ do
16
- assert_equal Resourceful::Resource.logger.outputters.detect{|out| out.respond_to?('filename')}.filename, RESOURCE_CONFIG[:log]
17
- end
18
-
19
- Then /^the set log file should exist$/ do
20
- log_file = File.expand_path(RESOURCE_CONFIG[:log])
21
- assert File.exists?(log_file)
22
- FileUtils.rm(log_file) if File.exists?(log_file)
23
- end
@@ -1,37 +0,0 @@
1
- When /^I get a[n]* (.+) formatted resource$/ do |format|
2
- @result = ResourcefulFeature::Helpers.safe_run_get do
3
- Resourceful::Resource::Base.get RESOURCE_CONFIG[:resource], :format => format, :params => RESOURCE_CONFIG[:params]
4
- end
5
- end
6
-
7
- When /^I get a[n]* (.+) formatted implicitly resource$/ do |format|
8
- @result = ResourcefulFeature::Helpers.safe_run_get do
9
- Resourceful::Resource::Base.get RESOURCE_CONFIG[:resource]+".#{format}", :params => RESOURCE_CONFIG[:params]
10
- end
11
- end
12
-
13
- When /^I get a resource that does not exist$/ do
14
- @result = ResourcefulFeature::Helpers.safe_run_get do
15
- Resourceful::Resource::Base.get '/unknown', :format => 'xml', :params => RESOURCE_CONFIG[:params]
16
- end
17
- end
18
-
19
- Then /^the result should be a hash object$/ do
20
- assert_kind_of Hash, @result.first
21
- end
22
-
23
- Then /^the result should be an xml object$/ do
24
- assert_kind_of Nokogiri::XML::Document, @result
25
- end
26
-
27
- Then /^resourceful should complain about a format error$/ do
28
- assert @result
29
- assert_kind_of Resourceful::Exceptions::FormatError, @result
30
- assert @result.message.length > 0
31
- end
32
-
33
- Then /^resourceful should complain about the resource not being found$/ do
34
- assert @result
35
- assert_kind_of RestClient::ResourceNotFound, @result
36
- assert @result.message.length > 0
37
- end
@@ -1,20 +0,0 @@
1
- Given /^I want to use the (.+) resource format$/ do |format|
2
- @format = Resourceful::Resource::Format.get(format)
3
- end
4
-
5
- Given /^I have no host server configured$/ do
6
- Resourceful::Resource::Base.configure
7
- end
8
-
9
- Given /^I have a configured resource host$/ do
10
- Resourceful::Resource::Base.configure(:host => RESOURCE_CONFIG[:host])
11
- end
12
-
13
- Given /^I have a configured resource host set to log$/ do
14
- log_file = File.expand_path(RESOURCE_CONFIG[:log])
15
- FileUtils.rm(log_file) if File.exists?(log_file)
16
- Resourceful::Resource::Base.configure(:host => RESOURCE_CONFIG[:host]) {
17
- RESOURCE_CONFIG[:log]
18
- }
19
- end
20
-
@@ -1,84 +0,0 @@
1
- require 'rest_client'
2
- require 'log4r'
3
- require File.join(File.dirname(__FILE__), 'cache.rb')
4
- require File.join(File.dirname(__FILE__), 'format.rb')
5
- require File.join(File.dirname(__FILE__), '..', 'exceptions.rb')
6
-
7
- module Resourceful
8
- module Resource
9
- class Base
10
-
11
- @@host = nil
12
- @@logger = nil
13
-
14
- def self.configure(opts={})
15
- Resourceful::Resource::Cache.clear
16
- @@logger = Log4r::Logger.new('Resourceful Base')
17
- @@logger.add(Log4r::StdoutOutputter.new('console'))
18
- if block_given?
19
- log_file = yield
20
- @@logger.add(Log4r::FileOutputter.new('fileOutputter', :filename => log_file, :trunc => false, :formatter => Log4r::PatternFormatter.new(:pattern => "[%l] %d :: %m"))) rescue nil
21
- RestClient.log = log_file
22
- end
23
- @@host = opts[:host]
24
- end
25
-
26
- def self.host
27
- @@host
28
- end
29
-
30
- def self.logger
31
- @@logger
32
- end
33
-
34
- # KDR: returns the resource specified in hash form
35
- def self.get(path, opts={}, force=false)
36
- path, opts = check_config(path, opts)
37
- @@rest_client ||= ::RestClient::Resource.new("http://#{@@host}")
38
- format = Resourceful::Resource::Format.get(opts[:format])
39
- request_summary = summary('get', path, format, opts[:params])
40
- cache = Resourceful::Resource::Cache.new(@@host, 'get', path, format, opts[:params])
41
-
42
- if force || (resp = cache.read).nil?
43
- log "Resource call: #{request_summary}"
44
- resp = cache.write(@@rest_client[rest_path(path, format, opts[:params])].get)
45
- else
46
- log "Resource call: [CACHE] #{request_summary}"
47
- end
48
- format.build(resp)
49
- end
50
-
51
- private
52
-
53
- def self.summary(verb, path, format, params) # :nodoc:
54
- "#{verb.upcase} #{@@rest_client.url}#{rest_path(path, format, params)}"
55
- end
56
-
57
- def self.rest_path(path, format, params) # :nodoc:
58
- "#{path}.#{format}#{params.to_http_query_str unless params.empty?}"
59
- end
60
-
61
- def self.check_config(path, opts)
62
- raise Resourceful::Exceptions::ConfigurationError, "please configure a host for Resourceful resources" unless @@host
63
- if path =~ /^(.+)\.(.+)$/
64
- path = $1
65
- opts[:format] ||= $2
66
- end
67
- opts[:format] ||= Resourceful::Resource::Json.to_s
68
- opts[:params] ||= {}
69
- [path, opts]
70
- end
71
-
72
- def self.log(msg, level = :info) # :nodoc:
73
- if(msg)
74
- if @@logger && @@logger.respond_to?(level)
75
- @@logger.send(level.to_s, msg)
76
- else
77
- puts "** [#{level.to_s.upcase}]: #{msg}"
78
- end
79
- end
80
- end
81
-
82
- end
83
- end
84
- end