avvo_api 0.1.1 → 0.2.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.
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- avvo_api (0.1.1)
4
+ avvo_api (0.2.0)
5
+ activeresource (~> 3.0.0)
5
6
  reactive_resource (~> 0.5)
6
7
 
7
8
  GEM
@@ -2,7 +2,7 @@
2
2
 
3
3
  This gem provides an
4
4
  {ActiveResource}[http://api.rubyonrails.org/classes/ActiveResource/Base.html]-based
5
- client to information on {Avvo}[http://www.avvo.com], a directory of lawyers and doctors.
5
+ client to information on {Avvo}[http://www.avvo.com], a directory of lawyers.
6
6
 
7
7
  == Requirements
8
8
 
@@ -50,14 +50,14 @@ or
50
50
 
51
51
  AvvoApi::Headshot.find(:one, :params => {:lawyer_id => 28995}).headshot_url
52
52
 
53
- === Getting a list of addresses for a doctor
53
+ === Getting a list of addresses for a lawyer
54
54
 
55
- addresses = AvvoApi::Doctor.find(1).addresses
55
+ addresses = AvvoApi::Lawyer.find(28995).addresses
56
56
 
57
57
  or
58
58
 
59
- addresses = AvvoApi::Address.find(:all, :params => {:doctor_id => doctor.id})
59
+ addresses = AvvoApi::Address.find(:all, :params => {:lawyer_id => lawyer.id})
60
60
 
61
- === Getting the main address for a doctor
61
+ === Getting the main address for a lawyer
62
62
 
63
- main_address = AvvoApi::Address.main(:doctor_id => doctor.id)
63
+ main_address = AvvoApi::Address.main(:lawyer_id => lawyer.id)
@@ -12,10 +12,11 @@ Gem::Specification.new do |s|
12
12
  s.summary = %q{An ActiveResource client to the Avvo API}
13
13
  s.description = %q{An ActiveResource client to the Avvo API}
14
14
 
15
+ s.add_dependency "activeresource", '~> 3.0.0'
15
16
  s.add_dependency "reactive_resource", '~> 0.5'
16
17
  s.add_development_dependency "shoulda", '~> 2.11.3'
17
18
  s.add_development_dependency "webmock", '~> 1.6.1'
18
-
19
+
19
20
  s.rubyforge_project = "avvo_api"
20
21
 
21
22
  s.files = `git ls-files`.split("\n")
@@ -9,16 +9,13 @@ require 'avvo_api'
9
9
  professional_klass = nil
10
10
  professional_param = nil
11
11
 
12
- opts = OptionParser.new("Usage: avvo_cli.rb [options] ID")
13
- opts.on("-l", "--lawyer", "Get details about a lawyer") { professional_klass = AvvoApi::Lawyer; professional_param = :lawyer_id }
14
- opts.on("-d", "--doctor", "Get details about a doctor") { professional_klass = AvvoApi::Doctor; professional_param = :doctor_id }
12
+ opts = OptionParser.new("Usage: avvo_cli.rb ID")
15
13
  rest = opts.parse ARGV
16
14
 
17
- if !professional_klass
18
- puts "You must specify either --lawyer or --doctor"
19
- puts opts
20
- exit(1)
21
- elsif !rest.first
15
+ professional_klass = AvvoApi::Lawyer
16
+ professional_param = :lawyer_id
17
+
18
+ if !rest.first
22
19
  puts "You must specify the ID of the professional you are looking for"
23
20
  puts opts
24
21
  exit(1)
@@ -32,8 +29,8 @@ password: your_avvo_password"
32
29
  exit(1)
33
30
  end
34
31
  AvvoApi.setup(config["email"], config["password"])
35
- AvvoApi::Base.site = 'http://localhost.local:3000'
36
-
32
+ AvvoApi::Base.site = 'https://api.avvo.com/'
33
+
37
34
  professional = professional_klass.find(rest.first)
38
35
 
39
36
  address = AvvoApi::Address.main(professional_param => professional.id)
@@ -55,12 +52,12 @@ password: your_avvo_password"
55
52
  phones.each do |phone|
56
53
  printf format, "#{phone.phone_type}:", phone.phone_number
57
54
  end
58
-
55
+
59
56
  specialties.each_with_index do |specialty, i|
60
57
  header = i == 0 ? "Specialties:" : ""
61
58
  printf format, header, "#{specialty.specialty_name.strip} (#{specialty.specialty_percent}%)"
62
59
  end
63
-
60
+
64
61
  puts
65
62
  printf format, "Reviews ", ''
66
63
  reviews.each do |review|
@@ -68,7 +65,7 @@ password: your_avvo_password"
68
65
  printf format, "Title:", review.title
69
66
  printf format, "URL:", review.url
70
67
  printf format, "By:", review.posted_by
71
- puts
68
+ puts
72
69
  end
73
-
70
+
74
71
  end
@@ -1,20 +1,17 @@
1
1
  require 'avvo_api/base'
2
- require 'avvo_api/professional_methods'
3
2
 
4
3
  # The Avvo API Client. All API models live in this module.
5
4
  module AvvoApi
6
5
 
7
6
  autoload :Lawyer, 'avvo_api/lawyer'
8
- autoload :Doctor, 'avvo_api/doctor'
9
7
  autoload :School, 'avvo_api/school'
10
8
  autoload :Address, 'avvo_api/address'
11
9
  autoload :Phone, 'avvo_api/phone'
12
10
  autoload :Language, 'avvo_api/language'
13
11
  autoload :Specialty, 'avvo_api/specialty'
14
12
  autoload :Headshot, 'avvo_api/headshot'
15
- autoload :AdvancedTraining, 'avvo_api/advanced_training'
16
13
  autoload :Review, 'avvo_api/review'
17
-
14
+
18
15
  # Tells this client to use +email+ and +password+ to authenticate to
19
16
  # the Avvo API.
20
17
  def self.setup(email, password)
@@ -1,7 +1,6 @@
1
- # Represents an address. One of the following attributes MUST
1
+ # Represents an address. The following attribute MUST
2
2
  # be set when using this model:
3
- #
4
- # * doctor_id
3
+ #
5
4
  # * lawyer_id
6
5
  #
7
6
  # This model has the following attributes:
@@ -14,10 +13,9 @@
14
13
  # * postal_code
15
14
  # * latitude
16
15
  # * longitude
17
- #
16
+ #
18
17
  class AvvoApi::Address < AvvoApi::Base
19
18
  belongs_to :lawyer
20
- belongs_to :doctor
21
19
  has_many :phones
22
20
 
23
21
  # Returns the 'main' address associated with the passed in
@@ -3,18 +3,16 @@
3
3
  #
4
4
  # AvvoApi::Headshot.find(:one, :lawyer_id => l.id)
5
5
  #
6
- # When using this model, one of the following attributes MUST be set:
7
- #
8
- # * doctor_id
6
+ # When using this model, The following attribute MUST be set:
7
+ #
9
8
  # * lawyer_id
10
9
  #
11
10
  # This model has the following attribute:
12
11
  #
13
12
  # * headshot_url: The url to the standard-size headshot.
14
- #
13
+ #
15
14
  class AvvoApi::Headshot < AvvoApi::Base
16
15
  singleton
17
16
 
18
17
  belongs_to :lawyer
19
- belongs_to :doctor
20
18
  end
@@ -1,16 +1,14 @@
1
- # Represents a language. One of the following attributes MUST
1
+ # Represents a language. The following attribute MUST
2
2
  # be set when using this model:
3
- #
4
- # * doctor_id
3
+ #
5
4
  # * lawyer_id
6
5
  #
7
6
  # This model has the following attributes:
8
7
  #
9
- # * id
8
+ # * id
10
9
  # * name: The language name.
11
10
  # * specialty_id: The language id. 'name' takes priority over this if both are set.
12
- #
11
+ #
13
12
  class AvvoApi::Language < AvvoApi::Base
14
13
  belongs_to :lawyer
15
- belongs_to :doctor
16
14
  end
@@ -1,5 +1,5 @@
1
1
  # Represents a lawyer on Avvo. Attributes include:
2
- #
2
+ #
3
3
  # * id: The id of this lawyer
4
4
  # * firstname: the first name of this lawyer
5
5
  # * middlename: the middle name of this lawyer
@@ -9,12 +9,53 @@
9
9
  # * website_url
10
10
  #
11
11
  class AvvoApi::Lawyer < AvvoApi::Base
12
-
12
+
13
13
  has_many :addresses
14
14
  has_many :reviews
15
15
  has_many :schools
16
16
  has_many :languages
17
17
  has_many :specialties
18
18
  has_one :headshot
19
- include AvvoApi::ProfessionalMethods
19
+
20
+ # Search avvo for a list of the top 10 professionals matching the
21
+ # passed-in parameters. Accepts the following parameters:
22
+ #
23
+ # [q] The search query
24
+ # [loc] The location to search in
25
+ #
26
+ # These parameters match the search boxes on the Avvo website.
27
+ #
28
+ # This method pre-dates the REST API, and thus returns a hash of
29
+ # data rather than API objects. Hopefully, we'll eventually come
30
+ # up with something better. To see an actual response, look at
31
+ # http://api.avvo.com/docs/get/lawyers/search.html
32
+ def self.search(params)
33
+ response = self.get(:search, params)
34
+
35
+ if response && response['num_results']
36
+ response
37
+ else
38
+ raise ActiveResource::ResourceNotFound.new(response)
39
+ end
40
+ end
41
+
42
+ # Attempts to find a professional on Avvo that matches the
43
+ # passed-in params. Currently accepts the following params:
44
+ #
45
+ # [name] The full name of the lawyer you are trying to find
46
+ # [phone] The phone number of the lawyer, in the format XXX-XXX-XXXX
47
+ # [fax] The fax number of the lawyer, in the format XXX-XXX-XXXX
48
+ # [address] The full address of the lawyer
49
+ # [zip_code] The zip code of the lawyer
50
+ # [email_address] The e-mail address of the lawyer
51
+ def self.resolve(params)
52
+ response = self.get(:resolve, :params => params)
53
+ if response && response[collection_name]
54
+ response[collection_name].map do |params|
55
+ new(params.merge({"annotation" => response['annotation']}))
56
+ end
57
+ else
58
+ raise ActiveResource::ResourceNotFound.new(response)
59
+ end
60
+ end
20
61
  end
@@ -14,19 +14,15 @@ module AvvoApi::PhoneType
14
14
  MOBILE = 4
15
15
  end
16
16
 
17
- # Represents a phone number tied to an address. One of the
18
- # following attributes MUST be set when using this model:
19
- #
20
- # * doctor_id
21
- # * lawyer_id
17
+ # Represents a phone number tied to an address. The following
18
+ # attributes MUST be set when using this model:
22
19
  #
23
- # Additionally, the following attribute MUST be set when using this model:
24
- #
20
+ # * lawyer_id
25
21
  # * address_id
26
22
  #
27
23
  # This model has the following attributes:
28
24
  #
29
- # * id
25
+ # * id
30
26
  # * phone_number: The phone number. Will be normalized by Avvo.
31
27
  # * phone_type_id: The type of the phone number, as an AvvoApi::PhoneType
32
28
  # constant. (Only applicable when creating or updating records)
@@ -1,12 +1,11 @@
1
- # Represents a review for a professional. One of the following
2
- # attributes MUST be set when using this model:
3
- #
4
- # * doctor_id
1
+ # Represents a review for a professional. The following attribute
2
+ # MUST be set when using this model:
3
+ #
5
4
  # * lawyer_id
6
5
  #
7
6
  # This model has the following attributes:
8
7
  #
9
- # * id
8
+ # * id
10
9
  # * overall_rating: The overall rating (out of 5 stars) given by this review.
11
10
  # * title: The review's title
12
11
  # * body: The first 150 characters of the review's body
@@ -14,8 +13,7 @@
14
13
  # * posted_by: The author of the review
15
14
  # * posted_at: The date this review was posted
16
15
  # * updated_at: The last time this review was updated
17
- #
16
+ #
18
17
  class AvvoApi::Review < AvvoApi::Base
19
18
  belongs_to :lawyer
20
- belongs_to :doctor
21
19
  end
@@ -1,18 +1,16 @@
1
- # Represents a school attended by a professional. One of the following
2
- # attributes MUST be set when using this model:
3
- #
4
- # * doctor_id
1
+ # Represents a school attended by a professional. The following
2
+ # attribute MUST be set when using this model:
3
+ #
5
4
  # * lawyer_id
6
5
  #
7
6
  # This model has the following attributes:
8
7
  #
9
- # * id
8
+ # * id
10
9
  # * name: The name of the school. When set, this will be resolved by Avvo.
11
10
  # * degree_level_name: The level of degree awarded at this school. BA, BS, JD, etc. Will be resolved by Avvo.
12
- # * degree_area_name: Major or area of study. Will be resolved by Avvo.
11
+ # * degree_area_name: Major or area of study. Will be resolved by Avvo.
13
12
  # * graduation_date: The date the professional graduated from this school.
14
- #
13
+ #
15
14
  class AvvoApi::School < AvvoApi::Base
16
15
  belongs_to :lawyer
17
- belongs_to :doctor
18
16
  end
@@ -1,19 +1,17 @@
1
- # Represents a specialty. One of the following attributes MUST
2
- # be set when using this model:
3
- #
4
- # * doctor_id
1
+ # Represents a specialty. The following attribute MUST be set when
2
+ # using this model:
3
+ #
5
4
  # * lawyer_id
6
5
  #
7
6
  # This model has the following attributes:
8
7
  #
9
- # * id
10
- # * specialty_name: The name of this specialty.
8
+ # * id
9
+ # * specialty_name: The name of this specialty.
11
10
  # * specialty_percent: The percent of time this professional spends in this specialty
12
11
  # * specialty_start_date: When this professional started practicing this specialty.
13
12
  # * number_cases_handled: The number of cases handled within this specialty
14
13
  # * description: Additional information about this specialty.
15
- #
14
+ #
16
15
  class AvvoApi::Specialty < AvvoApi::Base
17
16
  belongs_to :lawyer
18
- belongs_to :doctor
19
17
  end
@@ -1,3 +1,3 @@
1
1
  module AvvoApi
2
- VERSION = "0.1.1" # :nodoc:
2
+ VERSION = "0.2.0" # :nodoc:
3
3
  end
@@ -6,23 +6,20 @@ class AvvoApi::AddressTest < Test::Unit::TestCase
6
6
  should "belong_to :lawyer" do
7
7
  assert_contains(AvvoApi::Address.belongs_to_associations.map(&:attribute), :lawyer)
8
8
  end
9
- should "belong_to :doctor" do
10
- assert_contains(AvvoApi::Address.belongs_to_associations.map(&:attribute), :doctor)
11
- end
12
9
  end
13
10
 
14
- context "AvvoApi::Address.main" do
15
-
16
- setup do
11
+ context "AvvoApi::Address.main" do
12
+
13
+ setup do
17
14
  stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses/main.json").to_return(:body => {:id => '1', :postal_code => '98122'}.to_json)
18
15
  @address = AvvoApi::Address.main(:lawyer_id => 1)
19
16
  end
20
-
17
+
21
18
  should "hit the correct url" do
22
19
  assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses/main.json")
23
20
  end
24
21
 
25
- should "setup the object correctly" do
22
+ should "setup the object correctly" do
26
23
  assert_equal '98122', @address.postal_code
27
24
  assert_equal 1, @address.prefix_options[:lawyer_id]
28
25
  end
@@ -3,21 +3,21 @@ require 'test_helper'
3
3
  class AvvoApi::BaseTest < Test::Unit::TestCase
4
4
 
5
5
  context "A resource that inherits from AvvoApi::Base" do
6
-
6
+
7
7
  setup do
8
8
  @object = AvvoApi::Lawyer.new
9
9
  end
10
-
10
+
11
11
  should "hit the Avvo API with the correct URL when saved" do
12
12
  stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json")
13
13
  @object.save
14
14
  assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers.json")
15
15
  end
16
16
 
17
- should "hit the Avvo API with the correct URL when retrieved" do
17
+ should "hit the Avvo API with the correct URL when retrieved" do
18
18
  stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1.json").to_return(:body => {:id => '1'}.to_json)
19
19
  AvvoApi::Lawyer.find(1)
20
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1.json")
20
+ assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1.json")
21
21
  end
22
22
 
23
23
  context "with a has_many relationship to another object" do
@@ -39,26 +39,26 @@ class AvvoApi::BaseTest < Test::Unit::TestCase
39
39
  end
40
40
 
41
41
  context "with a belongs_to association and correct parameters" do
42
- setup do
42
+ setup do
43
43
  @object = AvvoApi::Specialty.new(:lawyer_id => 2)
44
44
  end
45
-
45
+
46
46
  should "hit the Avvo API with the correct URL when saved" do
47
47
  stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties.json")
48
48
  @object.save
49
49
  assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties.json")
50
50
  end
51
-
52
- should "hit the Avvo API with the correct URL when retrieved" do
51
+
52
+ should "hit the Avvo API with the correct URL when retrieved" do
53
53
  stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json").to_return(:body => {:id => '3'}.to_json)
54
54
  AvvoApi::Specialty.find(3, :params => {:lawyer_id => 2})
55
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
55
+ assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
56
56
  end
57
57
 
58
- should "hit the Avvo API with the correct URL when updated" do
58
+ should "hit the Avvo API with the correct URL when updated" do
59
59
  stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json").to_return(:body => {:id => '3', :specialty_id => "88", :specialty_id => '88', :specialty_percent => '100'}.to_json)
60
60
  license = AvvoApi::Specialty.find(3, :params => {:lawyer_id => 2})
61
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
61
+ assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
62
62
  stub_request(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
63
63
  license.save
64
64
  assert_requested(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/specialties/3.json")
@@ -71,63 +71,63 @@ class AvvoApi::BaseTest < Test::Unit::TestCase
71
71
 
72
72
  assert_equal "/api/1/lawyers/2/specialties/2.json", @object.send(:element_path)
73
73
  end
74
-
74
+
75
75
  end
76
76
 
77
- context "with a belongs_to hierarchy and correct parameters" do
77
+ context "with a belongs_to hierarchy and correct parameters" do
78
78
 
79
- setup do
80
- @object = AvvoApi::Phone.new(:doctor_id => 2, :address_id => 3)
79
+ setup do
80
+ @object = AvvoApi::Phone.new(:lawyer_id => 2, :address_id => 3)
81
81
  end
82
82
 
83
83
  should "allow setting the prefix options after creation" do
84
84
  @object = AvvoApi::Phone.new
85
- @object.doctor_id = 2
85
+ @object.lawyer_id = 2
86
86
  @object.address_id = 3
87
- stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
87
+ stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones.json")
88
88
  @object.save
89
- assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
89
+ assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones.json")
90
90
  end
91
91
 
92
92
  should "allow following +belongs_to+ associations" do
93
93
  @object = AvvoApi::Phone.new
94
- @object.doctor_id = 2
94
+ @object.lawyer_id = 2
95
95
  @object.address_id = 3
96
96
  assert_equal 3, @object.address_id
97
- stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3.json").to_return(:body => {:id => '3'}.to_json)
97
+ stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3.json").to_return(:body => {:id => '3'}.to_json)
98
98
  @object.address
99
99
  @object.address
100
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3.json", :times => 1)
100
+ assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3.json", :times => 1)
101
101
  end
102
-
102
+
103
103
  should "hit the Avvo API with the correct URL when saved" do
104
- stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
104
+ stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones.json")
105
105
  @object.save
106
- assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
106
+ assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones.json")
107
107
  end
108
108
 
109
- should "hit the Avvo API with the correct URL when updated" do
110
- stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json").to_return(:body => {:id => '4'}.to_json)
111
- phone = AvvoApi::Phone.find(4, :params => {:doctor_id => 2, :address_id => 3})
112
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
109
+ should "hit the Avvo API with the correct URL when updated" do
110
+ stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones/4.json").to_return(:body => {:id => '4'}.to_json)
111
+ phone = AvvoApi::Phone.find(4, :params => {:lawyer_id => 2, :address_id => 3})
112
+ assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones/4.json")
113
113
 
114
- stub_request(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
114
+ stub_request(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones/4.json")
115
115
  phone.save
116
- assert_requested(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
116
+ assert_requested(:put, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones/4.json")
117
117
  end
118
118
 
119
119
  should "set the prefix parameters correctly when saved" do
120
- stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json").to_return(:body => {:phone_type_id=>2, :id=>4, :phone_number=>"206-728-0588"}.to_json)
120
+ stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones.json").to_return(:body => {:phone_type_id=>2, :id=>4, :phone_number=>"206-728-0588"}.to_json)
121
121
  @object.save
122
- assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones.json")
122
+ assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones.json")
123
123
 
124
- assert_equal "/api/1/doctors/2/addresses/3/phones/4.json", @object.send(:element_path)
124
+ assert_equal "/api/1/lawyers/2/addresses/3/phones/4.json", @object.send(:element_path)
125
125
  end
126
-
127
- should "hit the Avvo API with the correct URL when retrieved" do
128
- stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json").to_return(:body => {:id => '4'}.to_json)
129
- AvvoApi::Phone.find(4, :params => {:doctor_id => 2, :address_id => 3})
130
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/2/addresses/3/phones/4.json")
126
+
127
+ should "hit the Avvo API with the correct URL when retrieved" do
128
+ stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones/4.json").to_return(:body => {:id => '4'}.to_json)
129
+ AvvoApi::Phone.find(4, :params => {:lawyer_id => 2, :address_id => 3})
130
+ assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/2/addresses/3/phones/4.json")
131
131
  end
132
132
  end
133
133
 
@@ -3,10 +3,6 @@ require 'test_helper'
3
3
  class AvvoApi::HeadshotTest < Test::Unit::TestCase
4
4
 
5
5
  context "AvvoApi::Headshot" do
6
-
7
- should "belong_to :doctor" do
8
- assert_contains(AvvoApi::Headshot.belongs_to_associations.map(&:attribute), :doctor)
9
- end
10
6
 
11
7
  should "belong_to :lawyer" do
12
8
  assert_contains(AvvoApi::Headshot.belongs_to_associations.map(&:attribute), :lawyer)
@@ -38,7 +34,7 @@ class AvvoApi::HeadshotTest < Test::Unit::TestCase
38
34
  @headshot = AvvoApi::Headshot.find(:one, :params => {:lawyer_id => 1})
39
35
  stub_request(:delete, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
40
36
  @headshot.destroy
41
- assert_requested(:delete, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
37
+ assert_requested(:delete, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/headshot.json")
42
38
  end
43
39
 
44
40
  end
@@ -6,9 +6,6 @@ class AvvoApi::LanguageTest < Test::Unit::TestCase
6
6
  should "belong_to :lawyer" do
7
7
  assert_contains(AvvoApi::Language.belongs_to_associations.map(&:attribute), :lawyer)
8
8
  end
9
- should "belong_to :doctor" do
10
- assert_contains(AvvoApi::Language.belongs_to_associations.map(&:attribute), :doctor)
11
- end
12
9
  end
13
10
 
14
11
  end
@@ -6,14 +6,14 @@ class AvvoApi::PhoneTest < Test::Unit::TestCase
6
6
  should "belong_to :address" do
7
7
  assert_contains(AvvoApi::Phone.belongs_to_associations.map(&:attribute), :address)
8
8
  end
9
-
9
+
10
10
  should "build successfully with PhoneType constants" do
11
11
  phone = AvvoApi::Phone.new(:phone_number => '2125551212', :phone_type_id => AvvoApi::PhoneType::OFFICE, :address_id => 1, :lawyer_id => 1)
12
12
  assert_equal 2, phone.phone_type_id
13
13
  end
14
14
 
15
15
  should "be able to return a reasonable string for a phone type id" do
16
- stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses/1/phones/1.json").to_return(:body => {:id => 1, :phone_number => '212-555-1212', :phone_type => 'Office', :updated_at => Time.now}.to_json)
16
+ stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/lawyers/1/addresses/1/phones/1.json").to_return(:body => {:id => 1, :phone_number => '212-555-1212', :phone_type => 'Office', :updated_at => Time.now.to_s}.to_json)
17
17
  phone = AvvoApi::Phone.find(1, :params => {:lawyer_id => 1, :address_id => 1})
18
18
  assert_equal "Office", phone.phone_type
19
19
  end
@@ -6,9 +6,6 @@ class AvvoApi::ReviewTest < Test::Unit::TestCase
6
6
  should "belong_to :lawyer" do
7
7
  assert_contains(AvvoApi::Review.belongs_to_associations.map(&:attribute), :lawyer)
8
8
  end
9
- should "belong_to :doctor" do
10
- assert_contains(AvvoApi::Review.belongs_to_associations.map(&:attribute), :doctor)
11
- end
12
9
  end
13
10
 
14
11
  end
@@ -6,9 +6,6 @@ class AvvoApi::SchoolTest < Test::Unit::TestCase
6
6
  should "belong_to :lawyer" do
7
7
  assert_contains(AvvoApi::School.belongs_to_associations.map(&:attribute), :lawyer)
8
8
  end
9
- should "belong_to :doctor" do
10
- assert_contains(AvvoApi::School.belongs_to_associations.map(&:attribute), :doctor)
11
- end
12
9
  end
13
10
 
14
11
  end
@@ -6,9 +6,6 @@ class AvvoApi::SpecialtyTest < Test::Unit::TestCase
6
6
  should "belong_to :lawyer" do
7
7
  assert_contains(AvvoApi::Specialty.belongs_to_associations.map(&:attribute), :lawyer)
8
8
  end
9
- should "belong_to :doctor" do
10
- assert_contains(AvvoApi::Specialty.belongs_to_associations.map(&:attribute), :doctor)
11
- end
12
9
  end
13
10
 
14
11
  end
metadata CHANGED
@@ -1,76 +1,87 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: avvo_api
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 1
9
- version: 0.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Justin Weiss
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-04-13 00:00:00 -07:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-11-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activeresource
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
30
+ - !ruby/object:Gem::Dependency
21
31
  name: reactive_resource
22
- requirement: &id001 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
23
33
  none: false
24
- requirements:
34
+ requirements:
25
35
  - - ~>
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- - 5
30
- version: "0.5"
36
+ - !ruby/object:Gem::Version
37
+ version: '0.5'
31
38
  type: :runtime
32
39
  prerelease: false
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '0.5'
46
+ - !ruby/object:Gem::Dependency
35
47
  name: shoulda
36
- requirement: &id002 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
37
49
  none: false
38
- requirements:
50
+ requirements:
39
51
  - - ~>
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 2
43
- - 11
44
- - 3
52
+ - !ruby/object:Gem::Version
45
53
  version: 2.11.3
46
54
  type: :development
47
55
  prerelease: false
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.11.3
62
+ - !ruby/object:Gem::Dependency
50
63
  name: webmock
51
- requirement: &id003 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
52
65
  none: false
53
- requirements:
66
+ requirements:
54
67
  - - ~>
55
- - !ruby/object:Gem::Version
56
- segments:
57
- - 1
58
- - 6
59
- - 1
68
+ - !ruby/object:Gem::Version
60
69
  version: 1.6.1
61
70
  type: :development
62
71
  prerelease: false
63
- version_requirements: *id003
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 1.6.1
64
78
  description: An ActiveResource client to the Avvo API
65
- email:
79
+ email:
66
80
  - jweiss@avvo.com
67
81
  executables: []
68
-
69
82
  extensions: []
70
-
71
83
  extra_rdoc_files: []
72
-
73
- files:
84
+ files:
74
85
  - .gitignore
75
86
  - Gemfile
76
87
  - Gemfile.lock
@@ -80,23 +91,18 @@ files:
80
91
  - examples/avvo_cli.rb
81
92
  - lib/avvo_api.rb
82
93
  - lib/avvo_api/address.rb
83
- - lib/avvo_api/advanced_training.rb
84
94
  - lib/avvo_api/base.rb
85
- - lib/avvo_api/doctor.rb
86
95
  - lib/avvo_api/headshot.rb
87
96
  - lib/avvo_api/language.rb
88
97
  - lib/avvo_api/lawyer.rb
89
98
  - lib/avvo_api/phone.rb
90
- - lib/avvo_api/professional_methods.rb
91
99
  - lib/avvo_api/review.rb
92
100
  - lib/avvo_api/school.rb
93
101
  - lib/avvo_api/specialty.rb
94
102
  - lib/avvo_api/version.rb
95
103
  - test/test_helper.rb
96
104
  - test/unit/address_test.rb
97
- - test/unit/advanced_training_test.rb
98
105
  - test/unit/base_test.rb
99
- - test/unit/doctor_test.rb
100
106
  - test/unit/headshot_test.rb
101
107
  - test/unit/language_test.rb
102
108
  - test/unit/lawyer_test.rb
@@ -104,46 +110,40 @@ files:
104
110
  - test/unit/review_test.rb
105
111
  - test/unit/school_test.rb
106
112
  - test/unit/specialty_test.rb
107
- has_rdoc: true
108
113
  homepage: http://api.avvo.com
109
114
  licenses: []
110
-
111
115
  post_install_message:
112
116
  rdoc_options: []
113
-
114
- require_paths:
117
+ require_paths:
115
118
  - lib
116
- required_ruby_version: !ruby/object:Gem::Requirement
119
+ required_ruby_version: !ruby/object:Gem::Requirement
117
120
  none: false
118
- requirements:
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- hash: 3149627312389362997
122
- segments:
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ segments:
123
126
  - 0
124
- version: "0"
125
- required_rubygems_version: !ruby/object:Gem::Requirement
127
+ hash: -3858919658491321272
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
129
  none: false
127
- requirements:
128
- - - ">="
129
- - !ruby/object:Gem::Version
130
- hash: 3149627312389362997
131
- segments:
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ segments:
132
135
  - 0
133
- version: "0"
136
+ hash: -3858919658491321272
134
137
  requirements: []
135
-
136
138
  rubyforge_project: avvo_api
137
- rubygems_version: 1.3.7
139
+ rubygems_version: 1.8.24
138
140
  signing_key:
139
141
  specification_version: 3
140
142
  summary: An ActiveResource client to the Avvo API
141
- test_files:
143
+ test_files:
142
144
  - test/test_helper.rb
143
145
  - test/unit/address_test.rb
144
- - test/unit/advanced_training_test.rb
145
146
  - test/unit/base_test.rb
146
- - test/unit/doctor_test.rb
147
147
  - test/unit/headshot_test.rb
148
148
  - test/unit/language_test.rb
149
149
  - test/unit/lawyer_test.rb
@@ -1,35 +0,0 @@
1
- # Constants representing the possible values of the
2
- # advanced_training_type_id parameter of AvvoApi::AdvancedTraining
3
- module AvvoApi::AdvancedTrainingType
4
-
5
- # Unknown training type
6
- UNKNOWN = 1
7
-
8
- # Represents an internship
9
- INTERNSHIP = 2
10
-
11
- # Represents a residency
12
- RESIDENCY = 3
13
-
14
- # Represents a fellowship
15
- FELLOWSHIP = 4
16
- end
17
-
18
- # Represents advanced training, like residencies, for doctors. This
19
- # model is only applicable to doctors. The following attributes MUST
20
- # be set when using this model:
21
- #
22
- # * doctor_id
23
- #
24
- # This model has the following attributes:
25
- #
26
- # * id - The model's id
27
- # * advanced_training_type_id - an AvvoApi::AdvancedTrainingType constant
28
- # * specialty_name - The name of the specialty this advanced training is in
29
- # * hospital_name - The normalized name of the hospital. This will be
30
- # resolved by Avvo when it is set by this client.
31
- # * graduation_date - The date this training was completed
32
- #
33
- class AvvoApi::AdvancedTraining < AvvoApi::Base
34
- belongs_to :doctor
35
- end
@@ -1,22 +0,0 @@
1
- # Represents a doctor on Avvo. Attributes include:
2
- #
3
- # * id: The id of this doctor
4
- # * firstname: the first name of this doctor
5
- # * middlename: the middle name of this doctor
6
- # * lastname: the last name of this doctor
7
- # * suffix: the suffix of the doctor's name
8
- # * avvo_rating: The doctor's Avvo Rating, from 0.0 to 10.0
9
- # * email_address
10
- # * website_url
11
- # * profile_url
12
- #
13
- class AvvoApi::Doctor < AvvoApi::Base
14
- has_many :addresses
15
- has_many :reviews
16
- has_many :schools
17
- has_many :languages
18
- has_many :specialties
19
- has_many :advanced_trainings
20
- has_one :headshot
21
- include AvvoApi::ProfessionalMethods
22
- end
@@ -1,52 +0,0 @@
1
- module AvvoApi::ProfessionalMethods # :nodoc:
2
-
3
- # Methods that are shared between professionals.
4
- module ClassMethods
5
-
6
- # Search avvo for a list of the top 10 professionals matching the
7
- # passed-in parameters. Accepts the following parameters:
8
- #
9
- # [q] The search query
10
- # [loc] The location to search in
11
- #
12
- # These parameters match the search boxes on the Avvo website.
13
- #
14
- # This method pre-dates the REST API, and thus returns a hash of
15
- # data rather than API objects. Hopefully, we'll eventually come
16
- # up with something better. To see an actual response, look at
17
- # http://api.avvo.com/docs/get/lawyers/search.html
18
- def search(params)
19
- response = self.get(:search, params)
20
-
21
- if response && response['num_results']
22
- response
23
- else
24
- raise ActiveResource::ResourceNotFound.new(response)
25
- end
26
- end
27
-
28
- # Attempts to find a professional on Avvo that matches the
29
- # passed-in params. Currently accepts the following params:
30
- #
31
- # [name] The full name of the lawyer you are trying to find
32
- # [phone] The phone number of the lawyer, in the format XXX-XXX-XXXX
33
- # [fax] The fax number of the lawyer, in the format XXX-XXX-XXXX
34
- # [address] The full address of the lawyer
35
- # [zip_code] The zip code of the lawyer
36
- # [email_address] The e-mail address of the lawyer
37
- def resolve(params)
38
- response = self.get(:resolve, :params => params)
39
- if response && response[collection_name]
40
- response[collection_name].map do |params|
41
- new(params.merge({"annotation" => response['annotation']}))
42
- end
43
- else
44
- raise ActiveResource::ResourceNotFound.new(response)
45
- end
46
- end
47
- end
48
-
49
- def self.included(base)
50
- base.send(:extend, ClassMethods)
51
- end
52
- end
@@ -1,11 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AvvoApi::AdvancedTrainingTest < Test::Unit::TestCase
4
-
5
- context "AvvoApi::AdvancedTraining" do
6
- should "belong_to :doctor" do
7
- assert_contains(AvvoApi::AdvancedTraining.belongs_to_associations.map(&:attribute), :doctor)
8
- end
9
- end
10
-
11
- end
@@ -1,46 +0,0 @@
1
- require 'test_helper'
2
-
3
- class AvvoApi::DoctorTest < Test::Unit::TestCase
4
-
5
- context "A valid doctor object" do
6
- setup do
7
- @doctor = AvvoApi::Doctor.new(valid_doctor_params)
8
- stub_request(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors.json").to_return(:body => doctor_1.to_json)
9
- end
10
-
11
- should "#save successfully" do
12
- assert @doctor.save, "doctor could not be saved"
13
- assert_requested(:post, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors.json")
14
- assert_equal "1", @doctor.id
15
- end
16
- end
17
-
18
- context "AvvoApi::Doctor.resolve" do
19
-
20
- should "return the appropriate doctors" do
21
- stub_request(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/resolve.json?params%5Bname%5D=Mark%20Britton&params%5Bzip_code%5D=98101").to_return(:body => {:doctors => [{:id => 1}]}.to_json)
22
- doctors = AvvoApi::Doctor.resolve({:name => 'Mark Britton', :zip_code => 98101})
23
- assert_requested(:get, "https://test_account%40avvo.com:password@api.avvo.com/api/1/doctors/resolve.json?params%5Bname%5D=Mark%20Britton&params%5Bzip_code%5D=98101")
24
- assert_equal 1, doctors.length
25
- end
26
- end
27
-
28
- private
29
-
30
- def valid_doctor_params
31
- {
32
- :firstname => 'Bob',
33
- :lastname => 'Bobson',
34
- :npi_number => '123456'
35
- }
36
- end
37
-
38
- def doctor_1
39
- {
40
- :firstname => 'Bob',
41
- :lastname => 'Bobson',
42
- :id => '1'
43
- }
44
- end
45
-
46
- end