kmayer-highrise 0.13.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.mkdn +3 -5
- data/Rakefile +2 -4
- data/VERSION.yml +3 -3
- data/examples/config_initializers_highrise.rb +2 -2
- data/examples/sample.rb +1 -1
- data/highrise.gemspec +9 -20
- data/lib/cachable.rb +26 -15
- data/lib/highrise.rb +0 -4
- data/lib/highrise/base.rb +1 -3
- data/lib/highrise/person.rb +7 -1
- data/lib/highrise/taggable.rb +8 -24
- data/spec/cachable_spec.rb +13 -15
- data/spec/highrise/company_spec.rb +8 -10
- data/spec/highrise/person_spec.rb +7 -9
- data/spec/spec.opts +2 -1
- data/spec/spec_helper.rb +5 -5
- metadata +3 -31
- data/lib/highrise/curlhelper.rb +0 -27
- data/lib/highrise/curly.rb +0 -101
- data/spec/highrise/companies/16883216.html +0 -1723
- data/spec/highrise/curlhelper_spec.rb +0 -35
- data/spec/highrise/curly_spec.rb +0 -36
- data/spec/highrise/people/16887003.html +0 -1733
data/README.mkdn
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Highrise (
|
1
|
+
# Highrise (1.0)
|
2
2
|
|
3
3
|
## What is it?
|
4
4
|
|
@@ -14,10 +14,8 @@ All these classes are inherited from ActiveResouce::Base. Refer to the [ActiveRe
|
|
14
14
|
|
15
15
|
### Dependencies
|
16
16
|
|
17
|
-
* ActiveResorce >= 2.
|
17
|
+
* ActiveResorce >= 2.1
|
18
18
|
* ActiveSupport >= 2.1
|
19
|
-
* Curb
|
20
|
-
* Hpricot
|
21
19
|
|
22
20
|
### Configure your key
|
23
21
|
|
@@ -33,7 +31,7 @@ or
|
|
33
31
|
|
34
32
|
and, if you want [caching][c]:
|
35
33
|
|
36
|
-
Highrise::Base.
|
34
|
+
Highrise::Base.cache_store= <your normal ActiveSupport::Caching options>
|
37
35
|
|
38
36
|
If you are using this in a Rails application, putting this code in a config/initializers/highrise.rb
|
39
37
|
file is recommended. See config_initializers_highrise.rb in the examples/ directory.
|
data/Rakefile
CHANGED
@@ -27,10 +27,8 @@ Highrise::Base.site = 'http://your_site.highrisehq.com/'
|
|
27
27
|
Highrise::Base.user = 'your_api_auth_token'
|
28
28
|
}
|
29
29
|
gemspec.authors = ["Marcos Tapajós", "Ken Mayer"]
|
30
|
-
gemspec.add_dependency('activeresource', '>=2.
|
31
|
-
gemspec.add_dependency('activesupport', '>=2.1')
|
32
|
-
gemspec.add_dependency('curb')
|
33
|
-
gemspec.add_dependency('hpricot')
|
30
|
+
gemspec.add_dependency('activeresource', '>= 2.1')
|
31
|
+
gemspec.add_dependency('activesupport', '>= 2.1')
|
34
32
|
end
|
35
33
|
rescue LoadError
|
36
34
|
puts "Jeweler not available. Install it with: sudo gem install jeweler -s http://gems.github.com"
|
data/VERSION.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
---
|
2
|
-
:minor:
|
3
|
-
:patch:
|
4
|
-
:major:
|
2
|
+
:minor: 0
|
3
|
+
:patch: 1
|
4
|
+
:major: 1
|
@@ -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.
|
11
|
-
Highrise::Base.
|
10
|
+
Highrise::Base.cache_store = ActiveSupport::Cache.lookup_store :mem_cache_store
|
11
|
+
Highrise::Base.store_options = { :expires_in => 60.seconds }
|
12
12
|
end
|
data/examples/sample.rb
CHANGED
data/highrise.gemspec
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
1
4
|
# -*- encoding: utf-8 -*-
|
2
5
|
|
3
6
|
Gem::Specification.new do |s|
|
4
7
|
s.name = %q{highrise}
|
5
|
-
s.version = "0.
|
8
|
+
s.version = "1.0.1"
|
6
9
|
|
7
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
11
|
s.authors = ["Marcos Tapaj\303\263s", "Ken Mayer"]
|
9
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-09-02}
|
10
13
|
s.description = %q{
|
11
14
|
Based on the original API module from DHH, http://developer.37signals.com/highrise/, this
|
12
15
|
gem is a cleaned up, tested version of the same. Contributors have added support for tags
|
@@ -40,8 +43,6 @@ Highrise::Base.user = 'your_api_auth_token'
|
|
40
43
|
"lib/highrise/base.rb",
|
41
44
|
"lib/highrise/comment.rb",
|
42
45
|
"lib/highrise/company.rb",
|
43
|
-
"lib/highrise/curlhelper.rb",
|
44
|
-
"lib/highrise/curly.rb",
|
45
46
|
"lib/highrise/email.rb",
|
46
47
|
"lib/highrise/group.rb",
|
47
48
|
"lib/highrise/kase.rb",
|
@@ -57,17 +58,13 @@ Highrise::Base.user = 'your_api_auth_token'
|
|
57
58
|
"spec/cachable_spec.rb",
|
58
59
|
"spec/highrise/base_spec.rb",
|
59
60
|
"spec/highrise/comment_spec.rb",
|
60
|
-
"spec/highrise/companies/16883216.html",
|
61
61
|
"spec/highrise/company_spec.rb",
|
62
|
-
"spec/highrise/curlhelper_spec.rb",
|
63
|
-
"spec/highrise/curly_spec.rb",
|
64
62
|
"spec/highrise/email_spec.rb",
|
65
63
|
"spec/highrise/group_spec.rb",
|
66
64
|
"spec/highrise/kase_spec.rb",
|
67
65
|
"spec/highrise/membership_spec.rb",
|
68
66
|
"spec/highrise/note_spec.rb",
|
69
67
|
"spec/highrise/pagination_spec.rb",
|
70
|
-
"spec/highrise/people/16887003.html",
|
71
68
|
"spec/highrise/person_spec.rb",
|
72
69
|
"spec/highrise/subject_spec.rb",
|
73
70
|
"spec/highrise/tag_spec.rb",
|
@@ -80,15 +77,13 @@ Highrise::Base.user = 'your_api_auth_token'
|
|
80
77
|
s.homepage = %q{http://github.com/kmayer/highrise}
|
81
78
|
s.rdoc_options = ["--charset=UTF-8"]
|
82
79
|
s.require_paths = ["lib"]
|
83
|
-
s.rubygems_version = %q{1.3.
|
80
|
+
s.rubygems_version = %q{1.3.5}
|
84
81
|
s.summary = %q{Ruby wrapper around Highrise API}
|
85
82
|
s.test_files = [
|
86
83
|
"spec/cachable_spec.rb",
|
87
84
|
"spec/highrise/base_spec.rb",
|
88
85
|
"spec/highrise/comment_spec.rb",
|
89
86
|
"spec/highrise/company_spec.rb",
|
90
|
-
"spec/highrise/curlhelper_spec.rb",
|
91
|
-
"spec/highrise/curly_spec.rb",
|
92
87
|
"spec/highrise/email_spec.rb",
|
93
88
|
"spec/highrise/group_spec.rb",
|
94
89
|
"spec/highrise/kase_spec.rb",
|
@@ -111,20 +106,14 @@ Highrise::Base.user = 'your_api_auth_token'
|
|
111
106
|
s.specification_version = 3
|
112
107
|
|
113
108
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
114
|
-
s.add_runtime_dependency(%q<activeresource>, [">= 2.
|
109
|
+
s.add_runtime_dependency(%q<activeresource>, [">= 2.1"])
|
115
110
|
s.add_runtime_dependency(%q<activesupport>, [">= 2.1"])
|
116
|
-
s.add_runtime_dependency(%q<curb>, [">= 0"])
|
117
|
-
s.add_runtime_dependency(%q<hpricot>, [">= 0"])
|
118
111
|
else
|
119
|
-
s.add_dependency(%q<activeresource>, [">= 2.
|
112
|
+
s.add_dependency(%q<activeresource>, [">= 2.1"])
|
120
113
|
s.add_dependency(%q<activesupport>, [">= 2.1"])
|
121
|
-
s.add_dependency(%q<curb>, [">= 0"])
|
122
|
-
s.add_dependency(%q<hpricot>, [">= 0"])
|
123
114
|
end
|
124
115
|
else
|
125
|
-
s.add_dependency(%q<activeresource>, [">= 2.
|
116
|
+
s.add_dependency(%q<activeresource>, [">= 2.1"])
|
126
117
|
s.add_dependency(%q<activesupport>, [">= 2.1"])
|
127
|
-
s.add_dependency(%q<curb>, [">= 0"])
|
128
|
-
s.add_dependency(%q<hpricot>, [">= 0"])
|
129
118
|
end
|
130
119
|
end
|
data/lib/cachable.rb
CHANGED
@@ -9,9 +9,7 @@
|
|
9
9
|
#
|
10
10
|
# module CachedResource
|
11
11
|
# class Base < ActiveResource::Base
|
12
|
-
#
|
13
|
-
# class ActiveResource::Connection
|
14
|
-
# include Cachable
|
12
|
+
# include ::Cachable
|
15
13
|
# end
|
16
14
|
# end
|
17
15
|
#
|
@@ -23,14 +21,14 @@
|
|
23
21
|
# these stores
|
24
22
|
#
|
25
23
|
# === Configuration examples ('off' is the default):
|
26
|
-
# CachedResource.
|
27
|
-
# CachedResource.
|
28
|
-
# CachedResource.
|
29
|
-
# CachedResource.
|
30
|
-
# CachedResource.
|
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")
|
31
29
|
#
|
32
30
|
# === If you are using a store that has write options, you can set them
|
33
|
-
# CachedResource.
|
31
|
+
# CachedResource.store_options = { :expires_in => 60.seconds }
|
34
32
|
#
|
35
33
|
# Note: To ensure that caching is turned off, set CachedResource.connection.cache_store = nil
|
36
34
|
#
|
@@ -38,13 +36,16 @@
|
|
38
36
|
|
39
37
|
module Cachable
|
40
38
|
def self.included(base)
|
39
|
+
base.extend ClassMethods
|
41
40
|
base.class_eval do
|
42
|
-
|
43
|
-
|
41
|
+
class << self
|
42
|
+
alias_method_chain :find_every, :cache
|
43
|
+
alias_method_chain :find_single, :cache
|
44
|
+
end
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
module
|
48
|
+
module ClassMethods
|
48
49
|
attr_writer :cache_store, :store_options
|
49
50
|
|
50
51
|
def cache_store
|
@@ -61,9 +62,19 @@ module Cachable
|
|
61
62
|
|
62
63
|
private
|
63
64
|
|
64
|
-
|
65
|
-
|
66
|
-
|
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)}
|
67
78
|
end
|
68
79
|
|
69
80
|
def cache_key(*args)
|
data/lib/highrise.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
1
|
require 'active_resource'
|
2
|
-
require 'activesupport'
|
3
|
-
require 'active_support/basic_object'
|
4
2
|
|
5
3
|
require File.dirname(__FILE__) + '/highrise/base'
|
6
4
|
require File.dirname(__FILE__) + '/highrise/pagination'
|
7
|
-
require File.dirname(__FILE__) + '/highrise/curly'
|
8
|
-
require File.dirname(__FILE__) + '/highrise/curlhelper'
|
9
5
|
require File.dirname(__FILE__) + '/highrise/taggable'
|
10
6
|
require File.dirname(__FILE__) + '/highrise/subject'
|
11
7
|
require File.dirname(__FILE__) + '/highrise/comment'
|
data/lib/highrise/base.rb
CHANGED
data/lib/highrise/person.rb
CHANGED
data/lib/highrise/taggable.rb
CHANGED
@@ -1,33 +1,17 @@
|
|
1
1
|
module Highrise
|
2
|
-
module Taggable
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
module Taggable
|
3
|
+
def tags
|
4
|
+
self.get(:tags)
|
5
|
+
end
|
6
6
|
def tag!(tag_name)
|
7
7
|
self.post(:tags, :name => tag_name) unless tag_name.blank?
|
8
|
-
end
|
9
|
-
|
8
|
+
end
|
10
9
|
def untag!(tag_name)
|
11
|
-
to_delete = self.tags.find{|t| t
|
12
|
-
self.untag_id!(to_delete
|
13
|
-
end
|
14
|
-
|
10
|
+
to_delete = self.tags.find{|t| t['name'] == tag_name} unless tag_name.blank?
|
11
|
+
self.untag_id!(to_delete['id']) unless to_delete.nil?
|
12
|
+
end
|
15
13
|
def untag_id!(tag_id)
|
16
14
|
self.delete("tags/#{tag_id}")
|
17
15
|
end
|
18
|
-
|
19
|
-
def tags
|
20
|
-
tags = []
|
21
|
-
get_document.search("#show_tags a").each{ |a|
|
22
|
-
tags << Highrise::Tag.new(:id => a['href'].gsub(/.*\//, ''), :name => a.inner_html) if a['class'] == "grey tag"
|
23
|
-
}
|
24
|
-
tags
|
25
|
-
end
|
26
|
-
|
27
|
-
def get_document
|
28
|
-
@curl_helper ||= CurlHelper.new
|
29
|
-
@doc = @curl_helper.get_document_from_id("#{self.class.collection_name}/#{self.id}")
|
30
|
-
end
|
31
|
-
|
32
16
|
end
|
33
17
|
end
|
data/spec/cachable_spec.rb
CHANGED
@@ -3,44 +3,42 @@ require File.dirname(__FILE__) + '/spec_helper'
|
|
3
3
|
describe Highrise::Base, "class configuration" do
|
4
4
|
before(:each) do
|
5
5
|
Highrise::Base.site = 'http://example.com.i:3000'
|
6
|
-
@connection = Highrise::Base.connection
|
7
6
|
end
|
8
7
|
|
9
8
|
it "should tell us if caching is active" do
|
10
|
-
|
11
|
-
|
9
|
+
Highrise::Base.cache_store = ActiveSupport::Cache.lookup_store :memory_store
|
10
|
+
Highrise::Base.is_caching?.should == true
|
12
11
|
end
|
13
12
|
|
14
13
|
it "should tell us if caching is not active" do
|
15
|
-
|
16
|
-
|
14
|
+
Highrise::Base.cache_store = nil
|
15
|
+
Highrise::Base.is_caching?.should == false
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
describe Highrise::Base do
|
21
20
|
before(:all) do
|
22
21
|
Highrise::Base.site = 'http://example.com.i:3000'
|
23
|
-
|
24
|
-
@connection.cache_store = ActiveSupport::Cache.lookup_store :memory_store
|
22
|
+
Highrise::Base.cache_store = ActiveSupport::Cache.lookup_store :memory_store
|
25
23
|
end
|
26
24
|
|
27
25
|
after(:all) do
|
28
|
-
|
26
|
+
Highrise::Base.cache_store = :none
|
29
27
|
end
|
30
28
|
|
31
29
|
before(:each) do
|
32
30
|
@thing = Highrise::Base.new
|
33
31
|
@key = :key
|
34
|
-
|
32
|
+
Highrise::Base.stub!(:cache_key).and_return(@key)
|
35
33
|
end
|
36
34
|
|
37
35
|
context "when a cached response is available" do
|
38
36
|
before(:each) do
|
39
|
-
|
37
|
+
Highrise::Base.cache_store.write(@key, @thing)
|
40
38
|
end
|
41
39
|
|
42
40
|
it "should NOT make a request to the RESTful server" do
|
43
|
-
|
41
|
+
Highrise::Base.should_not_receive(:find_single_without_cache)
|
44
42
|
Highrise::Base.find(1)
|
45
43
|
end
|
46
44
|
|
@@ -51,18 +49,18 @@ describe Highrise::Base do
|
|
51
49
|
|
52
50
|
context "when a cached response is NOT available" do
|
53
51
|
before(:each) do
|
54
|
-
|
52
|
+
Highrise::Base.cache_store.delete(@key)
|
55
53
|
end
|
56
54
|
|
57
55
|
it "SHOULD perform an ARes request" do
|
58
|
-
|
56
|
+
Highrise::Base.should_receive(:find_single_without_cache).and_return(@thing)
|
59
57
|
Highrise::Base.find(1)
|
60
58
|
end
|
61
59
|
|
62
60
|
it "should cache the response using the caching key" do
|
63
|
-
|
61
|
+
Highrise::Base.should_receive(:find_single_without_cache).and_return(@thing)
|
64
62
|
Highrise::Base.find(1)
|
65
|
-
|
63
|
+
Highrise::Base.cache_store.read(@key).should == @thing
|
66
64
|
end
|
67
65
|
end
|
68
66
|
end
|
@@ -4,11 +4,11 @@ describe Highrise::Company do
|
|
4
4
|
|
5
5
|
before(:each) do
|
6
6
|
Highrise::Base.site = 'http://example.com.i:3000'
|
7
|
-
@company = Highrise::Company.new
|
7
|
+
@company = Highrise::Company.new(:id => 1)
|
8
8
|
returning @tags = [] do
|
9
|
-
@tags <<
|
10
|
-
@tags <<
|
11
|
-
@tags <<
|
9
|
+
@tags << {'id' => "414578", 'name' => "cliente"}
|
10
|
+
@tags << {'id' => "414580", 'name' => "ged"}
|
11
|
+
@tags << {'id' => "414579", 'name' => "iepc"}
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -39,8 +39,7 @@ describe Highrise::Company do
|
|
39
39
|
describe ".tags" do
|
40
40
|
|
41
41
|
it "should return an array of all tags for that company." do
|
42
|
-
|
43
|
-
@company.stub!(:get_document).and_return(Hpricot(File.open(file_path,"r"){|f| f.read}))
|
42
|
+
@company.should_receive(:get).with(:tags).and_return(@tags)
|
44
43
|
@company.tags.should == @tags
|
45
44
|
end
|
46
45
|
|
@@ -49,7 +48,7 @@ describe Highrise::Company do
|
|
49
48
|
describe "tag!(tag_name)" do
|
50
49
|
|
51
50
|
it "should create a tag for this company." do
|
52
|
-
@company.should_receive(:post).with(:tags, :name => "client" ).
|
51
|
+
@company.should_receive(:post).with(:tags, :name => "client" ).and_return(true)
|
53
52
|
@company.tag!("client").should be_true
|
54
53
|
end
|
55
54
|
|
@@ -58,9 +57,8 @@ describe Highrise::Company do
|
|
58
57
|
describe "untag!(tag_name)" do
|
59
58
|
|
60
59
|
it "should delete a tag for this company." do
|
61
|
-
|
62
|
-
@company.
|
63
|
-
@company.should_receive(:delete).with("tags/414578").at_least(1).times.and_return(true)
|
60
|
+
@company.should_receive(:get).with(:tags).and_return(@tags)
|
61
|
+
@company.should_receive(:delete).with("tags/414578").and_return(true)
|
64
62
|
@company.untag!("cliente").should be_true
|
65
63
|
end
|
66
64
|
|
@@ -4,10 +4,10 @@ describe Highrise::Person do
|
|
4
4
|
|
5
5
|
before(:each) do
|
6
6
|
Highrise::Base.site = 'http://example.com.i:3000'
|
7
|
-
@person = Highrise::Person.new
|
7
|
+
@person = Highrise::Person.new(:id => 1)
|
8
8
|
returning @tags = [] do
|
9
|
-
@tags <<
|
10
|
-
@tags <<
|
9
|
+
@tags << {'id' => "414578", 'name' => "cliente"}
|
10
|
+
@tags << {'id' => "414587", 'name' => "walk"}
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -53,8 +53,7 @@ describe Highrise::Person do
|
|
53
53
|
describe ".tags" do
|
54
54
|
|
55
55
|
it "should return an array of all tags for that user." do
|
56
|
-
|
57
|
-
@person.stub!(:get_document).and_return(Hpricot(File.open(file_path,"r"){|f| f.read}))
|
56
|
+
@person.should_receive(:get).with(:tags).and_return(@tags)
|
58
57
|
@person.tags.should == @tags
|
59
58
|
end
|
60
59
|
|
@@ -63,7 +62,7 @@ describe Highrise::Person do
|
|
63
62
|
describe "tag!(tag_name)" do
|
64
63
|
|
65
64
|
it "should create a tag for this user." do
|
66
|
-
@person.should_receive(:post).with(:tags, :name => "Forum_User" ).
|
65
|
+
@person.should_receive(:post).with(:tags, :name => "Forum_User" ).and_return(true)
|
67
66
|
@person.tag!("Forum_User").should be_true
|
68
67
|
end
|
69
68
|
|
@@ -72,9 +71,8 @@ describe Highrise::Person do
|
|
72
71
|
describe "untag!(tag_name)" do
|
73
72
|
|
74
73
|
it "should delete a tag for this user." do
|
75
|
-
|
76
|
-
@person.
|
77
|
-
@person.should_receive(:delete).with("tags/414578").at_least(1).times.and_return(true)
|
74
|
+
@person.should_receive(:get).with(:tags).and_return(@tags)
|
75
|
+
@person.should_receive(:delete).with("tags/414578").and_return(true)
|
78
76
|
@person.untag!("cliente").should be_true
|
79
77
|
end
|
80
78
|
|