housecanary-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []