datashake-ruby-sdk 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +13 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +21 -0
- data/README.md +59 -0
- data/Rakefile +10 -0
- data/lib/datashake-ruby-sdk/review_scraper/client.rb +66 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/bulk_response.rb +23 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/error.rb +17 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/job_instance.rb +24 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/jobs_instance.rb +18 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profile_instance.rb +33 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles/add.rb +76 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles/add_bulk.rb +36 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles/info.rb +34 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles/job.rb +35 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles/jobs.rb +52 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles/reviews.rb +64 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/profiles.rb +48 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/response.rb +18 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/review_instance.rb +29 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2/review_response_instance.rb +18 -0
- data/lib/datashake-ruby-sdk/review_scraper/v2.rb +54 -0
- data/lib/datashake-ruby-sdk/review_scraper.rb +8 -0
- data/lib/datashake-ruby-sdk/types.rb +12 -0
- data/lib/datashake-ruby-sdk/version.rb +5 -0
- data/lib/datashake-ruby-sdk.rb +8 -0
- data/sig/datashake-ruby-sdk.rbs +4 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1e9bef7b0a5f2b6c4722b987796279e4699aa1f9e6fdf1eabf26bfde0fa65963
|
4
|
+
data.tar.gz: 28126f4e94e3cde865901dbaa0dd0edd6cc71c110e1ca0f22b8ae680758ecfda
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f3332643deab9ec63978d325db02d3584d3de04589b12b3b442dddf6edeffd1073349edcfd6c095bf6845c63cdb6905d5e27e0e4380b0756c1c5dbbe9ce73fc2
|
7
|
+
data.tar.gz: d71f31d8b30f75f22571bd47249617540b9c1a54954ba34e6cdb7da24be8583c39babaf9b39e52b09351ce40700085387595fd3ba2a81655eeac7f5117234dba
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2022 Laura Paakkinen
|
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
|
13
|
+
all 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
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# datashake-ruby-sdk
|
2
|
+
|
3
|
+
An API wrapper written in ruby for Datashake API
|
4
|
+
https://docs.datashake.com/
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Install the gem and add to the application's Gemfile by executing:
|
9
|
+
|
10
|
+
$ bundle add datashake-ruby-sdk
|
11
|
+
|
12
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
13
|
+
|
14
|
+
$ gem install datashake-ruby-sdk
|
15
|
+
|
16
|
+
## Usage
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
client = Datashake::ReviewScaper::Client.new(token: 'your-api-token')
|
20
|
+
|
21
|
+
response = client # Add a review profile by url
|
22
|
+
.add_profile
|
23
|
+
.url("https://www.amazon.com/dp/B003YH9MMI")
|
24
|
+
.from_date("2021-01-01")
|
25
|
+
.fetch
|
26
|
+
|
27
|
+
response.success => true
|
28
|
+
response.job_id => 346998013
|
29
|
+
response.status => 200
|
30
|
+
response.message => "Added this profile to the queue..."
|
31
|
+
|
32
|
+
client # Add a review profile by google search query
|
33
|
+
.add_profile
|
34
|
+
.query("I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA")
|
35
|
+
.fetch
|
36
|
+
|
37
|
+
client.info.job_id(346998013).fetch # Fetch job details
|
38
|
+
|
39
|
+
client.reviews.job_id(346998013).page(2).per_page(10).fetch # Fetch reviews for the given job
|
40
|
+
```
|
41
|
+
|
42
|
+
## Development
|
43
|
+
|
44
|
+
After checking out the repo, run `bin/setup` to install dependencies.
|
45
|
+
Then, run `rake spec` to run the tests.
|
46
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
47
|
+
|
48
|
+
This gem uses [standardrb](https://github.com/testdouble/standard) for code style. Just write your code and run `bundle exec rake standard:fix`.
|
49
|
+
|
50
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
51
|
+
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
52
|
+
|
53
|
+
## Contributing
|
54
|
+
|
55
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/reviewshake/datashake-ruby-sdk.
|
56
|
+
|
57
|
+
## License
|
58
|
+
|
59
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "faraday"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class Client
|
8
|
+
BASE_URL = "https://app.datashake.com"
|
9
|
+
|
10
|
+
def initialize(token:, adapter: Faraday.default_adapter, timeout: 30, open_timeout: 30)
|
11
|
+
@token = token
|
12
|
+
@adapter = adapter
|
13
|
+
@timeout = timeout
|
14
|
+
@open_timeout = open_timeout
|
15
|
+
end
|
16
|
+
|
17
|
+
def connection
|
18
|
+
@connection ||= Faraday.new do |conn|
|
19
|
+
conn.headers = {"spiderman-token" => token}
|
20
|
+
conn.url_prefix = BASE_URL
|
21
|
+
conn.request(:json)
|
22
|
+
conn.response(:json, content_type: "application/json")
|
23
|
+
conn.options.timeout = timeout
|
24
|
+
conn.options.open_timeout = open_timeout
|
25
|
+
conn.adapter(adapter)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def v2
|
30
|
+
@v2 ||= V2.new(self)
|
31
|
+
end
|
32
|
+
|
33
|
+
def profiles
|
34
|
+
v2.profiles
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_profile
|
38
|
+
v2.profiles.add
|
39
|
+
end
|
40
|
+
|
41
|
+
def add_profiles
|
42
|
+
v2.profiles.add_bulk
|
43
|
+
end
|
44
|
+
|
45
|
+
def jobs
|
46
|
+
v2.profiles.jobs
|
47
|
+
end
|
48
|
+
|
49
|
+
def job(job_id)
|
50
|
+
v2.profiles.job.job_id(job_id)
|
51
|
+
end
|
52
|
+
|
53
|
+
def info(job_id)
|
54
|
+
v2.profiles.info.job_id(job_id)
|
55
|
+
end
|
56
|
+
|
57
|
+
def reviews(job_id)
|
58
|
+
v2.profiles.reviews.job_id(job_id)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
attr_reader :token, :adapter, :timeout, :open_timeout
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class BulkResponse < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :success, Datashake::Types::Strict::Bool
|
12
|
+
attribute :job_id, Datashake::Types::Strict::Integer
|
13
|
+
attribute :status, Datashake::Types::Strict::Integer
|
14
|
+
attribute :message, Datashake::Types::Strict::String
|
15
|
+
|
16
|
+
attribute? :from_date, Datashake::Types::Params::Date.optional
|
17
|
+
attribute? :blocks, Datashake::Types::Params::Integer.optional
|
18
|
+
attribute? :diff, Datashake::Types::Strict::Integer.optional
|
19
|
+
attribute? :callback, Datashake::Types::Strict::String.optional
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class JobInstance < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :job_id, Datashake::Types::Strict::Integer
|
12
|
+
attribute :url, Datashake::Types::Strict::String
|
13
|
+
attribute? :place_id, Datashake::Types::Strict::String.optional
|
14
|
+
attribute :status, Datashake::Types::Strict::String # Enum
|
15
|
+
attribute :last_crawl, Datashake::Types::Params::Date
|
16
|
+
attribute :from_date, Datashake::Types::Params::Date.optional
|
17
|
+
attribute? :blocks, Datashake::Types::Strict::Integer.optional
|
18
|
+
attribute? :diff, Datashake::Types::Strict::Integer.optional
|
19
|
+
attribute :credits_used, Datashake::Types::Strict::Integer.optional
|
20
|
+
attribute? :created_at, Datashake::Types::Params::Date
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class JobsInstance < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :jobs, Types::Array.of(Datashake::ReviewScraper::V2::JobInstance)
|
12
|
+
attribute :total, Datashake::Types::Strict::Integer
|
13
|
+
attribute :per_page, Datashake::Types::Strict::Integer
|
14
|
+
attribute :page, Datashake::Types::Strict::Integer
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class ProfileInstance < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :success, Datashake::Types::Strict::Bool
|
12
|
+
attribute :status, Datashake::Types::Strict::Integer
|
13
|
+
attribute :job_id, Datashake::Types::Strict::Integer
|
14
|
+
attribute :source_url, Datashake::Types::Strict::String
|
15
|
+
attribute :source_name, Datashake::Types::Strict::String
|
16
|
+
attribute :place_id, Datashake::Types::Strict::String.optional
|
17
|
+
attribute :external_identifier, Datashake::Types::Strict::String.optional
|
18
|
+
attribute :meta_data, Datashake::Types::Metadata
|
19
|
+
attribute :unique_id, Datashake::Types::Strict::String.optional
|
20
|
+
attribute :review_count, Datashake::Types::Strict::Integer
|
21
|
+
attribute :average_rating, Datashake::Types::Strict::Float
|
22
|
+
attribute :last_crawl, Datashake::Types::Params::Date
|
23
|
+
attribute :crawl_status, Datashake::Types::Strict::String
|
24
|
+
attribute :percentage_complete, Datashake::Types::Strict::Integer
|
25
|
+
attribute :result_count, Datashake::Types::Strict::Integer
|
26
|
+
attribute :credits_used, Datashake::Types::Strict::Integer
|
27
|
+
attribute :from_date, Datashake::Types::Params::Date.optional
|
28
|
+
attribute :blocks, Datashake::Types::Strict::Integer.optional
|
29
|
+
attribute? :reviews, Datashake::Types::ReviewCollection
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
class Add
|
8
|
+
PATH = "api/v2/profiles/add"
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
@params = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def url(url)
|
16
|
+
@params[:url] = url
|
17
|
+
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def query(query)
|
22
|
+
@params[:query] = query
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def place_id(place_id)
|
28
|
+
@params[:place_id] = place_id
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def from_date(date)
|
34
|
+
@params[:from_date] = date
|
35
|
+
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def blocks(blocks)
|
40
|
+
@params[:blocks] = blocks
|
41
|
+
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def diff(diff)
|
46
|
+
@params[:diff] = diff
|
47
|
+
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def callback(callback)
|
52
|
+
@params[:callback] = callback
|
53
|
+
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def external_identifier(id)
|
58
|
+
@params[:external_identifier] = id
|
59
|
+
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def fetch
|
64
|
+
response = version.fetch(method: :post, path: PATH, params: params)
|
65
|
+
|
66
|
+
Datashake::ReviewScraper::V2::Response.new(response)
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
attr_reader :version, :params
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
class AddBulk
|
8
|
+
PATH = "api/v2/profiles/add_bulk"
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
@body = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def payload(ary)
|
16
|
+
@body = ary
|
17
|
+
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch
|
22
|
+
response = version.fetch(method: :post, path: PATH, body: body)
|
23
|
+
|
24
|
+
response.map do |item|
|
25
|
+
Datashake::ReviewScraper::V2::BulkResponse.new(item)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :version, :body
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
class Info
|
8
|
+
PATH = "api/v2/profiles/info"
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
@params = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def job_id(job_id)
|
16
|
+
@params[:job_id] = job_id
|
17
|
+
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch
|
22
|
+
response = version.fetch(method: :get, path: PATH, params: params)
|
23
|
+
|
24
|
+
Datashake::ReviewScraper::V2::ProfileInstance.new(response)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :version, :params
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
class Job
|
8
|
+
PATH = "api/v2/profiles/jobs"
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
@params = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def job_id(job_id)
|
16
|
+
@params[:job_id] = job_id
|
17
|
+
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch
|
22
|
+
path = "#{PATH}/#{params[:job_id]}"
|
23
|
+
response = version.fetch(method: :get, path: path)
|
24
|
+
|
25
|
+
Datashake::ReviewScraper::V2::JobInstance.new(response)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :version, :params
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
class Jobs
|
8
|
+
PATH = "api/v2/profiles/jobs"
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
@params = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def from_created_at(from_created_at)
|
16
|
+
@params[:from_created_at] = from_created_at
|
17
|
+
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def crawl_status(crawl_status)
|
22
|
+
@params[:crawl_status] = crawl_status
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def page(page)
|
28
|
+
@params[:page] = page
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def per_page(per_page)
|
34
|
+
@params[:per_page] = per_page
|
35
|
+
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def fetch
|
40
|
+
response = version.fetch(method: :get, path: PATH, params: params)
|
41
|
+
|
42
|
+
Datashake::ReviewScraper::V2::JobsInstance.new(response)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
attr_reader :version, :params
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
class Reviews
|
8
|
+
PATH = "api/v2/profiles/reviews"
|
9
|
+
|
10
|
+
def initialize(version)
|
11
|
+
@version = version
|
12
|
+
@params = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def job_id(job_id)
|
16
|
+
@params[:job_id] = job_id
|
17
|
+
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def from_date(from_date)
|
22
|
+
@params[:from_date] = from_date
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def language_code(language_code)
|
28
|
+
@params[:language_code] = language_code
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def page(page)
|
34
|
+
@params[:page] = page
|
35
|
+
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def per_page(per_page)
|
40
|
+
@params[:per_page] = per_page
|
41
|
+
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def allow_response(allow_response)
|
46
|
+
@params[:allow_response] = allow_response
|
47
|
+
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch
|
52
|
+
response = version.fetch(method: :get, path: PATH, params: params)
|
53
|
+
|
54
|
+
Datashake::ReviewScraper::V2::ProfileInstance.new(response)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
attr_reader :version, :params
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
class Profiles
|
7
|
+
autoload :Add, "datashake-ruby-sdk/review_scraper/v2/profiles/add"
|
8
|
+
autoload :AddBulk, "datashake-ruby-sdk/review_scraper/v2/profiles/add_bulk"
|
9
|
+
autoload :Jobs, "datashake-ruby-sdk/review_scraper/v2/profiles/jobs"
|
10
|
+
autoload :Job, "datashake-ruby-sdk/review_scraper/v2/profiles/job"
|
11
|
+
autoload :Info, "datashake-ruby-sdk/review_scraper/v2/profiles/info"
|
12
|
+
autoload :Reviews, "datashake-ruby-sdk/review_scraper/v2/profiles/reviews"
|
13
|
+
|
14
|
+
def initialize(version)
|
15
|
+
@version = version
|
16
|
+
end
|
17
|
+
|
18
|
+
def add
|
19
|
+
Add.new(version)
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_bulk
|
23
|
+
AddBulk.new(version)
|
24
|
+
end
|
25
|
+
|
26
|
+
def jobs
|
27
|
+
Jobs.new(version)
|
28
|
+
end
|
29
|
+
|
30
|
+
def job
|
31
|
+
Job.new(version)
|
32
|
+
end
|
33
|
+
|
34
|
+
def info
|
35
|
+
Info.new(version)
|
36
|
+
end
|
37
|
+
|
38
|
+
def reviews
|
39
|
+
Reviews.new(version)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
attr_reader :version
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class Response < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :success, Datashake::Types::Strict::Bool
|
12
|
+
attribute? :job_id, Datashake::Types::Strict::Integer
|
13
|
+
attribute :status, Datashake::Types::Strict::Integer
|
14
|
+
attribute :message, Datashake::Types::Strict::String
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class ReviewInstance < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :id, Datashake::Types::Strict::Integer
|
12
|
+
attribute :name, Datashake::Types::Strict::String
|
13
|
+
attribute :date, Datashake::Types::Params::Date
|
14
|
+
attribute :rating_value, Datashake::Types::Strict::Float
|
15
|
+
attribute :review_text, Datashake::Types::Strict::String.optional
|
16
|
+
attribute :url, Datashake::Types::Strict::String
|
17
|
+
attribute :profile_picture, Datashake::Types::Strict::String.optional
|
18
|
+
attribute :location, Datashake::Types::Strict::String.optional
|
19
|
+
attribute :review_title, Datashake::Types::Strict::String.optional
|
20
|
+
attribute :verified_order, Datashake::Types::Strict::Bool
|
21
|
+
attribute :language_code, Datashake::Types::Strict::String.optional
|
22
|
+
attribute :reviewer_title, Datashake::Types::Strict::String.optional
|
23
|
+
attribute :unique_id, Datashake::Types::Strict::String
|
24
|
+
attribute :meta_data, Datashake::Types::Metadata.optional
|
25
|
+
attribute? :response, Datashake::ReviewScraper::V2::ReviewResponseInstance
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module ReviewScraper
|
7
|
+
class V2
|
8
|
+
class ReviewResponseInstance < ::Dry::Struct
|
9
|
+
transform_keys(&:to_sym)
|
10
|
+
|
11
|
+
attribute :id, Datashake::Types::Strict::Integer
|
12
|
+
attribute :name, Datashake::Types::Strict::String
|
13
|
+
attribute :date, Datashake::Types::Params::Date
|
14
|
+
attribute :comment, Datashake::Types::Strict::String.optional
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datashake
|
4
|
+
module ReviewScraper
|
5
|
+
class V2
|
6
|
+
autoload :Error, "datashake-ruby-sdk/review_scraper/v2/error"
|
7
|
+
autoload :Profiles, "datashake-ruby-sdk/review_scraper/v2/profiles"
|
8
|
+
autoload :Response, "datashake-ruby-sdk/review_scraper/v2/response"
|
9
|
+
autoload :BulkResponse, "datashake-ruby-sdk/review_scraper/v2/bulk_response"
|
10
|
+
autoload :JobInstance, "datashake-ruby-sdk/review_scraper/v2/job_instance"
|
11
|
+
autoload :JobsInstance, "datashake-ruby-sdk/review_scraper/v2/jobs_instance"
|
12
|
+
autoload :ProfileInstance, "datashake-ruby-sdk/review_scraper/v2/profile_instance"
|
13
|
+
autoload :ReviewInstance, "datashake-ruby-sdk/review_scraper/v2/review_instance"
|
14
|
+
autoload :ReviewResponseInstance, "datashake-ruby-sdk/review_scraper/v2/review_response_instance"
|
15
|
+
|
16
|
+
def initialize(client)
|
17
|
+
@client = client
|
18
|
+
end
|
19
|
+
|
20
|
+
def profiles
|
21
|
+
@profiles ||= Profiles.new(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def connection
|
25
|
+
client.connection
|
26
|
+
end
|
27
|
+
|
28
|
+
def fetch(method:, path:, params: {}, body: {})
|
29
|
+
response = connection.public_send(method, path) do |request|
|
30
|
+
request.params = params
|
31
|
+
request.body = body.to_json
|
32
|
+
end
|
33
|
+
|
34
|
+
body = response.body
|
35
|
+
|
36
|
+
raise Datashake::ReviewScraper::V2::Error.new("Server error", 500) if response.status >= 500
|
37
|
+
|
38
|
+
return body if body.is_a?(Array)
|
39
|
+
return body if body["status"].is_a?(String)
|
40
|
+
return body if body["jobs"]
|
41
|
+
return body if body["status"] == 200
|
42
|
+
|
43
|
+
raise Datashake::ReviewScraper::V2::Error.new(
|
44
|
+
body["message"],
|
45
|
+
body.fetch("status", response.status)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
attr_reader :client
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry-struct"
|
4
|
+
|
5
|
+
module Datashake
|
6
|
+
module Types
|
7
|
+
include Dry.Types()
|
8
|
+
|
9
|
+
Metadata = Types.Constructor(Hash) { |json| ::JSON.parse(json) }
|
10
|
+
ReviewCollection = Types::Array.of(Datashake::ReviewScraper::V2::ReviewInstance)
|
11
|
+
end
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: datashake-ruby-sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Reviewshake <3 Datashake
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-09-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-struct
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.2'
|
41
|
+
description:
|
42
|
+
email:
|
43
|
+
- dev@shake.io
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- ".rspec"
|
49
|
+
- ".rubocop.yml"
|
50
|
+
- Gemfile
|
51
|
+
- LICENSE.txt
|
52
|
+
- README.md
|
53
|
+
- Rakefile
|
54
|
+
- lib/datashake-ruby-sdk.rb
|
55
|
+
- lib/datashake-ruby-sdk/review_scraper.rb
|
56
|
+
- lib/datashake-ruby-sdk/review_scraper/client.rb
|
57
|
+
- lib/datashake-ruby-sdk/review_scraper/v2.rb
|
58
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/bulk_response.rb
|
59
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/error.rb
|
60
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/job_instance.rb
|
61
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/jobs_instance.rb
|
62
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profile_instance.rb
|
63
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles.rb
|
64
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles/add.rb
|
65
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles/add_bulk.rb
|
66
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles/info.rb
|
67
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles/job.rb
|
68
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles/jobs.rb
|
69
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/profiles/reviews.rb
|
70
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/response.rb
|
71
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/review_instance.rb
|
72
|
+
- lib/datashake-ruby-sdk/review_scraper/v2/review_response_instance.rb
|
73
|
+
- lib/datashake-ruby-sdk/types.rb
|
74
|
+
- lib/datashake-ruby-sdk/version.rb
|
75
|
+
- sig/datashake-ruby-sdk.rbs
|
76
|
+
homepage: https://docs.datashake.com
|
77
|
+
licenses:
|
78
|
+
- MIT
|
79
|
+
metadata:
|
80
|
+
homepage_uri: https://docs.datashake.com
|
81
|
+
source_code_uri: https://github.com/reviewshake/datashake-ruby-sdk
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 2.7.0
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubygems_version: 3.3.7
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: An API wrapper for Datashake API
|
101
|
+
test_files: []
|