immobilienscout 0.0.3 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e94144983edce73e19c3bf4a64b2ab02ef5297e4f10f714ddb7b0e68645aa9b6
4
- data.tar.gz: a816281b3268330b43d8a2f7b50ecb25e281d749b79b2172af7068ca64281bcf
3
+ metadata.gz: 7088e64b433baae893c02d9ac5d3845ec0ed2e66512deb5c881ca381ca2e7a5c
4
+ data.tar.gz: 9744cf7bb4d0fd051a3912fb5b40cbc6d8c448140bda4717528a8c0b78093721
5
5
  SHA512:
6
- metadata.gz: 7d4664aaecc0dce42f23d10776a8102a71e7419599254ab36be12ccf594ed049bf7f4d6f4813b5768c9c28b17d61548fabc6b014f2dae03e8dc6dcad51f8053c
7
- data.tar.gz: bc3f0ae38c2729544fb49f74a9514c1282accc91171899987c7d4ea5f16643c649dd6d6e9c530f383bc91329c227cacf8273b6b48fda0d7ab96b54748108a627
6
+ metadata.gz: 1d760a79dc5c852d8186b602b2cd81eab6d88e1b0cca3b3258ba854599dd36ebfaf490b44ebe38b227327e45c07e048def8d487ea5540853497e9c1b610bf6c9
7
+ data.tar.gz: 0d4e2caf14860b87ea5c911eab45f6cc11551b976cb8716a342dd81aa03f24320fb35bbb40fe0dbf19cdbd5101101c880f408704750e0ec3a278593a8b6ba98f
@@ -0,0 +1,68 @@
1
+ require:
2
+ - rubocop-rspec
3
+ - rubocop-performance
4
+
5
+ AllCops:
6
+ DisabledByDefault: false
7
+ DisplayCopNames: true
8
+ TargetRubyVersion: 2.6
9
+ Exclude:
10
+ - bin/bundle
11
+ - 'vendor/**/*'
12
+ - 'gemfiles/vendor/**/*'
13
+
14
+ #################### Lint ################################
15
+
16
+ Style/Documentation:
17
+ Enabled: false
18
+
19
+ Metrics/ClassLength:
20
+ Enabled: true
21
+ Max: 100
22
+
23
+ Metrics/AbcSize:
24
+ Enabled: true
25
+ Max: 20
26
+
27
+ Layout/LineLength:
28
+ Enabled: true
29
+ Max: 120
30
+ Exclude:
31
+ - 'spec/**/*.rb'
32
+
33
+ Style/MixinUsage:
34
+ Enabled: true
35
+ Exclude:
36
+ - bin/setup
37
+ - bin/update
38
+
39
+ Style/ClassAndModuleChildren:
40
+ Enabled: false
41
+
42
+ Metrics/BlockLength:
43
+ Exclude:
44
+ - 'spec/**/*.rb'
45
+
46
+ Style/HashEachMethods:
47
+ Enabled: true
48
+
49
+ Style/HashTransformKeys:
50
+ Enabled: true
51
+
52
+ Style/HashTransformValues:
53
+ Enabled: true
54
+
55
+ RSpec/ContextWording:
56
+ Enabled: false
57
+
58
+ RSpec/ExampleLength:
59
+ Enabled: false
60
+
61
+ RSpec/FilePath:
62
+ Enabled: false
63
+
64
+ RSpec/MultipleExpectations:
65
+ Enabled: false
66
+
67
+ RSpec/NestedGroups:
68
+ Enabled: false
@@ -5,5 +5,9 @@ cache: bundler
5
5
  rvm:
6
6
  - 2.4.6
7
7
  - 2.5.5
8
- - 2.6.3
8
+ - 2.6.5
9
+ script:
10
+ - bundle exec rubocop
11
+ - bundle exec rspec
12
+
9
13
  before_install: gem install bundler -v 2.0.2
@@ -4,7 +4,25 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [0.0.8] - 2020-07-16
8
+ * Added retrieve_all endpoint to attachments to retrieve all attachments of a property
9
+ * Added destroy endpoint to attachments to destroy an attachment of a property
10
+
11
+ ## [0.0.7] - 2020-03-30
12
+ * Improve error handling. Catching a `InvalidRequest` error still works, but now
13
+ there are additional errors for a more fine-grained error-handling. Namely
14
+ `ResourceNotFound`, `CommonResourceNotFound` and `ResourceValidation`.
15
+ * Add `rubocop`, `rubocop-rspec` and `rubocop-performance`
16
+ * Build with Ruby `2.6.5` on Travis
17
+
18
+ ## [0.0.6] - 2020-02-18
19
+ Adding update endpoint to update a property
20
+
21
+ ## [0.0.5] - 2020-02-06
22
+ Adding show endpoint to retrieve a single property
23
+
24
+ ## [0.0.4] - 2019-10-17
25
+ Adding endpoint to update order of attachments for a specific property
8
26
 
9
27
  ## [0.0.3] - 2019-08-15
10
28
  Update the response accord to the Immobilienscout changes in the `JSON` structure
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- immobilienscout (0.0.2)
4
+ immobilienscout (0.0.8)
5
5
  activesupport
6
6
  json
7
7
  multipart-post
@@ -9,46 +9,67 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- activesupport (5.2.3)
12
+ activesupport (5.2.4.3)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 0.7, < 2)
15
15
  minitest (~> 5.1)
16
16
  tzinfo (~> 1.1)
17
- addressable (2.6.0)
18
- public_suffix (>= 2.0.2, < 4.0)
17
+ addressable (2.7.0)
18
+ public_suffix (>= 2.0.2, < 5.0)
19
+ ast (2.4.0)
19
20
  byebug (9.1.0)
20
- concurrent-ruby (1.1.5)
21
+ concurrent-ruby (1.1.6)
21
22
  crack (0.4.3)
22
23
  safe_yaml (~> 1.0.0)
23
24
  diff-lcs (1.3)
24
- hashdiff (1.0.0)
25
- i18n (1.6.0)
25
+ hashdiff (1.0.1)
26
+ i18n (1.8.3)
26
27
  concurrent-ruby (~> 1.0)
27
- json (2.2.0)
28
- minitest (5.11.3)
28
+ jaro_winkler (1.5.4)
29
+ json (2.3.1)
30
+ minitest (5.14.1)
29
31
  multipart-post (2.1.1)
30
- public_suffix (3.1.1)
32
+ parallel (1.19.1)
33
+ parser (2.7.0.5)
34
+ ast (~> 2.4.0)
35
+ public_suffix (4.0.3)
36
+ rainbow (3.0.0)
31
37
  rake (12.3.3)
32
- rspec (3.8.0)
33
- rspec-core (~> 3.8.0)
34
- rspec-expectations (~> 3.8.0)
35
- rspec-mocks (~> 3.8.0)
36
- rspec-core (3.8.2)
37
- rspec-support (~> 3.8.0)
38
- rspec-expectations (3.8.4)
38
+ rexml (3.2.4)
39
+ rspec (3.9.0)
40
+ rspec-core (~> 3.9.0)
41
+ rspec-expectations (~> 3.9.0)
42
+ rspec-mocks (~> 3.9.0)
43
+ rspec-core (3.9.1)
44
+ rspec-support (~> 3.9.1)
45
+ rspec-expectations (3.9.1)
39
46
  diff-lcs (>= 1.2.0, < 2.0)
40
- rspec-support (~> 3.8.0)
41
- rspec-mocks (3.8.1)
47
+ rspec-support (~> 3.9.0)
48
+ rspec-mocks (3.9.1)
42
49
  diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.8.0)
44
- rspec-support (3.8.2)
50
+ rspec-support (~> 3.9.0)
51
+ rspec-support (3.9.2)
52
+ rubocop (0.80.1)
53
+ jaro_winkler (~> 1.5.1)
54
+ parallel (~> 1.10)
55
+ parser (>= 2.7.0.1)
56
+ rainbow (>= 2.2.2, < 4.0)
57
+ rexml
58
+ ruby-progressbar (~> 1.7)
59
+ unicode-display_width (>= 1.4.0, < 1.7)
60
+ rubocop-performance (1.5.2)
61
+ rubocop (>= 0.71.0)
62
+ rubocop-rspec (1.38.1)
63
+ rubocop (>= 0.68.1)
64
+ ruby-progressbar (1.10.1)
45
65
  safe_yaml (1.0.5)
