epo-ops 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +6 -0
- data/README.md +78 -38
- data/epo-ops.gemspec +2 -2
- data/lib/epo_ops.rb +46 -0
- data/lib/epo_ops/client.rb +46 -0
- data/lib/epo_ops/error.rb +87 -0
- data/lib/epo_ops/factories.rb +9 -0
- data/lib/epo_ops/factories/name_and_address_factory.rb +54 -0
- data/lib/epo_ops/factories/patent_application_factory.rb +116 -0
- data/lib/epo_ops/factories/register_search_result_factory.rb +42 -0
- data/lib/epo_ops/ipc_class_hierarchy.rb +146 -0
- data/lib/epo_ops/ipc_class_hierarchy_loader.rb +60 -0
- data/lib/epo_ops/ipc_class_util.rb +71 -0
- data/lib/epo_ops/limits.rb +20 -0
- data/lib/epo_ops/logger.rb +15 -0
- data/lib/epo_ops/name_and_address.rb +58 -0
- data/lib/epo_ops/patent_application.rb +159 -0
- data/lib/epo_ops/rate_limit.rb +47 -0
- data/lib/epo_ops/register.rb +100 -0
- data/lib/epo_ops/register_search_result.rb +40 -0
- data/lib/epo_ops/search_query_builder.rb +65 -0
- data/lib/epo_ops/token_store.rb +33 -0
- data/lib/epo_ops/token_store/redis.rb +45 -0
- data/lib/epo_ops/util.rb +52 -0
- data/lib/epo_ops/version.rb +3 -0
- metadata +26 -20
- data/lib/epo/ops.rb +0 -43
- data/lib/epo/ops/address.rb +0 -60
- data/lib/epo/ops/bibliographic_document.rb +0 -196
- data/lib/epo/ops/client.rb +0 -27
- data/lib/epo/ops/error.rb +0 -89
- data/lib/epo/ops/ipc_class_hierarchy.rb +0 -148
- data/lib/epo/ops/ipc_class_hierarchy_loader.rb +0 -62
- data/lib/epo/ops/ipc_class_util.rb +0 -73
- data/lib/epo/ops/limits.rb +0 -22
- data/lib/epo/ops/logger.rb +0 -11
- data/lib/epo/ops/rate_limit.rb +0 -49
- data/lib/epo/ops/register.rb +0 -152
- data/lib/epo/ops/search_query_builder.rb +0 -65
- data/lib/epo/ops/token_store.rb +0 -35
- data/lib/epo/ops/token_store/redis.rb +0 -47
- data/lib/epo/ops/util.rb +0 -32
- data/lib/epo/ops/version.rb +0 -6
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
require 'epo/ops/ipc_class_util'
|
3
|
-
|
4
|
-
module Epo
|
5
|
-
module Ops
|
6
|
-
# Usually this should only used internally.
|
7
|
-
# Loads the Hierarchy from the WIPO.
|
8
|
-
# This is used to update IpcClassHierarchy manually.
|
9
|
-
# At the beginning of the year the WIPO publishes a new list of IPC classes.
|
10
|
-
# The IpcClassHierarchy should then be updated. Make sure that the url is
|
11
|
-
# correct!
|
12
|
-
class IpcClassHierarchyLoader
|
13
|
-
# loads data from the WIPO
|
14
|
-
# @return [Hash]
|
15
|
-
def self.load
|
16
|
-
load_url
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def self.load_url
|
22
|
-
url = 'http://www.wipo.int/ipc/itos4ipc/ITSupport_and_download_area/20160101/IPC_scheme_title_list/EN_ipc_section_#letter_title_list_20160101.txt'
|
23
|
-
|
24
|
-
# There is a file for every letter A-H
|
25
|
-
('A'..'H').inject({}) do |mem, letter|
|
26
|
-
# Fetch the file from the server
|
27
|
-
response = HTTParty.get(url.gsub('#letter', letter), http_proxyaddr: proxy[:addr], http_proxyport: proxy[:port])
|
28
|
-
file = response.body
|
29
|
-
mem.merge! process_file(file)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.process_file(file)
|
34
|
-
# Process every line (There is a line for every class entry, name and description are separated by a \t)
|
35
|
-
file.each_line.inject(Hash.new { |h, k| h[k] = [] }) do |mem, line|
|
36
|
-
next if line.to_s.strip.empty?
|
37
|
-
ipc_class_generic, description = line.split("\t")
|
38
|
-
|
39
|
-
# Some entries in the files have the same ipc class, the first line is
|
40
|
-
# just some kind of headline, the second is the description we want.
|
41
|
-
ipc_class = Epo::Ops::IpcClassUtil.parse_generic_format(ipc_class_generic)
|
42
|
-
if ipc_class.length == 3
|
43
|
-
mem[ipc_class[0]] << ipc_class
|
44
|
-
elsif ipc_class.length == 4
|
45
|
-
mem[ipc_class[0, 3]] << ipc_class
|
46
|
-
end
|
47
|
-
mem
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.proxy
|
52
|
-
# configure proxy
|
53
|
-
proxy_addr = nil
|
54
|
-
proxy_port = nil
|
55
|
-
unless ENV['http_proxy'].to_s.strip.empty?
|
56
|
-
proxy_addr, proxy_port = ENV['http_proxy'].gsub('http://', '').gsub('/', '').split(':')
|
57
|
-
end
|
58
|
-
{ addr: proxy_addr, port: proxy_port }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'epo/ops/ipc_class_hierarchy'
|
2
|
-
|
3
|
-
module Epo
|
4
|
-
module Ops
|
5
|
-
# Utility functions to work on Strings representing ipc classes.
|
6
|
-
class IpcClassUtil
|
7
|
-
|
8
|
-
# @return [Array] \['A', 'B', …, 'H'\]
|
9
|
-
def self.main_classes
|
10
|
-
%w( A B C D E F G H )
|
11
|
-
end
|
12
|
-
|
13
|
-
# check if the given ipc_class is valid as OPS search parameter
|
14
|
-
# @param [String] ipc_class an ipc class
|
15
|
-
# @return [Boolean]
|
16
|
-
def self.valid_for_search?(ipc_class)
|
17
|
-
ipc_class.match(/\A[A-H](\d{2}([A-Z](\d{1,2}\/\d{2,3})?)?)?\z/)
|
18
|
-
end
|
19
|
-
|
20
|
-
# There is a generic format for ipc classes that does not have
|
21
|
-
# the / as delimiter and leaves space for additions. This parses
|
22
|
-
# it into the format the register search understands
|
23
|
-
# @param [String] generic ipc class in generic format
|
24
|
-
# @return [String] reformatted ipc class
|
25
|
-
# @example
|
26
|
-
# parse_generic_format('A01B0003140000') #=> 'A01B3/14'
|
27
|
-
def self.parse_generic_format(generic)
|
28
|
-
ipc_class = generic
|
29
|
-
if ipc_class.length > 4
|
30
|
-
match = ipc_class.match(/([A-Z]\d{2}[A-Z])(\d{4})(\d{6})$/)
|
31
|
-
ipc_class = match[1] + (match[2].to_i).to_s + '/' + process_number(match[3])
|
32
|
-
end
|
33
|
-
ipc_class
|
34
|
-
end
|
35
|
-
|
36
|
-
# @param [String] ipc_class an ipc_class
|
37
|
-
# @return [Array] List of all ipc classes one level more specific.
|
38
|
-
# @examples
|
39
|
-
# children('A') #=> ['A01', 'A21', 'A22', 'A23', ...]
|
40
|
-
# children('A62') #=> ['A62B', 'A62C', 'A62D'],
|
41
|
-
# @raise [InvalidIpcClassError] if parameter is not a valid ipc class in
|
42
|
-
# the format EPO understands
|
43
|
-
# @raise [LevelNotSupportedError] for parameters with ipc class depth >= 3
|
44
|
-
# e.g. 'A62B' cannot be split further. It is currently not necessary to
|
45
|
-
# do so, it would only blow up the gem, and you do not want to query for
|
46
|
-
# all classes at the lowest level, as it takes too many requests.
|
47
|
-
def self.children(ipc_class)
|
48
|
-
return main_classes if ipc_class.nil?
|
49
|
-
valid = valid_for_search?(ipc_class)
|
50
|
-
fail InvalidIpcClassError, ipc_class unless valid
|
51
|
-
map = IpcClassHierarchy::Hierarchy
|
52
|
-
fail LevelNotSupportedError, ipc_class unless map.key? ipc_class
|
53
|
-
map[ipc_class]
|
54
|
-
end
|
55
|
-
|
56
|
-
# An ipc class in invalid format was given, or none at all.
|
57
|
-
class InvalidIpcClassError < StandardError; end
|
58
|
-
# It is currently not supported to split by the most specific class level.
|
59
|
-
# This would result in a large amount of requests.
|
60
|
-
class LevelNotSupportedError < StandardError; end
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
def self.process_number(number)
|
65
|
-
result = number.gsub(/0+$/, '')
|
66
|
-
result += '0' if result.length == 1
|
67
|
-
result = '00' if result.length == 0
|
68
|
-
|
69
|
-
result
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
data/lib/epo/ops/limits.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Epo
|
2
|
-
module Ops
|
3
|
-
# The register search is limited by some parameters. With one
|
4
|
-
# query one may only request as many as
|
5
|
-
# {Epo::Ops::Limits::MAX_QUERY_INTERVAL} references at once.
|
6
|
-
# Considering this, you have to split your requests by this
|
7
|
-
# interval. Nevertheless, the maximum value you may use is
|
8
|
-
# {Epo::Ops::Limits::MAX_QUERY_RANGE}. If you want to retrieve more
|
9
|
-
# references you must split by other parameters.
|
10
|
-
# @see Register
|
11
|
-
class Limits
|
12
|
-
# @return [Integer] The range in which you can search is limited, say you
|
13
|
-
# cannot request all patents of a given class at once, you probably must
|
14
|
-
# split your requests by additional conditions.
|
15
|
-
MAX_QUERY_RANGE = 2000
|
16
|
-
|
17
|
-
# @return [Integer] The maximum number of elements you may search with one
|
18
|
-
# query. Ignoring this will result in errors.
|
19
|
-
MAX_QUERY_INTERVAL = 100
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/epo/ops/logger.rb
DELETED
data/lib/epo/ops/rate_limit.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
module Epo
|
2
|
-
module Ops
|
3
|
-
class RateLimit
|
4
|
-
WEEKLY_QUOTA_RESET_TIME = 604_800
|
5
|
-
HOURLY_QUOTA_RESET_TIME = 600
|
6
|
-
BASE_RESET_TIME = 60
|
7
|
-
|
8
|
-
attr_reader :attr
|
9
|
-
|
10
|
-
def initialize(http_header)
|
11
|
-
fail "Rate Limit data should be a Hash but is #{http_header.inspect} (#{http_header.class.name})" unless http_header.is_a?(Hash)
|
12
|
-
@attr = http_header
|
13
|
-
end
|
14
|
-
|
15
|
-
def limit_reached?
|
16
|
-
@attr.key?('x-rejection-reason')
|
17
|
-
end
|
18
|
-
|
19
|
-
def rejection_reason
|
20
|
-
return nil unless @attr['x-rejection-reason']
|
21
|
-
case @attr['x-rejection-reason']
|
22
|
-
when 'RegisteredQuotaPerWeek' then :weekly_quota
|
23
|
-
when 'IndividualQuotaPerHour' then :hourly_quota
|
24
|
-
else :unknown_reason
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def hourly_quota
|
29
|
-
quota = @attr['x-individualquotaperhour-used']
|
30
|
-
quota.to_i if quota
|
31
|
-
end
|
32
|
-
|
33
|
-
def weekly_quota
|
34
|
-
quota = @attr['x-registeredquotaperweek-used']
|
35
|
-
quota.to_i if quota
|
36
|
-
end
|
37
|
-
|
38
|
-
def reset_at
|
39
|
-
return unless limit_reached?
|
40
|
-
|
41
|
-
case rejection_reason
|
42
|
-
when :weekly_quota then Time.now.to_i + WEEKLY_QUOTA_RESET_TIME
|
43
|
-
when :hourly_quota then Time.now.to_i + HOURLY_QUOTA_RESET_TIME
|
44
|
-
else Time.now.to_i + BASE_RESET_TIME
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/epo/ops/register.rb
DELETED
@@ -1,152 +0,0 @@
|
|
1
|
-
require 'epo/ops'
|
2
|
-
require 'epo/ops/client'
|
3
|
-
require 'epo/ops/util'
|
4
|
-
require 'epo/ops/bibliographic_document'
|
5
|
-
require 'epo/ops/logger'
|
6
|
-
require 'epo/ops/ipc_class_util'
|
7
|
-
|
8
|
-
module Epo
|
9
|
-
module Ops
|
10
|
-
# Access to the {http://ops.epo.org/3.2/rest-services/register register}
|
11
|
-
# endpoint of the EPO OPS API.
|
12
|
-
#
|
13
|
-
# By now you can search and retrieve patents by using the type `application`
|
14
|
-
# in the `epodoc` format.
|
15
|
-
#
|
16
|
-
# Search queries are limited by size, not following these limits
|
17
|
-
# will result in errors. You should probably use {.search} which handles the
|
18
|
-
# limits itself.
|
19
|
-
#
|
20
|
-
# For more fine grained control use {.raw_search} and {.raw_biblio}
|
21
|
-
#
|
22
|
-
# @see Limits
|
23
|
-
# @see SearchQueryBuilder
|
24
|
-
class Register
|
25
|
-
# A helper method which creates queries that take API limits into account.
|
26
|
-
# @param patent_count [Integer] number of overall results expected.
|
27
|
-
# See {.published_patents_count}
|
28
|
-
#
|
29
|
-
# @return [Array] of Strings, each a query to put into {Register.raw_search}
|
30
|
-
# @see Epo::Ops::Limits
|
31
|
-
def self.split_by_size_limits(ipc_class, date, patent_count)
|
32
|
-
max_interval = Limits::MAX_QUERY_INTERVAL
|
33
|
-
(1..patent_count).step(max_interval).map do |start|
|
34
|
-
range_end = [start + max_interval - 1, patent_count].min
|
35
|
-
Epo::Ops::SearchQueryBuilder.build(ipc_class, date, start, range_end)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
# Makes the requests to find how many patents are in each top
|
40
|
-
# level ipc class on a given date.
|
41
|
-
#
|
42
|
-
# @param date [Date] date on which patents should be counted
|
43
|
-
# @return [Hash] Hash ipc_class => count (ipc_class A-H)
|
44
|
-
def self.patent_counts_per_ipc_class(date)
|
45
|
-
%w( A B C D E F G H ).inject({}) do |mem, icc|
|
46
|
-
mem[icc] = published_patents_counts(icc, date)
|
47
|
-
mem
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# @param date [Date]
|
52
|
-
# @param ipc_class [String] up to now should only be between A-H
|
53
|
-
# @return [Integer] number of patents with given parameters
|
54
|
-
def self.published_patents_counts(ipc_class = nil, date = nil)
|
55
|
-
query = SearchQueryBuilder.build(ipc_class, date, 1, 2)
|
56
|
-
minimum_result_set = Register.raw_search(query, true)
|
57
|
-
return 0 if minimum_result_set.empty?
|
58
|
-
minimum_result_set['world_patent_data']['register_search']['total_result_count'].to_i
|
59
|
-
end
|
60
|
-
|
61
|
-
# Search method returning all unique register references on a given
|
62
|
-
# date, with optional ipc_class.
|
63
|
-
# @note This method does more than one query; it may happen that you
|
64
|
-
# exceed your API limits
|
65
|
-
# @return [Array] Array of {SearchEntry}
|
66
|
-
def self.search(ipc_class = nil, date = nil)
|
67
|
-
queries = all_queries(ipc_class, date)
|
68
|
-
search_entries = queries.flat_map { |query| raw_search(query) }
|
69
|
-
search_entries.uniq { |se| se.application_reference.epodoc_reference }
|
70
|
-
end
|
71
|
-
|
72
|
-
# @return [Array] Array of Strings containing queries applicable to
|
73
|
-
# {Register.raw_search}.
|
74
|
-
# builds all queries necessary to find all patent references on a given
|
75
|
-
# date.
|
76
|
-
def self.all_queries(ipc_class = nil, date = nil)
|
77
|
-
count = published_patents_counts(ipc_class, date)
|
78
|
-
if count > Limits::MAX_QUERY_RANGE
|
79
|
-
IpcClassUtil.children(ipc_class).flat_map { |ic| all_queries(ic, date) }
|
80
|
-
else
|
81
|
-
split_by_size_limits(ipc_class, date, count)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
# @param query A query built with {Epo::Ops::SearchQueryBuilder}
|
86
|
-
# @param raw if `true` the result will be the raw response as a nested
|
87
|
-
# hash. if false(default) the result will be parsed further, returning a
|
88
|
-
# list of [SearchEntry]
|
89
|
-
# @return [Array] containing {SearchEntry}
|
90
|
-
def self.raw_search(query, raw = false)
|
91
|
-
hash = Client.request(:get, register_api_string + 'search?' + query).parsed
|
92
|
-
return parse_search_results(hash) unless raw
|
93
|
-
hash
|
94
|
-
rescue Epo::Ops::Error::NotFound
|
95
|
-
[]
|
96
|
-
end
|
97
|
-
|
98
|
-
# @param search_entry [SearchEntry] a search entry which should be
|
99
|
-
# retrieved.
|
100
|
-
# @return [BibliographicDocument] a parsed document.
|
101
|
-
def self.biblio(search_entry)
|
102
|
-
raw_biblio(search_entry.application_reference.epodoc_reference)
|
103
|
-
end
|
104
|
-
|
105
|
-
# @param reference_id [String] identifier for document. Format similar to
|
106
|
-
# EP1000000
|
107
|
-
# @param format [String] epodoc is a format defined by the EPO for a
|
108
|
-
# document id. see their documentation.
|
109
|
-
# @param type [String] may be `application` or `publication` make sure
|
110
|
-
# that the `reference_id` is matching
|
111
|
-
# @param raw [Boolean] flag if the result should be returned as a raw Hash
|
112
|
-
# or parsed as {BibliographicDocument}
|
113
|
-
# @return [BibliographicDocument, Hash]
|
114
|
-
def self.raw_biblio(reference_id, type = 'application', format = 'epodoc', raw = false)
|
115
|
-
request = "#{register_api_string}#{type}/#{format}/#{reference_id}/biblio"
|
116
|
-
result = Client.request(:get, request).parsed
|
117
|
-
raw ? result : BibliographicDocument.new(result)
|
118
|
-
end
|
119
|
-
|
120
|
-
Reference = Struct.new(:country, :doc_number, :date) do
|
121
|
-
def epodoc_reference
|
122
|
-
country + doc_number
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
SearchEntry = Struct.new(:publication_reference, :application_reference, :ipc_classes)
|
127
|
-
|
128
|
-
private
|
129
|
-
|
130
|
-
def self.parse_search_results(result)
|
131
|
-
path = %w(world_patent_data register_search register_documents register_document bibliographic_data)
|
132
|
-
|
133
|
-
list = Util.find_in_data(result, path)
|
134
|
-
list.map do |entry|
|
135
|
-
publication_reference = Reference.new(
|
136
|
-
entry['publication_reference']['document_id']['country'],
|
137
|
-
entry['publication_reference']['document_id']['doc_number'],
|
138
|
-
entry['publication_reference']['document_id']['date'])
|
139
|
-
application_reference = Reference.new(
|
140
|
-
entry['application_reference']['document_id']['country'],
|
141
|
-
entry['application_reference']['document_id']['doc_number'])
|
142
|
-
ipc_classes = entry['classifications_ipcr']['classification_ipcr']['text'].split(';;').map(&:strip)
|
143
|
-
SearchEntry.new(publication_reference, application_reference, ipc_classes)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def self.register_api_string
|
148
|
-
"/#{Epo::Ops::API_VERSION}/rest-services/register/"
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'epo/ops/limits'
|
2
|
-
require 'epo/ops/logger'
|
3
|
-
|
4
|
-
module Epo
|
5
|
-
module Ops
|
6
|
-
# This Builder helps creating a search query using
|
7
|
-
# {https://www.loc.gov/standards/sru/cql/ CQL} (Common Query Language or
|
8
|
-
# Contextual Query Language) with the identifiers specified by the EPO in
|
9
|
-
# the OPS Documentation chapter 4.2 ({https://www.epo.org/searching-for-patents/technical/espacenet/ops.html Link})
|
10
|
-
# - use tab Downloads and see file 'OPS version 3.1 documentation').
|
11
|
-
class SearchQueryBuilder
|
12
|
-
# Build the query with the given parameters. Invalid ranges are fixed
|
13
|
-
# automatically and you will be notified about the changes
|
14
|
-
# @return [String]
|
15
|
-
def self.build(ipc_class, date, range_start = 1, range_end = nil)
|
16
|
-
validated_range = validate_range range_start, range_end
|
17
|
-
"q=#{build_params(ipc_class, date)}&Range=#{validated_range[0]}-#{validated_range[1]}"
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def self.build_params(ipc_class, date)
|
23
|
-
[build_date(date), build_class(ipc_class)].compact.join(' and ')
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.build_date(date)
|
27
|
-
if date
|
28
|
-
"pd=#{('%04d' % date.year)}"\
|
29
|
-
"#{('%02d' % date.month)}"\
|
30
|
-
"#{('%02d' % date.day)}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.build_class(ipc_class)
|
35
|
-
"ic=#{ipc_class}" if ipc_class
|
36
|
-
end
|
37
|
-
|
38
|
-
# Fixes the range given so that they meed the EPO APIs rules. The range
|
39
|
-
# may only be 100 elements long, the maximum allowed value is 2000.
|
40
|
-
# If the given window is out of range, it will be moved preserving the
|
41
|
-
# distance covered.
|
42
|
-
# @see Epo::Ops::Limits
|
43
|
-
# @return array with two elements: [range_start, range_end]
|
44
|
-
def self.validate_range(range_start, range_end)
|
45
|
-
if range_start > range_end
|
46
|
-
range_start, range_end = range_end, range_start
|
47
|
-
Logger.log('range_start was bigger than range_end, swapped values')
|
48
|
-
elsif range_end - range_start > Limits::MAX_QUERY_INTERVAL - 1
|
49
|
-
range_end = range_start + Limits::MAX_QUERY_INTERVAL - 1
|
50
|
-
Logger.log("range invalid, set to: #{[range_start, range_end]}")
|
51
|
-
end
|
52
|
-
if range_start < 1
|
53
|
-
range_end = range_end - range_start + 1
|
54
|
-
range_start = 1
|
55
|
-
Logger.log("range_start must be > 0, set to: #{[range_start, range_end]}")
|
56
|
-
elsif range_end > Limits::MAX_QUERY_RANGE
|
57
|
-
range_start = Limits::MAX_QUERY_RANGE - (range_end - range_start)
|
58
|
-
range_end = Limits::MAX_QUERY_RANGE
|
59
|
-
Logger.log("range_end was too big, set to: #{[range_start, range_end]}")
|
60
|
-
end
|
61
|
-
[range_start, range_end]
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/lib/epo/ops/token_store.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'oauth2'
|
2
|
-
require 'epo/ops'
|
3
|
-
|
4
|
-
module Epo
|
5
|
-
module Ops
|
6
|
-
# This class saves the token in memory, you may want to subclass this and
|
7
|
-
# overwrite #token if you want to store it somewhere else.
|
8
|
-
#
|
9
|
-
class TokenStore
|
10
|
-
def token
|
11
|
-
@token = generate_token if !@token || @token.expired?
|
12
|
-
|
13
|
-
@token
|
14
|
-
end
|
15
|
-
|
16
|
-
def reset
|
17
|
-
@token = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
protected
|
21
|
-
|
22
|
-
def generate_token
|
23
|
-
client = OAuth2::Client.new(
|
24
|
-
Epo::Ops.config.consumer_key,
|
25
|
-
Epo::Ops.config.consumer_secret,
|
26
|
-
site: 'https://ops.epo.org/',
|
27
|
-
token_url: "/#{Epo::Ops::API_VERSION}/auth/accesstoken",
|
28
|
-
raise_errors: false
|
29
|
-
)
|
30
|
-
|
31
|
-
client.client_credentials.get_token
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|