highrise 1.2.0 → 2.0.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/CHANGELOG CHANGED
@@ -1,3 +1,43 @@
1
+ Author: Kenneth Mayer <kmayer@bitwrangler.com>
2
+ Date: Wed Feb 17 09:42:25 2010 -1000
3
+
4
+ Version bump to 2.0.0 -- Complete rewrite of Cachable. Interface has changed, see docs and examples.
5
+
6
+ Author: Kenneth Mayer <kmayer@bitwrangler.com>
7
+ Date: Mon Feb 15 13:41:28 2010 -1000
8
+
9
+ Version bump to 1.2.0
10
+
11
+ Added Account class to handle the /account.xml end point.
12
+
13
+ Author: Marcos Tapajós <tapajos@gmail.com>
14
+ Date: Wed Feb 10 22:57:34 2010 -0200
15
+
16
+ Version bump to 1.1.0 -- Added Deal class, .add_note helper, /me.xml endpoint
17
+
18
+ Author: Kenneth Mayer <kmayer@bitwrangler.com>
19
+ Date: Wed Sep 2 08:56:42 2009 -1000
20
+
21
+ Version bump to 1.0.1
22
+
23
+ Added a couple of convenience methods.
24
+
25
+ Author: Kenneth Mayer <kmayer@bitwrangler.com>
26
+ Date: Tue Sep 1 21:32:19 2009 -1000
27
+
28
+ Version bump to 1.0.0
29
+
30
+ Revised Taggable interface to support new tag API from 37Sigs and (removed curl dependencies)
31
+
32
+ Refactored Cachable
33
+
34
+ Author: Kenneth Mayer <kmayer@bitwrangler.com>
35
+ Date: Fri May 29 22:34:03 2009 -1000
36
+
37
+ Version bump to 0.13.0
38
+
39
+ Added Tag.find_by_name
40
+
1
41
  2009-05-27 Ken Mayer <kmayer@bitwrangler.com>
2
42
 
3
43
  * Version 0.12.0
@@ -84,8 +124,8 @@
84
124
  * Add Person.tag that show a array of tags, and Perton.tag(name), add a new
85
125
  tag to a person.
86
126
 
87
- 2009-01-14 tapajos
127
+ 2009-01-14 Marcos Tapajós
88
128
 
89
129
  * Version 0.5.0
90
130
 
91
- * Initial import
131
+ * Initial import
data/README.mkdn CHANGED
@@ -1,4 +1,4 @@
1
- # Highrise (1.2.0)
1
+ # Highrise (2.0.0)
2
2
 
3
3
  ## What is it?
4
4
 
