plagiarism-checker 1.0.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62f540b75e8fce69177d645e6c1b0b0c0b081c54
4
- data.tar.gz: 7cddcf56deb0f2a66bf2af731e7f72ae4c3ce906
3
+ metadata.gz: a856007784b1580e5c8ca554fc9a22ad847f854e
4
+ data.tar.gz: 7b3342e7458536584f404273815d4407c01fc31a
5
5
  SHA512:
6
- metadata.gz: 93cd5f553fa669824c0cda767f14536e0e78724e9e9d7eb4eb53a41b8e9091f01f9a8cb7d76ef91edf97ad7343cc03662ebee66920afb7a1aafcdc32c562ca52
7
- data.tar.gz: c679d5ecf82865dd8c627e1d84bcdab6f0abca6acd7cca1910b13ccb280bd7dd03f76be04d965e3f9f246966b0cf973d7b6e0aa249f9378d152b9deab8cd4d72
6
+ metadata.gz: 9262172bde5a793f4edf4cbe615520c5a23737cfd410fc364aaca2ed3da7cdee1c916b656133e240151e1a090ff7c47992d0654c8260f4b21c2ab80597ae1bbd
7
+ data.tar.gz: b082d51155d016a2a223f784ccdf80b928eb9c8803a62c9da020f7128d0ec663d68a9a348b1cf298c49bbb23baf692b1afcbc1922ee7a83f7a3f54c9f8650ae2
@@ -1,2 +1,2 @@
1
- Metrics/LineLength:
2
- Max: 120
1
+ Metrics/LineLength:
2
+ Max: 120
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in copyleaks_api.gemspec
4
- gemspec
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in copyleaks_api.gemspec
4
+ gemspec
@@ -1,21 +1,21 @@
1
- The MIT License(MIT)
2
-
3
- Copyright(c) 2016 Copyleaks LTD (https://copyleaks.com)
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.
1
+ The MIT License(MIT)
2
+
3
+ Copyright(c) 2016 Copyleaks LTD (https://copyleaks.com)
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/Rakefile CHANGED
@@ -1,2 +1,2 @@
1
- require "bundler/gem_tasks"
2
- task :default => :spec
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'bundler/setup'
4
- require 'copyleaks_api'
5
-
6
- require 'irb'
7
- IRB.start
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'copyleaks_api'
5
+
6
+ require 'irb'
7
+ IRB.start
data/bin/setup CHANGED
@@ -1,8 +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
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,50 @@
1
+ # Import the module
2
+ require_relative './lib/copyleaks_api'
3
+ # If you installed this library using gem install use this import
4
+ #require 'copyleaks_api'
5
+
6
+ # In order to use this API you need to register to Copyleaks at https://copyleaks.com/account/register
7
+ # Login using your account email and account key provided at api.copyleaks.com dashboards.
8
+ email = "<--YOUR-EMAIL-->"
9
+ api_key = "<--API-KEY-->"
10
+ # There are currently 3 available products - :businesses, :education, :websites
11
+ cloud = CopyleaksApi::CopyleaksCloud.new(email, api_key, :businesses)
12
+
13
+ # Check your account balance
14
+ puts "You have #{cloud.get_credits_balance} credits"
15
+
16
+ # Process Configuration
17
+ CopyleaksApi::Config.sandbox_mode = true # Sandbox mode will not consume any credits while returning dummy results
18
+ CopyleaksApi::Config.http_callback = 'http://yoursite.here/callback/completion/{PID}'
19
+ # For testing purposes you can use http://requestb.in
20
+
21
+ #CopyleaksApi::Config
22
+ # For more information: https://api.copyleaks.com/GeneralDocumentation/RequestHeaders
23
+ # Available configuration options:
24
+ #CopyleaksApi::Config do |config|
25
+ # config.sanbox_mode = true
26
+ # config.allow_partial_scan = true
27
+ # config.http_callback = 'http://yoursite.here/callback/{PID}'
28
+ # config.in_progress_result = 'http://yoursite.here/callback/results/{PID}'
29
+ # config.email_callback = 'your@email.com'
30
+ # config.custom_fields = { some_field: 'and its value' }
31
+ # config.compare_only = true # Only while using create-by-files
32
+ #end
33
+
34
+
35
+ # Create a process using one of the optional methods
36
+ # Available methods: create_by_url, create_by_text, create_by_file, create_by_files and create_by_ocr.
37
+ # For more information see our documentation on http://api.copyleaks.com/
38
+ begin
39
+ process = cloud.create_by_url("https://microsoft.com/")
40
+ #process = cloud.create_by_text("THE TEXT YOU WISH TO SCAN")
41
+ #process = cloud.create_by_file(path_to_file)
42
+ #processes = cloud.create_by_files(files_paths)
43
+ #process = cloud.create_by_ocr(path_to_image, language: 'en') # Requires the language of the text.
44
+ # Use cloud.get_ocr_languages to get the supported langauges.
45
+ # or take a look at this page: https://api.copyleaks.com/GeneralDocumentation/OcrLanguagesList
46
+
47
+ puts "Your scan(#{process.process_id}) was created successfully. We will trigger the callback soon."
48
+ rescue Exception => ex
49
+ puts "Failed to create new process with exception: #{ex}"
50
+ end
@@ -0,0 +1,73 @@
1
+ # Import the module
2
+ require_relative './lib/copyleaks_api'
3
+ # If you installed this library using gem install use this import
4
+ #require 'copyleaks_api'
5
+
6
+ # In order to use this API you need to register to Copyleaks at https://copyleaks.com/account/register
7
+ # Login using your account email and account key provided at api.copyleaks.com dashboards.
8
+ email = "<--YOUR-EMAIL-->"
9
+ api_key = "<--API-KEY-->"
10
+ # There are currently 3 available products - :businesses, :education, :websites
11
+ cloud = CopyleaksApi::CopyleaksCloud.new(email, api_key, :businesses)
12
+
13
+ # Check your account balance
14
+ puts "You have #{cloud.get_credits_balance} credits"
15
+
16
+ # Process Configuration
17
+ CopyleaksApi::Config.sandbox_mode = true # Sandbox mode will not consume any credits while returning fake results
18
+ #CopyleaksApi::Config
19
+ # For more information: https://api.copyleaks.com/GeneralDocumentation/RequestHeaders
20
+ # Available configuration options:
21
+ #CopyleaksApi::Config do |config|
22
+ # config.sanbox_mode = true
23
+ # config.allow_partial_scan = true
24
+ # config.http_callback = 'http://yoursite.here'
25
+ # config.in_progress_result = 'http://yoursite.here'
26
+ # config.email_callback = 'your@email.com'
27
+ # config.custom_fields = { some_field: 'and its value' }
28
+ # config.compare_only = true # Only while using create-by-files
29
+ #end
30
+
31
+
32
+ # Create a process using one of the optional methods
33
+ # Available methods: create_by_url, create_by_text, create_by_file, create_by_files and create_by_ocr.
34
+ # For more information see our documentation on http://api.copyleaks.com/
35
+ process = cloud.create_by_url("https://copyleaks.com/")
36
+ #process = cloud.create_by_text("THE TEXT YOU WISH TO SCAN")
37
+ #process = cloud.create_by_file(path_to_file)
38
+ #processes = cloud.create_by_files(files_paths)
39
+ #process = cloud.create_by_ocr(path_to_image, language: 'en') # Requires the language of the text.
40
+ # Use cloud.get_ocr_languages to get the supported langauges.
41
+ # or take a look at this page: https://api.copyleaks.com/GeneralDocumentation/OcrLanguagesList
42
+
43
+ puts "Processing Started"
44
+
45
+ # Now we will check the status of the process until its done
46
+ # **We highly recommend to use the http_callback option at the config in order to get a callback once the process is finished**
47
+ # For more info visit: https://api.copyleaks.com/GeneralDocumentation/RequestHeaders
48
+ while process.processing?
49
+ sleep(1)
50
+ process.update_status
51
+ puts "#"*(process.progress/2) + "-"*(50 - process.progress/2) + "#{process.progress}%"
52
+ end
53
+
54
+ puts "Processing Ended"
55
+ # to get our results from processing we can just call correspond method
56
+ results = process.get_results
57
+
58
+ puts "#{results.size} Results: "
59
+ results.each do |res|
60
+ #puts cloud.get_comparison_report(res)
61
+ #puts cloud.get_raw_text(res)
62
+ puts res.to_s
63
+ end
64
+
65
+ # Delete the created process
66
+ #puts process.delete
67
+
68
+ # In order to get all your past processes
69
+ #processes = cloud.get_processes
70
+ #puts "Overall you have #{processes.size} processes"
71
+ #processes.each do |res|
72
+ # puts res.to_s
73
+ #end
@@ -3,9 +3,10 @@ unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
3
3
  end
4
4
  require 'copyleaks_api/version'
5
5
 
6
- require 'copyleaks_api/language'
7
6
  require 'copyleaks_api/errors'
8
7
 
8
+ require 'copyleaks_api/Models/ResultRecord'
9
+
9
10
  require 'copyleaks_api/validators/custom_fields_validator'
10
11
  require 'copyleaks_api/validators/email_validator'
11
12
  require 'copyleaks_api/validators/file_validator'
@@ -0,0 +1,58 @@
1
+ module CopyleaksApi
2
+ class ResultRecord
3
+ def initialize(response)
4
+ @URL = response['URL']
5
+ @Percents = response['Percents']
6
+ @NumberOfCopiedWords = response['NumberOfCopiedWords']
7
+ @CachedVersion = response['CachedVersion']
8
+ @Title = response['Title']
9
+ @Introduction = response['Introduction']
10
+ @ComparisonReport = response['ComparisonReport']
11
+ @EmbededComparison = response['EmbededComparison']
12
+ end
13
+
14
+ def get_url
15
+ @URL
16
+ end
17
+
18
+ def get_percents
19
+ @Percents
20
+ end
21
+
22
+ def get_number_of_copied_words
23
+ @NumberOfCopiedWords
24
+ end
25
+
26
+ def get_cached_version
27
+ @CachedVersion
28
+ end
29
+
30
+ def get_title
31
+ @Title
32
+ end
33
+
34
+ def get_introduction
35
+ @Introduction
36
+ end
37
+
38
+ def get_comparison_report
39
+ @ComparisonReport
40
+ end
41
+
42
+ def get_embeded_comparison
43
+ @EmbededComparison
44
+ end
45
+
46
+ def to_s
47
+ puts "----------------------------------------------------------------"
48
+ puts "Title: #{@Title}"
49
+ puts "Introduction: #{@Introduction}"
50
+ puts "Url: #{@URL}"
51
+ puts "Percents: #{@Percents}%"
52
+ puts "NumberOfCopiedWords: #{@NumberOfCopiedWords}"
53
+ puts "CachedVersion: #{@CachedVersion}"
54
+ puts "ComparisonReport: #{@ComparisonReport}"
55
+ puts "EmbededComparison: #{@EmbededComparison}"
56
+ end
57
+ end
58
+ end
@@ -3,12 +3,15 @@ require 'net/http'
3
3
  require 'mimemagic'
4
4
  require 'mimemagic/overlay'
5
5
  require 'openssl'
6
+ require 'securerandom'
7
+
6
8
 
7
9
  module CopyleaksApi
8
10
  class Api
9
11
  BASE_URL = 'https://api.copyleaks.com'.freeze
10
- API_VERSION = 'v1'.freeze
11
-
12
+ API_VERSION_V1 = 'v1'.freeze
13
+ API_VERSION_V2 = 'v2'.freeze
14
+
12
15
  # constructor
13
16
  def initialize
14
17
  uri = URI(BASE_URL)
@@ -23,6 +26,12 @@ module CopyleaksApi
23
26
  make_request(request, options.merge(no_callbacks: true))
24
27
  end
25
28
 
29
+ # make get request without any callback header
30
+ def get_with_final_path(path, options = {})
31
+ request = Net::HTTP::Get.new(path)
32
+ make_request(request, options.merge(no_callbacks: true))
33
+ end
34
+
26
35
  # make post request with given options
27
36
  def post(path, body = nil, options = {})
28
37
  request = Net::HTTP::Post.new(request_uri(path))
@@ -45,6 +54,15 @@ module CopyleaksApi
45
54
  make_request(request, options.merge(boundary: boundary))
46
55
  end
47
56
 
57
+ # makes post request with file inside
58
+ def post_files(path, files_paths, options = {})
59
+ request = Net::HTTP::Post.new(request_uri(path, api_version: API_VERSION_V2))
60
+ options[:partial_scan] ||= CopyleaksApi::Config.allow_partial_scan
61
+ options[:compare_only] ||= CopyleaksApi::Config.compare_only
62
+ boundary = "copyleaks_sdk_#{SecureRandom.hex(4)}"
63
+ request.body = files_body(files_paths, boundary)
64
+ make_request(request, options.merge(boundary: boundary))
65
+ end
48
66
  private
49
67
 
50
68
  # extracts mime type of given file
@@ -66,10 +84,28 @@ module CopyleaksApi
66
84
  "\r\n--#{boundary}--\r\n"
67
85
  ].join('')
68
86
  end
87
+
88
+ # prepares post body with file inside
89
+ def files_body(paths, boundary)
90
+ body = "\r\n--#{boundary}\r\n"
91
+ counter = 1
92
+ paths.each do |path|
93
+ body += "content-disposition: form-data; name=\"file_#{counter}\"" +
94
+ "; filename=\"#{File.basename(path)}\"\r\n" +
95
+ "Content-Type: #{extract_mime_type(path)}\r\n" +
96
+ "Content-Transfer-Encoding: binary\r\n" +
97
+ "\r\n" +
98
+ File.open(path, 'rb') { |io| io.read } +
99
+ "\r\n--#{boundary}\r\n"
100
+ counter += 1
101
+ end
102
+ body += "\r\n--#{boundary}--\r\n"
103
+ body
104
+ end
69
105
 
70
106
  # gather all API path
71
- def request_uri(path)
72
- "/#{API_VERSION}/#{path}"
107
+ def request_uri(path, api_version: API_VERSION_V1)
108
+ "/#{api_version}/#{path}"
73
109
  end
74
110
 
75
111
  # gather headers, makes request and do validation
@@ -77,7 +113,11 @@ module CopyleaksApi
77
113
  gather_headers(request, options)
78
114
  response = @http.request(request)
79
115
  Validators::ResponseValidator.validate!(response)
80
- JSON.parse(response.body)
116
+ if not options.key?(:parse_json) or options[:parse_json]
117
+ JSON.parse(response.body)
118
+ else
119
+ response.body
120
+ end
81
121
  end
82
122
 
83
123
  # gather all headers
@@ -87,6 +127,8 @@ module CopyleaksApi
87
127
  email_callback_header(options),
88
128
  authentication_header(options),
89
129
  sandbox_header,
130
+ compare_only_header,
131
+ in_progress_result(options),
90
132
  content_type_header(options),
91
133
  partial_scan_header(options),
92
134
  'User-Agent' => "RUBYSDK/#{CopyleaksApi::VERSION}"
@@ -100,7 +142,21 @@ module CopyleaksApi
100
142
  return {} unless Config.sandbox_mode
101
143
  { 'copyleaks-sandbox-mode' => '' }
102
144
  end
103
-
145
+
146
+ # Compare your files against each other only
147
+ def compare_only_header
148
+ return {} unless Config.compare_only
149
+ { 'copyleaks-compare-documents-for-similarity' => '' }
150
+ end
151
+
152
+ # Receive callback every time we find a new result without waiting for completion
153
+ def in_progress_result(options)
154
+ return {} if options[:no_http_callback] || options[:no_callbacks]
155
+ value = options[:in_progress_result] || CopyleaksApi::Config.in_progress_result
156
+ return {} unless value
157
+ Validators::UrlValidator.validate!(value)
158
+ { 'copyleaks-in-progress-new-result' => value }
159
+ end
104
160
  # prepares header for content type
105
161
  def content_type_header(options)
106
162
  { 'Content-Type' => options[:boundary] ? "multipart/form-data; boundary=\"#{options[:boundary]}\"" :
@@ -125,7 +181,7 @@ module CopyleaksApi
125
181
  value = options[:http_callback] || CopyleaksApi::Config.http_callback
126
182
  return {} unless value
127
183
  Validators::UrlValidator.validate!(value)
128
- { 'copyleaks-http-callback' => value }
184
+ { 'copyleaks-http-completion-callback' => value }
129
185
  end
130
186
 
131
187
  # prepares header for email callback
@@ -137,6 +193,7 @@ module CopyleaksApi
137
193
  { 'copyleaks-email-callback' => value }
138
194
  end
139
195
 
196
+
140
197
  # prepares headers with custom fields
141
198
  def custom_field_headers(options)
142
199
  return {} if options[:no_custom_fields]
@@ -6,10 +6,12 @@ module CopyleaksApi
6
6
  http_callback: nil,
7
7
  email_callback: nil,
8
8
  custom_fields: {},
9
+ compare_only: false,
10
+ in_progress_result: nil,
9
11
  }.freeze
10
12
 
11
13
  class << self
12
- attr_writer :sandbox_mode, :http_callback, :email_callback, :custom_fields, :allow_partial_scan
14
+ attr_writer :sandbox_mode, :compare_only, :http_callback, :email_callback, :custom_fields, :allow_partial_scan, :in_progress_result
13
15
 
14
16
  DEFAULTS.each do |attr, value|
15
17
  # getters for all options
@@ -1,12 +1,13 @@
1
1
  require 'copyleaks_api/errors'
2
2
  require 'copyleaks_api/api'
3
3
 
4
+
4
5
  module CopyleaksApi
5
6
  class CopyleaksCloud
6
- ALLOWED_ENDPOINTS = [:publisher, :academic]
7
+ ALLOWED_ENDPOINTS = [:businesses, :education, :websites]
7
8
  attr_accessor :access_token
8
9
  attr_reader :endpoint_type
9
-
10
+
10
11
  # constructor
11
12
  def initialize(email, api_key, type)
12
13
  raise ArgumentError, "Endpoint type '#{type}' is invalid" unless ALLOWED_ENDPOINTS.include?(type.to_sym)
@@ -19,63 +20,76 @@ module CopyleaksApi
19
20
  end
20
21
 
21
22
  # returns account balance from endpoint
22
- def balance
23
+ def get_credits_balance
23
24
  api.get(url('count-credits'), token: @access_token.token)['Amount'].to_i
24
25
  end
25
26
 
26
27
  # uses create-by-url endpoint to create process
27
28
  def create_by_url(url, options = {})
28
29
  response = api.post(url('create-by-url'), { 'Url' => url }.to_json, options.merge(token: @access_token.token))
29
- CopyleaksProcess.create(self, response)
30
+ CopyleaksProcess.create(self, api, response)
30
31
  end
31
32
 
32
33
  # uses create-by-file endpoint to create process
33
34
  def create_by_file(file_path, options = {})
34
35
  response = api.post_file(url('create-by-file'), file_path, options.merge(token: @access_token.token))
35
- CopyleaksProcess.create(self, response)
36
+ CopyleaksProcess.create(self, api, response)
37
+ end
38
+
39
+ # uses create-by-file endpoint to create process
40
+ def create_by_files(files_paths, options = {})
41
+ response = api.post_files(url('create-by-file'), files_paths, options.merge(token: @access_token.token))
42
+ success_uploads = response['Success']
43
+ processes = []
44
+ success_uploads.each do |upload|
45
+ processes.push(CopyleaksProcess.create(self, api, upload))
46
+ end
47
+ processes
36
48
  end
37
49
 
38
50
  # uses create-by-file-ocr endpoint to create process
39
51
  def create_by_ocr(ocr_file_path, options = {})
40
52
  response = api.post_file(url_with_language('create-by-file-ocr', options), ocr_file_path,
41
53
  options.merge(token: @access_token.token))
42
- CopyleaksProcess.create(self, response)
54
+ CopyleaksProcess.create(self, api, response)
43
55
  end
44
56
 
45
57
  # uses create-by-text endpoint to create process
46
58
  def create_by_text(text, options = {})
47
59
  response = api.post(url('create-by-text'), text, options.merge(token: @access_token.token))
48
- CopyleaksProcess.create(self, response)
49
- end
50
-
51
- # deletes process by given id
52
- def delete(id)
53
- api.delete(url(:delete, id), token: @access_token.token)
54
- true
60
+ CopyleaksProcess.create(self, api, response)
55
61
  end
56
62
 
57
- # retries all processes
58
- def list
63
+ # Returns a list of your past processes
64
+ def get_processes
59
65
  response = api.get(url(:list), token: @access_token.token)
60
- response.map { |hash| CopyleaksProcess.create_from_list(self, hash) }
66
+ response.map { |hash| CopyleaksProcess.create_from_list(self, @api, hash) }
61
67
  end
62
-
63
- # retries status information of process with given id
64
- def status(id, options = {})
65
- response = api.get(url(:status, id), no_callbacks: true, token: @access_token.token)
66
- return response if options[:raw]
67
- CopyleaksApi::CopyleaksProcess.create_from_status(self, id, response)
68
+
69
+ # Returns the raw text of a given result
70
+ def get_raw_text(result)
71
+ response = api.get_with_final_path(result.get_cached_version, parse_json: false, token: @access_token.token)
72
+ response
68
73
  end
69
74
 
70
- # retries result information of process with given id
71
- def result(id, options = {})
72
- response = api.get(url(:result, id), no_callbacks: true, token: @access_token.token)
73
- return response if options[:raw]
74
- CopyleaksApi::CopyleaksProcess.create_from_result(self, id, response)
75
+ # Returns the raw text of a given result
76
+ def get_comparison_report(result)
77
+ response = api.get_with_final_path(result.get_comparison_report, token: @access_token.token)
78
+ response
75
79
  end
76
-
77
- private
78
-
80
+
81
+ # Returns a list of currently supported languages for ocr
82
+ def get_ocr_languages
83
+ response = api.get(url_misc('ocr-languages-list'))
84
+ response
85
+ end
86
+
87
+ # Returns a list of currently supported file types
88
+ def get_supported_file_types
89
+ response = api.get(url_misc('supported-file-types'))
90
+ response
91
+ end
92
+
79
93
  # gather url for endpoints which need language in get parameters
80
94
  def url_with_language(action, options)
81
95
  language = options[:language] || Language.english
@@ -88,5 +102,15 @@ module CopyleaksApi
88
102
  return "#{@endpoint_type}/#{action}" if id.nil?
89
103
  "#{@endpoint_type}/#{id}/#{action}"
90
104
  end
105
+
106
+ # gather path for download endpoint
107
+ def url_downloads(action, id = nil)
108
+ return "downloads/#{action}"
109
+ end
110
+
111
+ # gather path for download endpoint
112
+ def url_misc(action, id = nil)
113
+ return "miscellaneous/#{action}"
114
+ end
91
115
  end
92
116
  end
@@ -1,81 +1,77 @@
1
1
  require 'time'
2
+ require 'copyleaks_api/Models/ResultRecord'
3
+
2
4
 
3
5
  module CopyleaksApi
4
6
  class CopyleaksProcess
5
- STATUSES = ['processing', 'ready', 'allocated', 'finished', 'error', 'deleted'].freeze
6
-
7
- attr_accessor :status, :process_id, :status, :progress, :custom_fields, :created_at
7
+ attr_accessor :process_id, :progress, :custom_fields, :created_at
8
8
 
9
9
  # constructor
10
10
  def initialize(options)
11
11
  @cloud = options[:cloud]
12
- [:cloud, :process_id, :custom_fields, :result, :status, :progress].each do |attr|
12
+ [:cloud, :api, :process_id, :custom_fields, :result, :progress].each do |attr|
13
13
  instance_variable_set("@#{attr}", options[attr]) if options[attr]
14
14
  end
15
-
16
15
  @created_at = DateTime.parse(options[:created_at]) if options[:created_at]
17
- @status = STATUSES[options[:status_code].to_i + 1] if options[:status_code]
18
16
  end
19
-
20
- STATUSES[1..-1].each do |status|
21
- # predicate methods for all statuses
22
- define_method("#{status}?") do
23
- reload if @status.nil?
24
- @status == status
25
- end
17
+
18
+ def to_s
19
+ return "Created at: #{@created_at}"
26
20
  end
27
21
 
28
- # returns true if process status means processing data on server side
22
+ # returns true if still processing data on server side
29
23
  def processing?
30
- ['ready', 'allocated', 'processing'].include?(@status)
24
+ if @progress == 100
25
+ false
26
+ else
27
+ true
28
+ end
31
29
  end
32
30
 
33
31
  # return result data or retrieves from result endpoint if nothing specified
34
- def result
35
- @result ||= @cloud.result(process_id, raw: true)
32
+ # retries result information of process with given id
33
+ def get_results
34
+ response = @api.get(@cloud.url(:result, @process_id), no_callbacks: true, token: @cloud.access_token.token)
35
+ @results = []
36
+ response.each do |res|
37
+ @results.push(CopyleaksApi::ResultRecord.new(res))
38
+ end
39
+ @results
40
+ end
41
+
42
+ # retries status information of process with given id
43
+ def update_status
44
+ response = @api.get(@cloud.url(:status, @process_id), no_callbacks: true, token: @cloud.access_token.token)
45
+ @progress = response['ProgressPercents'].to_i
46
+ @progress
36
47
  end
37
48
 
38
- # returns status information or reload if no data is specified
39
- def status
40
- reload if @status.nil?
41
- @status
49
+ # Returns the source text of this process
50
+ def get_source_text
51
+ response = @api.get(@cloud.url_downloads("source-text?pid=#{@process_id}"), parse_json: false, no_callbacks: true, token: @cloud.access_token.token)
52
+ response
42
53
  end
43
54
 
44
55
  # deletes process from API
45
56
  def delete
46
- @cloud.delete(process_id)
47
- @status = 'deleted'
48
- end
49
-
50
- # reload object attributes using status endpoint
51
- def reload
52
- response = @cloud.status(process_id, raw: true)
53
- @status = response['Status'].downcase
54
- @progress = response['ProgressPercents'].to_i
55
- @result = nil
56
- self
57
+ response = @api.delete(@cloud.url(:delete, @process_id), token: @cloud.access_token.token)
58
+ if response['StatusCode'] == 200
59
+ true
60
+ else
61
+ false
62
+ end
57
63
  end
58
64
 
59
65
  class << self
60
66
  # create CopyleaksProcess based on data got from any create endpoint
61
- def create(cloud, hash)
62
- new(cloud: cloud, process_id: hash['ProcessId'], created_at: hash['CreationTimeUTC'])
67
+ def create(cloud, api, hash)
68
+ new(cloud: cloud, api: api, process_id: hash['ProcessId'], created_at: hash['CreationTimeUTC'])
63
69
  end
64
-
65
- # create CopyleaksProcess based on data got from status endpoint
66
- def create_from_status(cloud, id, hash)
67
- new(cloud: cloud, process_id: id, status: hash['Status'].downcase, progress: hash['ProgressPercents'])
68
- end
69
-
70
- # creates CopyleaksProcess based on data got from result endpoint
71
- def create_from_result(cloud, id, result)
72
- new(cloud: cloud, process_id: id, result: result)
73
- end
74
-
70
+
75
71
  # creates CopyleaksProcess based on data got from list endpoint
76
- def create_from_list(cloud, hash)
77
- new(cloud: cloud, process_id: hash['ProcessId'], created_at: hash['CreationTimeUTC'],
78
- status: hash['Status'].downcase, custom_fields: hash['CustomFields'])
72
+ def create_from_list(cloud, api, hash)
73
+ new(cloud: cloud, api: api, process_id: hash['ProcessId'], created_at: hash['CreationTimeUTC'],
74
+ status_code: hash['Status'].downcase, custom_fields: hash['CustomFields'])
79
75
  end
80
76
  end
81
77
  end
@@ -1,3 +1,3 @@
1
- module CopyleaksApi
2
- VERSION = '1.0.0'.freeze
3
- end
1
+ module CopyleaksApi
2
+ VERSION = '2.0.0'.freeze
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plagiarism-checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Copyleaks ltd
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-29 00:00:00.000000000 Z
11
+ date: 2017-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webmock
@@ -113,15 +113,16 @@ files:
113
113
  - bin/console
114
114
  - bin/setup
115
115
  - copyleaks_api.gemspec
116
- - examples/main.rb
116
+ - example_async.rb
117
+ - example_syncronized.rb
117
118
  - lib/copyleaks_api.rb
119
+ - lib/copyleaks_api/Models/ResultRecord.rb
118
120
  - lib/copyleaks_api/access_token.rb
119
121
  - lib/copyleaks_api/api.rb
120
122
  - lib/copyleaks_api/config.rb
121
123
  - lib/copyleaks_api/copyleaks_cloud.rb
122
124
  - lib/copyleaks_api/copyleaks_process.rb
123
125
  - lib/copyleaks_api/errors.rb
124
- - lib/copyleaks_api/language.rb
125
126
  - lib/copyleaks_api/validators/custom_fields_validator.rb
126
127
  - lib/copyleaks_api/validators/email_validator.rb
127
128
  - lib/copyleaks_api/validators/file_validator.rb
@@ -149,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
150
  version: '0'
150
151
  requirements: []
151
152
  rubyforge_project:
152
- rubygems_version: 2.6.4
153
+ rubygems_version: 2.6.13
153
154
  signing_key:
154
155
  specification_version: 4
155
156
  summary: Detects plagiarism and checks content distribution online.
@@ -1,60 +0,0 @@
1
- require 'bundler/setup'
2
- require 'copyleaks_api'
3
-
4
- # firstly we need to create new Cloud entity
5
- email = '<YOUR-EMAIL>'
6
- api_key = '<YOUR-API-KEY>'
7
- cloud = CopyleaksApi::CopyleaksCloud.new(email, api_key, :publisher)
8
-
9
- # to check your balance just call balance
10
-
11
- puts "Your balance is #{cloud.balance} credits"
12
-
13
- # firstly we need to change work mode to sandbox
14
-
15
- CopyleaksApi::Config.sandbox_mode = true
16
-
17
- # now we can create new process by some url and custom callback
18
- process = cloud.create_by_url('http://exmaple.com', http_callback: 'http://requestb.in/')
19
-
20
- # Other scanning options
21
- # Text scan:
22
- #process = cloud.create_by_text("-Your text here-")
23
-
24
- # Textual file scan:
25
- #path = File.join(File.dirname(__FILE__), '..', 'spec', 'fixtures', 'files', 'lorem.txt')
26
- #process = cloud.create_by_file(path)
27
-
28
- # Ocr scan:
29
- #path = File.join(File.dirname(__FILE__), '..', 'spec', 'fixtures', 'files', 'lorem.jpg')
30
- #process = cloud.create_by_ocr(path, language: CopyleaksApi::Language.latin)
31
-
32
- puts "Now process has state '#{process.status}'"
33
-
34
- # to update process information we can just do this
35
-
36
- # process.reload
37
-
38
- # and it automatically call cloud.status with his id
39
- # it need some time to process your request so we need to wait
40
-
41
- while process.processing?
42
- sleep(1)
43
- process.reload
44
- end
45
-
46
- puts "And after sleep - #{process.status}"
47
- # to get our results from processing we can just call correspond method
48
-
49
- puts 'And its results are:'
50
- puts process.result.inspect
51
-
52
- # all results will be in array ow hashes with keys like Copyleaks API provides
53
- # to get list of all existing processes we can call list method
54
-
55
- processes = cloud.list
56
- puts "Overall you have #{processes.size} processes"
57
-
58
- # Delete finished process by PID:
59
- #PID = '00000000-0000-0000-0000-000000000000'
60
- #cloud.delete(PID)
@@ -1,61 +0,0 @@
1
- module CopyleaksApi
2
- module Language
3
- ALLOWED = ['Afrikaans',
4
- 'Albanian',
5
- 'Basque',
6
- 'Brazilian',
7
- 'Bulgarian',
8
- 'Byelorussian',
9
- 'Catalan',
10
- 'Chinese_Simplified',
11
- 'Chinese_Traditional',
12
- 'Croatian',
13
- 'Czech',
14
- 'Danish',
15
- 'Dutch',
16
- 'English',
17
- 'Esperanto',
18
- 'Estonian',
19
- 'Finnish',
20
- 'French',
21
- 'Galician',
22
- 'German',
23
- 'Greek',
24
- 'Hungarian',
25
- 'Icelandic',
26
- 'Indonesian',
27
- 'Italian',
28
- 'Japanese',
29
- 'Korean',
30
- 'Latin',
31
- 'Latvian',
32
- 'Lithuanian',
33
- 'Macedonian',
34
- 'Malay',
35
- 'Moldavian',
36
- 'Norwegian',
37
- 'Polish',
38
- 'Portuguese',
39
- 'Romanian',
40
- 'Russian',
41
- 'Serbian',
42
- 'Slovak',
43
- 'Slovenian',
44
- 'Spanish',
45
- 'Swedish',
46
- 'Tagalog',
47
- 'Turkish',
48
- 'Ukrainian'].freeze
49
-
50
- ALLOWED.each_with_index do |lang, index|
51
- method = lang.downcase
52
-
53
- # returns appropriate language name based on method name
54
- define_method(method) do
55
- ALLOWED[index]
56
- end
57
-
58
- module_function method
59
- end
60
- end
61
- end