46
66
  thread_safe (0.3.6)
47
67
  timecop (0.8.1)
48
- tzinfo (1.2.5)
68
+ tzinfo (1.2.7)
49
69
  thread_safe (~> 0.1)
50
- vcr (5.0.0)
51
- webmock (3.6.2)
70
+ unicode-display_width (1.6.1)
71
+ vcr (5.1.0)
72
+ webmock (3.8.3)
52
73
  addressable (>= 2.3.6)
53
74
  crack (>= 0.3.2)
54
75
  hashdiff (>= 0.4.0, < 2.0.0)
@@ -62,9 +83,12 @@ DEPENDENCIES
62
83
  immobilienscout!
63
84
  rake (~> 12.0)
64
85
  rspec (~> 3.0)
86
+ rubocop (~> 0.72)
87
+ rubocop-performance
88
+ rubocop-rspec
65
89
  timecop (~> 0.8.1)
66
90
  vcr (~> 5.0)
67
91
  webmock (~> 3.6)
68
92
 
69
93
  BUNDLED WITH
70
- 2.0.2
94
+ 2.1.4
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Immobilienscout gem
2
2
 
3
+ [![Build Status](https://travis-ci.com/homeday-de/immobilienscout.svg?branch=master)](https://travis-ci.com/homeday-de/immobilienscout)
4
+ [![Gem Version](https://badge.fury.io/rb/immobilienscout.svg)](https://badge.fury.io/rb/immobilienscout)
5
+ [![GitHub license](https://img.shields.io/github/license/homeday-de/immobilienscout)](https://github.com/homeday-de/immobilienscout/blob/master/LICENSE.txt)
6
+
3
7
  This is an interface for Immobilienscout API
4
8
 
5
9
  ## Example
@@ -28,15 +32,49 @@ Immobilienscout::API::Property.create({params})
28
32
  Immobilienscout::API::Property.publish({params})
29
33
  ```
30
34
 
35
+ - Update property
36
+ ```ruby
37
+ Immobilienscout::API::Property.update(is24_id, {params})
38
+ ```
39
+
40
+ _Notes:_
41
+
42
+ You have to send all attributes, also if only one attribute has changed. Otherwise Immobilienscout cannot interpret if a missing attribute should be filled in with NULL or not.
43
+
44
+ `is24_id` is the id returned by Immobilienscout when you first created the property.
45
+
46
+ If you have provided a custom id, you can use `"ext-#{custom_id}"` instead of the is24_id.
47
+
48
+
31
49
  - Delete property
32
50
  ```ruby
33
51
  Immobilienscout::API::Property.destroy(is24_id)
34
52
  ```
35
53
 
54
+ - Show property
55
+ ```ruby
56
+ Immobilienscout::API::Property.show(is24_id)
57
+ ```
58
+
36
59
  #### Attachment
37
60
  - Add attachments to property
38
61
  ```ruby
39
62
  Immobilienscout::API::Attachment.add(is24_id, binary_file, {metadata})
63
+ ```
64
+
65
+ - Order attachments for a specific property
66
+ ```ruby
67
+ Immobilienscout::API::Attachment.put_order(is24_id, {params})
68
+ ```
69
+
70
+ - Retrieve all attachments for a specific property
71
+ ```ruby
72
+ Immobilienscout::API::Attachment.retrieve_all(is24_id)
73
+ ```
74
+
75
+ - Delete an attachment for a specific property
76
+ ```ruby
77
+ Immobilienscout::API::Attachment.destroy(is24_id, attachment_id)
40
78
  ```
41
79
 
42
80
  #### Report
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
- require "bundler/setup"
4
- require "immobilienscout"
4
+ require 'bundler/setup'
5
+ require 'immobilienscout'
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +11,5 @@ require "immobilienscout"
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- require "irb"
14
+ require 'irb'
14
15
  IRB.start(__FILE__)
@@ -1,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'immobilienscout/version'
4
6
 
7
+ # rubocop:disable Metrics/BlockLength
5
8
  Gem::Specification.new do |spec|
6
9
  spec.name = 'immobilienscout'
7
10
  spec.version = Immobilienscout::VERSION
@@ -19,21 +22,25 @@ Gem::Specification.new do |spec|
19
22
 
20
23
  # Specify which files should be added to the gem when it is released.
21
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
26
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
27
  end
25
28
  spec.bindir = 'exe'
26
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
30
  spec.require_paths = ['lib']
28
31
 
32
+ spec.add_dependency 'activesupport'
29
33
  spec.add_dependency 'json'
30
34
  spec.add_dependency 'multipart-post'
31
- spec.add_dependency 'activesupport'
32
35
  spec.add_development_dependency 'bundler', '~> 2.0'
36
+ spec.add_development_dependency 'byebug', '~> 9.0'
33
37
  spec.add_development_dependency 'rake', '~> 12.0'
34
38
  spec.add_development_dependency 'rspec', '~> 3.0'
35
- spec.add_development_dependency 'byebug', '~> 9.0'
39
+ spec.add_development_dependency('rubocop', ['~>0.72'])
40
+ spec.add_development_dependency('rubocop-performance')
41
+ spec.add_development_dependency('rubocop-rspec')
36
42
  spec.add_development_dependency 'timecop', '~> 0.8.1'
37
43
  spec.add_development_dependency 'vcr', '~> 5.0'
38
44
  spec.add_development_dependency 'webmock', '~> 3.6'
39
45
  end
46
+ # rubocop:enable Metrics/BlockLength
@@ -1,13 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support'
2
4
  require 'active_support/core_ext'
3
5
  require 'immobilienscout/authenticator'
4
6
  require 'immobilienscout/request'
7
+ require 'immobilienscout/request_error_handler'
5
8
  require 'immobilienscout/response_parser'
6
9
  require 'immobilienscout/client'
7
10
  require 'immobilienscout/api/property'
8
11
  require 'immobilienscout/api/attachment'
9
12
  require 'immobilienscout/api/report'
10
13
  require 'immobilienscout/errors/invalid_request'
14
+ require 'immobilienscout/errors/common_resource_not_found'
15
+ require 'immobilienscout/errors/resource_not_found'
16
+ require 'immobilienscout/errors/resource_validation'
11
17
 
12
18
  module Immobilienscout
13
19
  class << self
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
4
  module API
3
5
  class Attachment
@@ -10,7 +12,41 @@ module Immobilienscout
10
12
  params = { attachment: binary_file, metadata: metadata_file }
11
13
  parsed_response = Immobilienscout::Request.new(url, params).post_with_multipart
12
14
 
13
- raise Immobilienscout::Errors::InvalidRequest, parsed_response.messages.map(&:messages) unless parsed_response.success?
15
+ unless parsed_response.success?
16
+ raise Immobilienscout::Errors::InvalidRequest, parsed_response.messages.map(&:messages)
17
+ end
18
+
19
+ parsed_response
20
+ end
21
+
22
+ def put_order(is24_id, params)
23
+ raise ArgumentError unless params.present?
24
+
25
+ parsed_response = Immobilienscout::Request.new(put_order_url(is24_id), params).put
26
+ unless parsed_response.success?
27
+ raise Immobilienscout::Errors::InvalidRequest, parsed_response.messages.map(&:messages)
28
+ end
29
+
30
+ parsed_response
31
+ end
32
+
33
+ def retrieve_all(is24_id)
34
+ raise ArgumentError unless is24_id.present?
35
+
36
+ url = retrieve_all_url(is24_id)
37
+ parsed_response = Immobilienscout::Request.new(url).get
38
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
39
+
40
+ parsed_response
41
+ end
42
+
43
+ def destroy(is24_id, attachment_id)
44
+ raise ArgumentError unless is24_id.present?
45
+ raise ArgumentError unless attachment_id.present?
46
+
47
+ url = destroy_url(is24_id, attachment_id)
48
+ parsed_response = Immobilienscout::Request.new(url).delete
49
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
14
50
 
15
51
  parsed_response
16
52
  end
@@ -25,6 +61,21 @@ module Immobilienscout
25
61
  def add_url(is24_id)
26
62
  "#{Immobilienscout::Client.api_url}/restapi/api/offer/v1.0/user/me/realestate/#{is24_id}/attachment"
27
63
  end
64
+
65
+ def put_order_url(is24_id)
66
+ "#{Immobilienscout::Client.api_url}/restapi/api/"\
67
+ "offer/v1.0/user/me/realestate/#{is24_id}/attachment/attachmentsorder"
68
+ end
69
+
70
+ def retrieve_all_url(is24_id)
71
+ "#{Immobilienscout::Client.api_url}/restapi/api/"\
72
+ "offer/v1.0/user/me/realestate/#{is24_id}/attachment"
73
+ end
74
+
75
+ def destroy_url(is24_id, attachment_id)
76
+ "#{Immobilienscout::Client.api_url}/restapi/api/"\
77
+ "offer/v1.0/user/me/realestate/#{is24_id}/attachment/#{attachment_id}"
78
+ end
28
79
  end
29
80
  end
30
81
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
4
  module API
3
5
  module Property
@@ -8,6 +10,14 @@ module Immobilienscout
8
10
  execute_post_request(create_url, params)
9
11
  end
10
12
 
13
+ def update(is24_id, params)
14
+ raise ArgumentError unless params.present?
15
+
16
+ update_url = update_url(is24_id)
17
+
18
+ execute_put_request(update_url, params)
19
+ end
20
+
11
21
  def publish(params)
12
22
  raise ArgumentError unless params.present?
13
23
 
@@ -22,18 +32,40 @@ module Immobilienscout
22
32
  execute_delete_request(destroy_url)
23
33
  end
24
34
 
35
+ def show(is24_id)
36
+ raise ArgumentError unless is24_id.present?
37
+
38
+ show_url = show_url(is24_id)
39
+
40
+ execute_get_request(show_url)
41
+ end
42
+
25
43
  private
26
44
 
27
45
  def execute_post_request(url, params)
28
46
  parsed_response = Immobilienscout::Request.new(url, params).post
29
- raise Immobilienscout::Errors::InvalidRequest, parsed_response.messages.map(&:messages) unless parsed_response.success?
47
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
48
+
49
+ parsed_response
50
+ end
51
+
52
+ def execute_put_request(url, params)
53
+ parsed_response = Immobilienscout::Request.new(url, params).put
54
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
30
55
 
31
56
  parsed_response
32
57
  end
33
58
 
34
59
  def execute_delete_request(url)
35
60
  parsed_response = Immobilienscout::Request.new(url).delete
36
- raise Immobilienscout::Errors::InvalidRequest, parsed_response.messages.map(&:messages) unless parsed_response.success?
61
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
62
+
63
+ parsed_response
64
+ end
65
+
66
+ def execute_get_request(url)
67
+ parsed_response = Immobilienscout::Request.new(url).get
68
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
37
69
 
38
70
  parsed_response
39
71
  end
@@ -42,6 +74,10 @@ module Immobilienscout
42
74
  "#{Immobilienscout::Client.api_url}/restapi/api/offer/v1.0/user/me/realestate"
43
75
  end
44
76
 
77
+ def update_url(is24_id)
78
+ "#{Immobilienscout::Client.api_url}/restapi/api/offer/v1.0/user/me/realestate/#{is24_id}"
79
+ end
80
+
45
81
  def publish_url
46
82
  "#{Immobilienscout::Client.api_url}/restapi/api/offer/v1.0/publish"
47
83
  end
@@ -49,6 +85,10 @@ module Immobilienscout
49
85
  def destroy_url(is24_id)
50
86
  "#{Immobilienscout::Client.api_url}/restapi/api/offer/v1.0/user/me/realestate/#{is24_id}"
51
87
  end
88
+
89
+ def show_url(is24_id)
90
+ "#{Immobilienscout::Client.api_url}/restapi/api/offer/v1.0/user/me/realestate/#{is24_id}"
91
+ end
52
92
  end
53
93
  end
54
94
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
4
  module API
3
5
  class Report
@@ -15,7 +17,7 @@ module Immobilienscout
15
17
 
16
18
  def execute_get_request(url, query_params)
17
19
  parsed_response = Immobilienscout::Request.new(url, query_params).get
18
- raise Immobilienscout::Errors::InvalidRequest, Array.wrap(parsed_response.messages['message']) unless parsed_response.success?
20
+ Immobilienscout::RequestErrorHandler.handle(parsed_response) unless parsed_response.success?
19
21
 
20
22
  parsed_response
21
23
  end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'open-uri'
2
4
 
3
5
  module Immobilienscout
4
6
  class Authenticator
5
- ALLOWED_METHODS = %w(POST GET DELETE).freeze
6
- OAUTH_SIGNATURE_METHOD = 'HMAC-SHA1'.freeze
7
- OAUTH_VERSION = '1.0'.freeze
8
- HASH_DIGEST = 'sha1'.freeze
7
+ ALLOWED_METHODS = %w[POST GET DELETE PUT].freeze
8
+ OAUTH_SIGNATURE_METHOD = 'HMAC-SHA1'
9
+ OAUTH_VERSION = '1.0'
10
+ HASH_DIGEST = 'sha1'
9
11
 
10
12
  def initialize(url, method, query_params = nil)
11
13
  @url = url
@@ -40,14 +42,15 @@ module Immobilienscout
40
42
  end
41
43
 
42
44
  def signing_key
43
- "#{url_encode(Immobilienscout.configuration.consumer_secret)}&#{url_encode(Immobilienscout.configuration.access_token_secret)}"
45
+ "#{url_encode(Immobilienscout.configuration.consumer_secret)}&"\
46
+ "#{url_encode(Immobilienscout.configuration.access_token_secret)}"
44
47
  end
45
48
 
46
49
  def generate_nonce
47
50
  Base64.encode64(random_bytes).gsub(/\W/, '')
48
51
  end
49
52
 
50
- def random_bytes(size=7)
53
+ def random_bytes(size = 7)
51
54
  OpenSSL::Random.random_bytes(size)
52
55
  end
53
56
 
@@ -80,7 +83,7 @@ module Immobilienscout
80
83
  end
81
84
 
82
85
  def auth_header_string(params)
83
- header_params = params.each_with_object('OAuth ') do |(key, value), header|
86
+ header_params = params.each_with_object(+'OAuth ') do |(key, value), header|
84
87
  header << "#{key}=#{value},"
85
88
  end
86
89
  header_params.chop
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
4
  class Client
3
- SANDBOX_URL = 'https://rest.sandbox-immobilienscout24.de'.freeze
4
- LIVE_URL = 'https://rest.immobilienscout24.de'.freeze
5
+ SANDBOX_URL = 'https://rest.sandbox-immobilienscout24.de'
6
+ LIVE_URL = 'https://rest.immobilienscout24.de'
5
7
 
6
8
  def self.api_url
7
9
  return SANDBOX_URL if Immobilienscout.configuration.use_sandbox
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Immobilienscout
4
+ module Errors
5
+ class CommonResourceNotFound < InvalidRequest
6
+ end
7
+ end
8
+ end
@@ -1,9 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
4
  module Errors
3
5
  class InvalidRequest < StandardError
4
- def initialize(msg = message)
5
- super
6
- end
7
6
  end
8
7
  end
9
8
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Immobilienscout
4
+ module Errors
5
+ class ResourceNotFound < InvalidRequest
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Immobilienscout
4
+ module Errors
5
+ class ResourceValidation < InvalidRequest
6
+ end
7
+ end
8
+ end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http/post/multipart'
2
4
  require 'uri'
3
5
 
4
6
  module Immobilienscout
5
7
  class Request
6
- def initialize(url, params = nil)
8
+ def initialize(url, params = {})
7
9
  @url = url
8
10
  @params = params
9
11
 
@@ -48,6 +50,19 @@ module Immobilienscout
48
50
  execute_request(uri, request)
49
51
  end
50
52
 
53
+ def put
54
+ auth_header = generate_auth_header('PUT')
55
+ headers = generate_headers(auth_header)
56
+
57
+ uri = URI.parse(@url)
58
+
59
+ request = Net::HTTP::Put.new(uri)
60
+ request.body = @params.to_json
61
+ request.initialize_http_header(headers)
62
+
63
+ execute_request(uri, request)
64
+ end
65
+
51
66
  def delete
52
67
  auth_header = generate_auth_header('DELETE')
53
68
  headers = generate_headers(auth_header)
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Immobilienscout
4
+ module RequestErrorHandler
5
+ class << self
6
+ ERROR_RESOURCE_NOT_FOUND = 'ERROR_RESOURCE_NOT_FOUND'
7
+ ERROR_COMMON_RESOURCE_NOT_FOUND = 'ERROR_COMMON_RESOURCE_NOT_FOUND'
8
+ ERROR_RESOURCE_VALIDATION = 'ERROR_RESOURCE_VALIDATION'
9
+
10
+ def handle(parsed_response)
11
+ if parsed_response.messages.is_a?(Array)
12
+ error_code = parsed_response.messages&.first&.code
13
+ error_messages = parsed_response.messages.map(&:messages)
14
+ else
15
+ error_code = parsed_response.messages['messageCode']
16
+ error_messages = Array.wrap(parsed_response.messages['message'])
17
+ end
18
+
19
+ error_class = error_class(error_code)
20
+ raise error_class, error_messages
21
+ end
22
+
23
+ private
24
+
25
+ def error_class(error_code)
26
+ case error_code
27
+ when ERROR_RESOURCE_NOT_FOUND
28
+ Immobilienscout::Errors::ResourceNotFound
29
+ when ERROR_COMMON_RESOURCE_NOT_FOUND
30
+ Immobilienscout::Errors::CommonResourceNotFound
31
+ when ERROR_RESOURCE_VALIDATION
32
+ Immobilienscout::Errors::ResourceValidation
33
+ else
34
+ Immobilienscout::Errors::InvalidRequest
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
4
  class ResponseParser
3
- HTTP_OK = %w(200 201).freeze
5
+ HTTP_OK = %w[200 201].freeze
4
6
 
5
7
  Message = Struct.new(:success?, :code, :messages, :id)
6
8
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Immobilienscout
2
- VERSION = '0.0.3'.freeze
4
+ VERSION = '0.0.8'
3
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: immobilienscout
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Homeday GmbH
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-15 00:00:00.000000000 Z
11
+ date: 2020-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: json
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: multipart-post
28
+ name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: activesupport
42
+ name: multipart-post
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: byebug
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '9.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '9.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -95,19 +109,47 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '3.0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: byebug
112
+ name: rubocop
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '9.0'
117
+ version: '0.72'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '9.0'
124
+ version: '0.72'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-performance
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop-rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: timecop
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -160,6 +202,7 @@ extra_rdoc_files: []
160
202
  files:
161
203
  - ".gitignore"
162
204
  - ".rspec"
205
+ - ".rubocop.yml"
163
206
  - ".travis.yml"
164
207
  - CHANGELOG.md
165
208
  - CODE_OF_CONDUCT.md
@@ -177,8 +220,12 @@ files:
177
220
  - lib/immobilienscout/api/report.rb
178
221
  - lib/immobilienscout/authenticator.rb
179
222
  - lib/immobilienscout/client.rb
223
+ - lib/immobilienscout/errors/common_resource_not_found.rb
180
224
  - lib/immobilienscout/errors/invalid_request.rb
225
+ - lib/immobilienscout/errors/resource_not_found.rb
226
+ - lib/immobilienscout/errors/resource_validation.rb
181
227
  - lib/immobilienscout/request.rb
228
+ - lib/immobilienscout/request_error_handler.rb
182
229
  - lib/immobilienscout/response_parser.rb
183
230
  - lib/immobilienscout/version.rb
184
231
  homepage: https://github.com/homeday-de/immobilienscout