@@ -28,7 +28,7 @@ All these classes are inherited from ActiveResouce::Base. Refer to the [ActiveRe
28
28
 
29
29
  and, if you want [caching][c]:
30
30
 
31
- Highrise::Base.cache_store= <your normal ActiveSupport::Caching options>
31
+ Highrise::Base.connection.cache_store= <your normal ActiveSupport::Caching options>
32
32
 
33
33
  If you are using this in a Rails application, putting this code in a config/initializers/highrise.rb
34
34
  file is recommended. See config_initializers_highrise.rb in the examples/ directory.
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rake'
2
4
  require 'rubygems'
3
5
  require 'rake/rdoctask'
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :patch: 0
3
- :major: 1
4
- :minor: 2
3
+ :major: 2
4
+ :minor: 0
5
5
  :build:
@@ -7,6 +7,6 @@ if Rails.env != 'test' then
7
7
  Highrise::Base.site = 'https://my_fancy_auth_token@example.com.i'
8
8
  end
9
9
  # The cache store can be anything that ActiveSupport can handle
10
- Highrise::Base.cache_store = ActiveSupport::Cache.lookup_store :mem_cache_store
11
- Highrise::Base.store_options = { :expires_in => 60.seconds }
10
+ Highrise::Base.connection.cache_store = ActiveSupport::Cache.lookup_store :mem_cache_store
11
+ Highrise::Base.connection.store_options = { :expires_in => 60.seconds }
12
12
  end
data/examples/sample.rb CHANGED
@@ -3,7 +3,7 @@ require 'pp'
3
3
 
4
4
  Highrise::Base.site = 'https://yoursite.highrisehq.com'
5
5
  Highrise::Base.user = 'xxx'
6
- Highrise::Base.cache_store = :memory_store
6
+ Highrise::Base.connection.cache_store = :memory_store
7
7
 
8
8
  @tags = Highrise::Tag.find(:all)
9
9
 
data/lib/cachable.rb CHANGED
@@ -7,10 +7,8 @@
7
7
  #
8
8
  # require 'cachable'
9
9
  #
10
- # module CachedResource
11
- # class Base < ActiveResource::Base
12
- # include ::Cachable
13
- # end
10
+ # module CachedResource < ActiveResource::Base
11
+ # include ::Cachable
14
12
  # end
15
13
  #
16
14
  #
@@ -21,68 +19,65 @@
21
19
  # these stores
22
20
  #
23
21
  # === Configuration examples ('off' is the default):
24
- # CachedResource.cache_store = ActiveSupport::Cache.lookup_store :memory_store
25
- # CachedResource.cache_store = ActiveSupport::Cache.lookup_store :file_store, "/path/to/cache/directory"
26
- # CachedResource.cache_store = ActiveSupport::Cache.lookup_store :drb_store, "druby://localhost:9192"
27
- # CachedResource.cache_store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost"
28
- # CachedResource.cache_store = MyOwnStore.new("parameter")
22
+ # CachedResource.connection.cache_store = ActiveSupport::Cache.lookup_store :memory_store
23
+ # CachedResource.connection.cache_store = ActiveSupport::Cache.lookup_store :file_store, "/path/to/cache/directory"
24
+ # CachedResource.connection.cache_store = ActiveSupport::Cache.lookup_store :drb_store, "druby://localhost:9192"
25
+ # CachedResource.connection.cache_store = ActiveSupport::Cache.lookup_store :mem_cache_store, "localhost"
26
+ # CachedResource.connection.cache_store = MyOwnStore.new("parameter")
29
27
  #
30
28
  # === If you are using a store that has write options, you can set them
31
- # CachedResource.store_options = { :expires_in => 60.seconds }
29
+ # CachedResource.connection.cache_options = { :expires_in => 60.seconds }
32
30
  #
33
31
  # Note: To ensure that caching is turned off, set CachedResource.connection.cache_store = nil
34
32
  #
35
- # FYI: You can use this with *any* active resource interface, not just Highrise.
33
+ # FYI: You can use this with *any* active resource class, not just Highrise.
36
34
 
37
35
  module Cachable
38
36
  def self.included(base)
39
- base.extend ClassMethods
40
- base.class_eval do
41
- class << self
42
- alias_method_chain :find_every, :cache
43
- alias_method_chain :find_single, :cache
37
+ ActiveResource::Connection.class_eval do
38
+ def cache_store
39
+ @cache_store ||= nil
44
40
  end
45
- end
46
- end
47
-
48
- module ClassMethods
49
- attr_writer :cache_store, :store_options
50
-
51
- def cache_store
52
- @cache_store ||= nil
53
- end
54
-
55
- def store_options
56
- @store_options ||= {}
57
- end
58
-
59
- def is_caching?
60
- !@cache_store.nil?
61
- end
62
-
63
- private
64
-
65
- # A little hacky -- we need to intercept the finds, but not get too deep inside the connection
66
- def find_every_with_cache(options)
67
- return find_every_without_cache(options) unless is_caching?
68
- prefix_options, query_options = split_options(options[:params])
69
- path = collection_path(prefix_options, query_options)
70
- fetch(path) { find_every_without_cache(options)}
71
- end
72
-
73
- def find_single_with_cache(scope, options)
74
- return find_single_without_cache(scope, options) unless is_caching?
75
- prefix_options, query_options = split_options(options[:params])
76
- path = element_path(scope, prefix_options, query_options)
77
- fetch(path) { find_single_without_cache(scope, options)}
78
- end
79
41
 
80
- def cache_key(*args)
81
- args.join('/')
82
- end
42
+ def cache_store=(store)
43
+ @cache_store = store
44
+ end
45
+
46
+ def cache_options
47
+ @cache_options ||= {}
48
+ end
49
+ alias :store_options :cache_options
50
+
51
+ def cache_options=(options)
52
+ @cache_options = options
53
+ end
54
+ alias :store_options= :cache_options=
55
+
56
+ def is_caching?
57
+ !@cache_store.nil?
58
+ end
59
+
60
+ def get_with_cache(path, headers = {})
61
+ return get_without_cache(path, headers) unless is_caching?
62
+ cache_store.fetch(cache_key(path), cache_options) {get_without_cache(path, headers)}
63
+ end
64
+ alias_method_chain :get, :cache
83
65
 
84
- def fetch(args, &block)
85
- cache_store.fetch(cache_key(args), store_options, &block).dup
66
+ def put_with_cache(path, body = '', headers = {})
67
+ cache_store.delete(cache_key(path))
68
+ put_without_cache(path, body, headers)
69
+ end
70
+ alias_method_chain :put, :cache
71
+
72
+ def delete_with_cache(path, headers = {})
73
+ cache_store.delete(cache_key(path))
74
+ delete_without_cache(path, headers)
75
+ end
76
+ alias_method_chain :delete, :cache
77
+
78
+ def cache_key(*args)
79
+ args.join(':')
80
+ end
86
81
  end
87
- end
82
+ end
88
83
  end
data/lib/highrise/tag.rb CHANGED
@@ -1,25 +1,12 @@
1
1
  module Highrise
2
- class Tag < Base
3
- @cache = self.cache_store || ActiveSupport::Cache::MemoryStore.new
4
-
2
+ class Tag < Base
5
3
  def ==(object)
6
4
  (object.instance_of?(self.class) && object.id == self.id && object.name == self.name)
7
5
  end
8
6
 
9
- class << self
10
- # This find(:all) is very expensive, so cache all tags, once.
11
- def find_by_name(arg)
12
- @cache.fetch(to_key([self.to_s, arg])) {
13
- tags = self.find(:all).each{|tag| @cache.write(to_key([self.to_s, tag.name]), tag)}
14
- tags.find{|tag| tag.name == arg}
15
- }
16
- end
17
-
18
- private
19
-
20
- def to_key(*args)
21
- args.join('/')
22
- end
7
+ # You can't find :one because that finds all *objects* with that tag
8
+ def self.find_by_name(arg)
9
+ tags = self.find(:all).detect{|tag| tag.name == arg}
23
10
  end
24
11
  end
25
12
  end
@@ -1,66 +1,84 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
- describe Highrise::Base, "class configuration" do
3
+ class CachedResource < ActiveResource::Base
4
+ include ::Cachable
5
+ end
6
+
7
+ describe CachedResource, "class configuration" do
4
8
  before(:each) do
5
- Highrise::Base.site = 'http://example.com.i:3000'
9
+ CachedResource.site = 'http://example.com.i:3000'
6
10
  end
7
11
 
8
12
  it "should tell us if caching is active" do
9
- Highrise::Base.cache_store = ActiveSupport::Cache.lookup_store :memory_store
10
- Highrise::Base.is_caching?.should == true
13
+ CachedResource.connection.cache_store = ActiveSupport::Cache.lookup_store :memory_store
14
+ CachedResource.connection.is_caching?.should == true
11
15
  end
12
16
 
13
17
  it "should tell us if caching is not active" do
14
- Highrise::Base.cache_store = nil
15
- Highrise::Base.is_caching?.should == false
18
+ CachedResource.connection.cache_store = nil
19
+ CachedResource.connection.is_caching?.should == false
16
20
  end
17
21
  end
18
22
 
19
- describe Highrise::Base do
23
+ describe CachedResource do
20
24
  before(:all) do
21
- Highrise::Base.site = 'http://example.com.i:3000'
22
- Highrise::Base.cache_store = ActiveSupport::Cache.lookup_store :memory_store
25
+ CachedResource.site = 'http://example.com.i:3000'
26
+ CachedResource.connection.cache_store = ActiveSupport::Cache.lookup_store :memory_store
23
27
  end
24
28
 
25
29
  after(:all) do
26
- Highrise::Base.cache_store = :none
30
+ CachedResource.connection.cache_store = :none
27
31
  end
28
32
 
29
33
  before(:each) do
30
- @thing = Highrise::Base.new
34
+ @thing = CachedResource.new(:id => 1)
31
35
  @key = :key
32
- Highrise::Base.stub!(:cache_key).and_return(@key)
36
+ CachedResource.connection.stub!(:cache_key).and_return(@key)
33
37
  end
34
38
 
35
39
  context "when a cached response is available" do
36
40
  before(:each) do
37
- Highrise::Base.cache_store.write(@key, @thing)
41
+ CachedResource.connection.cache_store.write(@key, @thing.attributes)
38
42
  end
39
43
 
40
44
  it "should NOT make a request to the RESTful server" do
41
- Highrise::Base.should_not_receive(:find_single_without_cache)
42
- Highrise::Base.find(1)
45
+ CachedResource.connection.should_not_receive(:get_without_cache)
46
+ CachedResource.find(1)
43
47
  end
44
48
 
45
49
  it "should read from the cache" do
46
- Highrise::Base.find(1).should == @thing
50
+ CachedResource.find(1).should == @thing
51
+ end
52
+
53
+ it "should delete from the cache when an object is DELETEd" do
54
+ CachedResource.connection.should_receive(:delete_without_cache)
55
+ CachedResource.delete(1)
56
+ CachedResource.connection.cache_store.read(@key).should == nil
57
+ end
58
+
59
+ it "should delete from the cache when an object is modified" do
60
+ thing = CachedResource.find(1)
61
+ thing.stub(:load_attributes_from_response).and_return(@thing.attributes)
62
+ CachedResource.connection.should_receive(:put_without_cache)
63
+ thing.save
64
+ CachedResource.connection.cache_store.read(@key).should == nil
47
65
  end
48
66
  end
49
67
 
50
68
  context "when a cached response is NOT available" do
51
69
  before(:each) do
52
- Highrise::Base.cache_store.delete(@key)
70
+ CachedResource.connection.cache_store.delete(@key)
53
71
  end
54
72
 
55
- it "SHOULD perform an ARes request" do
56
- Highrise::Base.should_receive(:find_single_without_cache).and_return(@thing)
57
- Highrise::Base.find(1)
73
+ it "SHOULD perform an ActiveResource request" do
74
+ CachedResource.connection.should_receive(:get_without_cache).and_return(@thing.attributes)
75
+ CachedResource.find(1)
58
76
  end
59
77
 
60
78
  it "should cache the response using the caching key" do
61
- Highrise::Base.should_receive(:find_single_without_cache).and_return(@thing)
62
- Highrise::Base.find(1)
63
- Highrise::Base.cache_store.read(@key).should == @thing
79
+ CachedResource.connection.should_receive(:get_without_cache).and_return(@thing.attributes)
80
+ CachedResource.find(1)
81
+ CachedResource.connection.cache_store.read(@key).should == @thing.attributes
64
82
  end
65
83
  end
66
84
  end
@@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/../spec_helper'
3
3
  describe Highrise::Note do
4
4
 
5
5
  before(:each) do
6
+ Highrise::Base.site = 'http://example.com.i:3000'
6
7
  @note = Highrise::Note.new(:id => 1)
7
8
  end
8
9
 
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require File.dirname(__FILE__) + '/../spec_helper'
2
4
 
3
5
  describe Highrise::Person do
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: highrise
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ prerelease: false
5
+ segments:
6
+ - 2
7
+ - 0
8
+ - 0
9
+ version: 2.0.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - "Marcos Tapaj\xC3\xB3s"
@@ -10,29 +15,35 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2010-02-15 00:00:00 -10:00
18
+ date: 2010-04-23 00:00:00 -03:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
17
22
  name: activeresource
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
21
25
  requirements:
22
26
  - - ">="
23
27
  - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 1
24
31
  version: "2.1"
25
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
26
34
  - !ruby/object:Gem::Dependency
27
35
  name: activesupport
28
- type: :runtime
29
- version_requirement:
30
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
31
38
  requirements:
32
39
  - - ">="
33
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 2
43
+ - 1
34
44
  version: "2.1"
35
- version:
45
+ type: :runtime
46
+ version_requirements: *id002
36
47
  description: "\n\
37
48
  Based on the original API module from DHH, http://developer.37signals.com/highrise/, this\n\
38
49
  gem is a cleaned up, tested version of the same. Contributors have added support for tags \n\
@@ -114,18 +125,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
125
  requirements:
115
126
  - - ">="
116
127
  - !ruby/object:Gem::Version
128
+ segments:
129
+ - 0
117
130
  version: "0"
118
- version:
119
131
  required_rubygems_version: !ruby/object:Gem::Requirement
120
132
  requirements:
121
133
  - - ">="
122
134
  - !ruby/object:Gem::Version
135
+ segments:
136
+ - 0
123
137
  version: "0"
124
- version:
125
138
  requirements: []
126
139
 
127
140
  rubyforge_project:
128
- rubygems_version: 1.3.5
141
+ rubygems_version: 1.3.6
129
142
  signing_key:
130
143
  specification_version: 3
131
144
  summary: Ruby wrapper around Highrise API