housecanary-ruby 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 89ec389874ba91ad835c4bcf0d06c51a89fa37fa
4
+ data.tar.gz: 87369ebf011c3dbaf3de659460b90e9cb4086ed2
5
+ SHA512:
6
+ metadata.gz: '02829c7246cec460c0c5f4ce61f0d9fe0787f97ba9630a8548e6ec8425ed78c8c709821ff07751e2feee72dbdbd26b0ef6d73488984781f643b3b8d3294343f9'
7
+ data.tar.gz: e7b7c02a92175fc295f2070a69dc104373b208d97e54c711492a484bb8a81c63a0afb35ce30b684ca829def72d8ccef9351773f2aaf2cbe6d7dfd3fba8497a06
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.irbrc ADDED
@@ -0,0 +1,7 @@
1
+ begin
2
+ require 'pry'
3
+ Pry.start
4
+ exit
5
+ rescue LoadError
6
+ puts "Pry not found, using 'irb' instead. Try\n gem install pry"
7
+ end
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,10 @@
1
+ Style/AccessModifierIndentation:
2
+ EnforcedStyle: indent
3
+ SupportedStyles:
4
+ - outdent
5
+ - indent
6
+
7
+ Metrics/MethodLength:
8
+ Max: 25
9
+ Metrics/LineLength:
10
+ Max: 120
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.4.1
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.1.5
5
+ before_install: gem install bundler -v 1.13.6
6
+ script:
7
+ - bundle exec rspec
8
+ branches:
9
+ only:
10
+ - master
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in housecanary-ruby.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 JetRockets
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # The Housecanary Ruby Gem
2
+ [![Gem Version](https://badge.fury.io/rb/housecanary-ruby.svg)](https://badge.fury.io/rb/housecanary-ruby)
3
+ [![Build Status](https://travis-ci.org/jetrockets/housecanary-ruby.svg?branch=master)](https://travis-ci.org/jetrockets/housecanary-ruby)
4
+
5
+ Ruby wrapper for the HouseCanary Data & Analytics API.
6
+ [https://www.housecanary.com/real-estate-data-api](https://www.housecanary.com/real-estate-data-api)
7
+
8
+
9
+ ## Installation
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'housecanary-ruby'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install housecanary-ruby
23
+
24
+ ## Configuration
25
+ You can pass configuration options as a block:
26
+
27
+ ```ruby
28
+ Housecanary.configure do |config|
29
+ config.api_key = 'your_api_key'
30
+ config.api_secret = 'your_api_secret'
31
+ end
32
+ ```
33
+ ## Usage
34
+ ### Sales History
35
+ Search sales and ownership transfer history. [Original documentation](https://api-docs.housecanary.com/#property-sales_history).
36
+
37
+ Example:
38
+ ```ruby
39
+ sales = Housecanary.properties.sales_history(address: '000 Some Street', zipcode: '01234', limit: '1')
40
+ ```
41
+ If sales information is found, the `sales` will contain `Housecanary::API::SalesHistory` object.
42
+ `sales.result` will contain an array of `Housecanary::API::Sale` objects.
43
+ ```ruby
44
+ => #<Housecanary::API::SalesHistory:0x007fa0dd2f3d18
45
+ @api_code=0,
46
+ @api_code_description="ok",
47
+ @result=
48
+ [#<Housecanary::API::Sale:0x007fa0dd2f3b60
49
+ @amount=00.0,
50
+ @apn="000-00-0000",
51
+ @event_type="event_type",
52
+ @fips="11111",
53
+ @grantee_1="Grantee1",
54
+ @grantee_1_forenames="Grantee1forenames",
55
+ @grantee_2=nil,
56
+ @grantee_2_forenames=nil,
57
+ @grantor_1="Grantor1",
58
+ @grantor_1_forenames="Grantor1forenames",
59
+ @grantor_2="",
60
+ @record_book="0000",
61
+ @record_date="1999-01-01",
62
+ @record_doc="00000",
63
+ @record_page="0000">]
64
+ ```
65
+ ## Exception Handling
66
+
67
+ If Housecanary will return anything different from 200 OK status code, `Housecanary::Error` will be raised. It contains `#message` and `#code` returned from API.
68
+
69
+ For example with invalid credentials you will receive:
70
+ ``` ruby
71
+ sales = Housecanary.properties.sales_history(address: '000 Some Street', zipcode: '01234')
72
+ #=> Housecanary::Error::Unauthorized: Invalid credentials
73
+ ```
74
+ Or with invalid zipcode:
75
+ ```ruby
76
+ sales = Housecanary.properties.sales_history( address: '000 Sample', zipcode: '0')
77
+ #=> Housecanary::Error::BadRequest: not a valid value for dictionary value @ data[0]['zipcode']
78
+ ```
79
+ ## Credits
80
+
81
+ Sponsored by [JetRockets](http://www.jetrockets.pro).
82
+
83
+ ![JetRockets](http://jetrockets.pro/JetRockets.jpg)
84
+
85
+ ## License
86
+
87
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
88
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "housecanary"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,37 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'housecanary/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'housecanary-ruby'
7
+ spec.version = Housecanary::VERSION
8
+ spec.authors = ['Ilia Kriachkov']
9
+ spec.email = ['ilia.kriachkov@jetrockets.ru']
10
+
11
+ spec.summary = %q(Ruby wrapper for the HouseCanary Data & Analytics API.)
12
+ spec.description = %q(Ruby wrapper for the HouseCanary Data & Analytics API. https://www.housecanary.com/real-estate-data-api)
13
+ spec.homepage = %q(https://github.com/jetrockets/housecanary-ruby)
14
+ spec.license = 'MIT'
15
+
16
+ spec.bindir = 'bin'
17
+ spec.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ spec.require_paths = ['lib']
20
+ spec.required_ruby_version = '>= 2.3'
21
+
22
+ # a b c d e f g h i j k l m n o p q r s t u v w x y z
23
+ spec.add_dependency 'dry-auto_inject'
24
+ spec.add_dependency 'dry-container'
25
+ spec.add_dependency 'dry-initializer'
26
+ spec.add_dependency 'dry-types'
27
+ spec.add_dependency 'http', '~> 3.0'
28
+
29
+ spec.add_development_dependency 'bundler', '~> 1.13'
30
+ # spec.add_development_dependency 'factory_bot'
31
+ # spec.add_development_dependency 'faker', '~> 1.9'
32
+ spec.add_development_dependency 'pry', '~> 0.11.3'
33
+ spec.add_development_dependency 'rake', '~> 10.0'
34
+ spec.add_development_dependency 'rspec', '~> 3.2'
35
+ spec.add_development_dependency 'simplecov', '>= 0.6.2'
36
+ spec.add_development_dependency 'webmock', '~> 3.4'
37
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Housecanary
4
+ module API
5
+ module Helpers
6
+ def _perform_response(parser, connection, method, path, params = {})
7
+ parser.perform(perform_request(method, connection, path, params))
8
+ end
9
+
10
+ def perform_request(method, connection, path, params)
11
+ args = connection, path, params
12
+ case method&.to_sym
13
+ when :get
14
+ perform_get(*args)
15
+ when :post
16
+ perform_post(*args)
17
+ else
18
+ raise NotImplementedError, "Method <#{method}> Not Supported"
19
+ end
20
+ end
21
+
22
+ def perform_get(connection, path, params)
23
+ connection.get(path, params: params)
24
+ end
25
+
26
+ def perform_post(connection, path, params)
27
+ connection.post(path, json: params)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'housecanary/api/helpers'
4
+ require 'housecanary/api/sales_history'
5
+
6
+ module Housecanary
7
+ module API
8
+ class Repository
9
+ include Housecanary::API::Helpers
10
+ include Housecanary::AutoInject['connection', 'response_parser']
11
+
12
+ SALES_HISTORY_PATH = 'property/sales_history'
13
+
14
+ def sales_history(params = {})
15
+ if response = perform_response(:get, SALES_HISTORY_PATH, params)
16
+ SalesHistory.new(response&.first&.fetch("property/sales_history".to_sym, nil))
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def perform_response(method, path, params = {})
23
+ _perform_response(response_parser, connection, method, path, params)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+ require 'dry-types'
5
+
6
+ module Housecanary
7
+ module API
8
+ class Sale
9
+ extend Dry::Initializer
10
+ option :amount
11
+ option :apn, optional: true
12
+ option :event_type, optional: true
13
+ option :fips, optional: true
14
+ option :grantee_1_forenames
15
+ option :grantee_1
16
+ option :grantee_2_forenames, optional: true
17
+ option :grantee_2, optional: true
18
+ option :grantor_1_forenames
19
+ option :grantor_1
20
+ option :grantor_2, optional: true
21
+ option :record_book, optional: true
22
+ option :record_date, optional: true
23
+ option :record_doc, optional: true
24
+ option :record_page, optional: true
25
+
26
+ def self.call(*args)
27
+ self.new(*args)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+ require 'dry-types'
5
+
6
+ require 'housecanary/api/sale'
7
+
8
+ module Housecanary
9
+ module API
10
+ class SalesHistory
11
+ extend Dry::Initializer
12
+ option :api_code_description, optional: true
13
+ option :api_code, optional: true
14
+ option :result, type: Dry::Types['coercible.array'].of(Sale)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+ require 'http'
5
+
6
+ module Housecanary
7
+ class Connection #:nodoc:
8
+ extend Dry::Initializer
9
+ BASE_URL = 'https://api.housecanary.com/v2/'
10
+
11
+ option :api_key
12
+ option :api_secret
13
+
14
+ def post(path, params = {})
15
+ HTTP.basic_auth(user: api_key, pass: api_secret).post(url(path), params)
16
+ end
17
+
18
+ def get(path, params = {})
19
+ HTTP.basic_auth(user: api_key, pass: api_secret).get(url(path), params)
20
+ end
21
+
22
+ private
23
+
24
+ def url(path)
25
+ URI.join(BASE_URL, path)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Housecanary
4
+ class Error < StandardError #:nodoc:
5
+ attr_reader :code
6
+
7
+ BadRequest = Class.new(self)
8
+ Unauthorized = Class.new(self)
9
+ Forbidden = Class.new(self)
10
+ NotFound = Class.new(self)
11
+ InternalServerError = Class.new(self)
12
+ TooManyRequests = Class.new(self)
13
+
14
+ ERRORS_MAP = {
15
+ 400 => Housecanary::Error::BadRequest,
16
+ 401 => Housecanary::Error::Unauthorized,
17
+ 403 => Housecanary::Error::Forbidden,
18
+ 404 => Housecanary::Error::NotFound,
19
+ 429 => Housecanary::Error::TooManyRequests,
20
+ 500 => Housecanary::Error::InternalServerError
21
+ }.freeze
22
+
23
+ class << self
24
+ def from_response(body)
25
+ message, status = parse_error(body)
26
+ new(message, status)
27
+ end
28
+
29
+ def parse_error(body)
30
+ message = body.fetch(:message, nil)
31
+ status = body.fetch(:status, nil)
32
+ [message, status]
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def initialize(message = '', code = nil)
39
+ super(message)
40
+ @code = code
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'housecanary/error'
4
+ require 'housecanary/utils'
5
+
6
+ module Housecanary
7
+ class ResponseParser #:nodoc:
8
+ class << self
9
+ def perform(response)
10
+ response_body = response.body.empty? ? '' : utils.deep_symbolize_keys(response.parse(:json))
11
+ api_error_filter(response.code, response_body)
12
+ end
13
+
14
+ private
15
+
16
+ def utils
17
+ Housecanary::Utils
18
+ end
19
+
20
+ def error(code, body)
21
+ Housecanary::Error::ERRORS_MAP[code]&.from_response(body)
22
+ end
23
+
24
+ def api_error_filter(code, body)
25
+ error = error(code, body)
26
+ raise(error) if error
27
+ body
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Housecanary
4
+ module Utils #:nodoc:
5
+ def deep_symbolize_keys(hash)
6
+ deep_transform_keys(hash) { |key| key.to_sym rescue key }
7
+ end
8
+ module_function :deep_symbolize_keys
9
+
10
+ private
11
+
12
+ def deep_transform_keys(object, &block)
13
+ case object
14
+ when Hash
15
+ object.each_with_object({}) do |(key, value), result|
16
+ result[yield(key)] = deep_transform_keys(value, &block)
17
+ end
18
+ when Array
19
+ object.map { |e| deep_transform_keys(e, &block) }
20
+ else
21
+ object
22
+ end
23
+ end
24
+ module_function :deep_transform_keys
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Housecanary
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-container'
4
+ require 'dry-auto_inject'
5
+ require 'ostruct'
6
+
7
+ require 'housecanary/version'
8
+ require 'housecanary/connection'
9
+ require 'housecanary/response_parser'
10
+
11
+ module Housecanary #:nodoc:
12
+ @container = ::Dry::Container.new
13
+ AutoInject = ::Dry::AutoInject(@container)
14
+
15
+ def self.configure
16
+ yield(configuration)
17
+ register!
18
+ end
19
+
20
+ def self.container
21
+ @container
22
+ end
23
+
24
+ def self.properties
25
+ Housecanary::API::Repository.new
26
+ end
27
+
28
+ class << self
29
+ private
30
+
31
+ def configuration
32
+ @configuration ||= OpenStruct.new
33
+ end
34
+
35
+ def register!
36
+ connection = ::Housecanary::Connection.new(configuration.to_h)
37
+ parser_class = ::Housecanary::ResponseParser
38
+ container.register :connection, -> { connection }
39
+ container.register :response_parser, -> { parser_class }
40
+ end
41
+ end
42
+ end
43
+
44
+ require 'housecanary/api/repository'
metadata ADDED
@@ -0,0 +1,223 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: housecanary-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ilia Kriachkov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-10-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-auto_inject
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-container
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dry-initializer
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dry-types
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: http
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.13'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.13'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.11.3
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.11.3
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '10.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '10.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '3.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 0.6.2
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.6.2
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.4'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.4'
167
+ description: Ruby wrapper for the HouseCanary Data & Analytics API. https://www.housecanary.com/real-estate-data-api
168
+ email:
169
+ - ilia.kriachkov@jetrockets.ru
170
+ executables:
171
+ - console
172
+ - setup
173
+ extensions: []
174
+ extra_rdoc_files: []
175
+ files:
176
+ - ".gitignore"
177
+ - ".irbrc"
178
+ - ".rspec"
179
+ - ".rubocop.yml"
180
+ - ".ruby-version"
181
+ - ".travis.yml"
182
+ - Gemfile
183
+ - LICENSE
184
+ - README.md
185
+ - Rakefile
186
+ - bin/console
187
+ - bin/setup
188
+ - housecanary-ruby.gemspec
189
+ - lib/housecanary.rb
190
+ - lib/housecanary/api/helpers.rb
191
+ - lib/housecanary/api/repository.rb
192
+ - lib/housecanary/api/sale.rb
193
+ - lib/housecanary/api/sales_history.rb
194
+ - lib/housecanary/connection.rb
195
+ - lib/housecanary/error.rb
196
+ - lib/housecanary/response_parser.rb
197
+ - lib/housecanary/utils.rb
198
+ - lib/housecanary/version.rb
199
+ homepage: https://github.com/jetrockets/housecanary-ruby
200
+ licenses:
201
+ - MIT
202
+ metadata: {}
203
+ post_install_message:
204
+ rdoc_options: []
205
+ require_paths:
206
+ - lib
207
+ required_ruby_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '2.3'
212
+ required_rubygems_version: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ requirements: []
218
+ rubyforge_project:
219
+ rubygems_version: 2.6.11
220
+ signing_key:
221
+ specification_version: 4
222
+ summary: Ruby wrapper for the HouseCanary Data & Analytics API.
223
+ test_files: []