epo-ops 0.3.0 → 0.3.1
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 +4 -4
- data/.travis.yml +3 -4
- data/README.md +9 -6
- data/epo-ops.gemspec +1 -1
- data/lib/epo_ops.rb +15 -0
- data/lib/epo_ops/client.rb +2 -4
- data/lib/epo_ops/error.rb +0 -2
- data/lib/epo_ops/factories.rb +0 -4
- data/lib/epo_ops/factories/name_and_address_factory.rb +2 -6
- data/lib/epo_ops/factories/patent_application_factory.rb +3 -4
- data/lib/epo_ops/factories/register_search_result_factory.rb +1 -1
- data/lib/epo_ops/ipc_class_hierarchy_loader.rb +1 -4
- data/lib/epo_ops/ipc_class_util.rb +0 -2
- data/lib/epo_ops/patent_application.rb +10 -4
- data/lib/epo_ops/register.rb +2 -8
- data/lib/epo_ops/search_query_builder.rb +0 -3
- data/lib/epo_ops/token_store.rb +2 -5
- data/lib/epo_ops/token_store/redis.rb +0 -3
- data/lib/epo_ops/util.rb +1 -1
- data/lib/epo_ops/version.rb +2 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61d513627347b49b4799e4fdf0081ff1f34cd712
|
4
|
+
data.tar.gz: 9dbef686b5c975cbc3b36b40bf741fd943db62a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da76bac459cb2c43c4c0b018fc5fb5863a33b827de6f07f5ed6716276e6494a5a4b9e8f621fed4bfcefe066590c0b653cf734afe256059dedec87b6ed0ce8f27
|
7
|
+
data.tar.gz: 70a3f9a80c879c004a30e61344264482b2f004de679b62c84e9457fb9acf6c484ec2d3bdc8803a70555fc4b4f9704f65d6be29c2107895994dd9b9ae0b3c6e69
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -24,10 +24,13 @@ require 'epo_ops'
|
|
24
24
|
|
25
25
|
patent_application = EpoOps::PatentApplication.find("EP14731659")
|
26
26
|
patent_application.title # "DEVICE AND METHOD FOR INTRODUCING FIBRES INTO AN EXTRUDER"
|
27
|
-
patent_application.classifications # ["B29C47/10", "B29C47/68", "B29C47/92", "B29C45/00", "B01D46/24"]
|
27
|
+
patent_application.classifications # ["B29C47/10", "B29C47/68", "B29C47/92", "B29C45/00", "B01D46/24"]
|
28
28
|
patent_application.applicants.first.name # "Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V."
|
29
29
|
```
|
30
30
|
|
31
|
+
## Supported Ruby Versions
|
32
|
+
For supported versions see _.travis.yml_. We try to keep it updated to officially supported Ruby versions.
|
33
|
+
|
31
34
|
## Advanced Usage
|
32
35
|
|
33
36
|
### OAuth
|
@@ -60,9 +63,9 @@ CQL search query
|
|
60
63
|
For example to find all applications in IPC Class _A01_ (and all subclasses) that were updated on 2016-01-01
|
61
64
|
|
62
65
|
```ruby
|
63
|
-
query = EpoOps::SearchQueryBuilder.build("A01", Date.parse("2016-01-
|
66
|
+
query = EpoOps::SearchQueryBuilder.build("A01", Date.parse("2016-01-06"))
|
64
67
|
applications = EpoOps::PatentApplication.search(query)
|
65
|
-
|
68
|
+
applications.count #=> 66
|
66
69
|
applications.map {|application| puts application.application_nr } # print all application numbers
|
67
70
|
applications.map {|application| application.fetch} # fetch complete bibliographic data for each document
|
68
71
|
|
@@ -89,8 +92,8 @@ EpoOps::Register.search(nil, Date.new(2016,2 ,3))
|
|
89
92
|
You can now retrieve the bibliographic entries of all these:
|
90
93
|
|
91
94
|
```ruby
|
92
|
-
|
93
|
-
|
95
|
+
patent_applications = EpoOps::Register.search(nil, Date.new(2016,2 ,3))
|
96
|
+
patent_applications.count == patent_applications.patents.count #=> true
|
94
97
|
```
|
95
98
|
|
96
99
|
**Note: Both operations take a considerable amount of time. Also you may not
|
@@ -108,4 +111,4 @@ of the different endpoints and how to use them (see the 'Downloads' section).
|
|
108
111
|
|
109
112
|
This gem is still an early version and it is far from covering the whole API.
|
110
113
|
If you are interested to include different API endpoints than the register it should be easy to include those and we
|
111
|
-
are happy to accept pull requests.
|
114
|
+
are happy to accept pull requests.
|
data/epo-ops.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
-
spec.add_development_dependency 'rake', '~>
|
22
|
+
spec.add_development_dependency 'rake', '~> 11'
|
23
23
|
spec.add_development_dependency 'minitest', '~> 5.8'
|
24
24
|
spec.add_development_dependency 'mocha'
|
25
25
|
spec.add_development_dependency 'vcr', '~> 2.9'
|
data/lib/epo_ops.rb
CHANGED
@@ -1,13 +1,28 @@
|
|
1
|
+
require 'oauth2'
|
2
|
+
require 'httparty'
|
3
|
+
require 'redis'
|
4
|
+
require 'connection_pool'
|
1
5
|
require 'epo_ops/version'
|
2
6
|
require 'epo_ops/token_store'
|
3
7
|
require 'epo_ops/register'
|
4
8
|
require 'epo_ops/search_query_builder'
|
5
9
|
require 'epo_ops/ipc_class_hierarchy_loader'
|
6
10
|
require 'epo_ops/ipc_class_util'
|
11
|
+
require 'epo_ops/ipc_class_hierarchy'
|
7
12
|
require 'epo_ops/patent_application'
|
8
13
|
require 'epo_ops/name_and_address'
|
9
14
|
require 'epo_ops/factories'
|
10
15
|
require 'epo_ops/register_search_result'
|
16
|
+
require 'epo_ops/client'
|
17
|
+
require 'epo_ops/util'
|
18
|
+
require 'epo_ops/logger'
|
19
|
+
require 'epo_ops/limits'
|
20
|
+
require 'epo_ops/error'
|
21
|
+
require 'epo_ops/rate_limit'
|
22
|
+
require 'epo_ops/factories/patent_application_factory'
|
23
|
+
require 'epo_ops/factories/name_and_address_factory'
|
24
|
+
require 'epo_ops/factories/register_search_result_factory'
|
25
|
+
|
11
26
|
|
12
27
|
module EpoOps
|
13
28
|
# Configure authentication method and credentials
|
data/lib/epo_ops/client.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'epo_ops/token_store'
|
2
|
-
require 'epo_ops/error'
|
3
|
-
|
4
1
|
module EpoOps
|
5
2
|
|
6
3
|
# This is a wrapper for OAuth
|
@@ -13,6 +10,7 @@ module EpoOps
|
|
13
10
|
# @option options [Hash] :headers http request headers
|
14
11
|
# @raise [EpoOps::Error] API Error if request was not successful
|
15
12
|
def self.request(verb, url, options = {})
|
13
|
+
EpoOps::Logger.debug("Sending Request: #{verb} #{url}")
|
16
14
|
response = case EpoOps.config.authentication
|
17
15
|
when :oauth then do_oauth_request(verb, url, options)
|
18
16
|
when :plain then do_plain_request(verb,url,options)
|
@@ -31,7 +29,7 @@ module EpoOps
|
|
31
29
|
# @return [OAuth2::Response]
|
32
30
|
def self.do_oauth_request(verb, url, options = {})
|
33
31
|
token = EpoOps.config.token_store.token
|
34
|
-
token.request(verb,
|
32
|
+
token.request(verb, url, options)
|
35
33
|
end
|
36
34
|
|
37
35
|
# Make an anonymous request to the EPO API
|
data/lib/epo_ops/error.rb
CHANGED
data/lib/epo_ops/factories.rb
CHANGED
@@ -32,12 +32,9 @@ module EpoOps
|
|
32
32
|
:country_code,
|
33
33
|
:cdsid
|
34
34
|
|
35
|
-
|
36
35
|
def initialize(raw_data)
|
37
36
|
@raw_data = raw_data
|
38
|
-
|
39
|
-
@name = raw_data['name']
|
40
|
-
|
37
|
+
@name = raw_data['name']
|
41
38
|
if raw_data['address'].is_a? Hash
|
42
39
|
@address_1 = raw_data['address']['address_1']
|
43
40
|
@address_2 = raw_data['address']['address_2']
|
@@ -46,8 +43,7 @@ module EpoOps
|
|
46
43
|
@address_5 = raw_data['address']['address_5']
|
47
44
|
@country_code = raw_data['address']['country']
|
48
45
|
end
|
49
|
-
|
50
|
-
@cdsid = raw_data['cdsid']
|
46
|
+
@cdsid = raw_data['cdsid']
|
51
47
|
end
|
52
48
|
end
|
53
49
|
end
|
@@ -34,7 +34,7 @@ module EpoOps
|
|
34
34
|
def patents
|
35
35
|
EpoOps::Util.flat_dig(
|
36
36
|
@raw_data,
|
37
|
-
%w
|
37
|
+
%w[world_patent_data register_search register_documents register_document]
|
38
38
|
).map {|patent_data| EpoOps::Factories::PatentApplicationFactory.build(patent_data)}
|
39
39
|
end
|
40
40
|
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
require 'epo_ops/ipc_class_util'
|
3
|
-
|
4
1
|
module EpoOps
|
5
2
|
# Usually this should only used internally.
|
6
3
|
# Loads the Hierarchy from the WIPO.
|
@@ -33,7 +30,7 @@ module EpoOps
|
|
33
30
|
# Process every line (There is a line for every class entry, name and description are separated by a \t)
|
34
31
|
file.each_line.inject(Hash.new { |h, k| h[k] = [] }) do |mem, line|
|
35
32
|
next if line.to_s.strip.empty?
|
36
|
-
ipc_class_generic,
|
33
|
+
ipc_class_generic, _description = line.split("\t")
|
37
34
|
|
38
35
|
# Some entries in the files have the same ipc class, the first line is
|
39
36
|
# just some kind of headline, the second is the description we want.
|
@@ -11,11 +11,11 @@ module EpoOps
|
|
11
11
|
# (for example EP and WO) we pick the first one returned - thus the returned document may have a different number
|
12
12
|
# @param application_number [String] identifies the application document at EPO
|
13
13
|
# @return [PatentApplication] the application document, nil if it can't be found
|
14
|
-
# @note API url: /3.
|
14
|
+
# @note API url: /3.2/rest-services/register/application/epodoc/#{application_number}/biblio
|
15
15
|
def find(application_number)
|
16
16
|
raw_data = EpoOps::Client.request(
|
17
17
|
:get,
|
18
|
-
"/
|
18
|
+
"/#{EpoOps::API_VERSION}/rest-services/register/application/epodoc/#{application_number}/biblio"
|
19
19
|
).parsed
|
20
20
|
|
21
21
|
data = EpoOps::Util.flat_dig(
|
@@ -41,7 +41,7 @@ module EpoOps
|
|
41
41
|
def search(cql_query)
|
42
42
|
data = Client.request(
|
43
43
|
:get,
|
44
|
-
|
44
|
+
"/#{EpoOps::API_VERSION}/rest-services/register/search?" + cql_query
|
45
45
|
).parsed
|
46
46
|
|
47
47
|
EpoOps::Factories::RegisterSearchResultFactory.build(data)
|
@@ -117,6 +117,12 @@ module EpoOps
|
|
117
117
|
@title[lang]
|
118
118
|
end
|
119
119
|
|
120
|
+
# Return the applications title in all available languages
|
121
|
+
# @return [Hash] titles in all languagles
|
122
|
+
def titles
|
123
|
+
@title
|
124
|
+
end
|
125
|
+
|
120
126
|
# Many fields of the XML the EPO provides have a field
|
121
127
|
# `change_gazette_num`. It is a commercial date (year + week)
|
122
128
|
# that describes in which week the element has been
|
@@ -131,7 +137,7 @@ module EpoOps
|
|
131
137
|
|
132
138
|
# @return [String] The URL at which you can query the original document.
|
133
139
|
def url
|
134
|
-
@url ||= "https://ops.epo.org/
|
140
|
+
@url ||= "https://ops.epo.org/#{EpoOps::API_VERSION}/rest-services/register/application/epodoc/#{application_nr}"
|
135
141
|
end
|
136
142
|
|
137
143
|
# Fetches the same document from the register populating all available fields
|
data/lib/epo_ops/register.rb
CHANGED
@@ -1,11 +1,5 @@
|
|
1
|
-
require 'epo_ops'
|
2
|
-
require 'epo_ops/client'
|
3
|
-
require 'epo_ops/util'
|
4
|
-
require 'epo_ops/logger'
|
5
|
-
require 'epo_ops/ipc_class_util'
|
6
|
-
|
7
1
|
module EpoOps
|
8
|
-
# Access to the {http://ops.epo.org/
|
2
|
+
# Access to the {http://ops.epo.org/#{EpoOps::API_VERSION}/rest-services/register register}
|
9
3
|
# endpoint of the EPO OPS API.
|
10
4
|
#
|
11
5
|
# By now you can search and retrieve patents by using the type `application`
|
@@ -89,7 +83,7 @@ module EpoOps
|
|
89
83
|
def self.raw_search(query, raw = false)
|
90
84
|
data = Client.request(
|
91
85
|
:get,
|
92
|
-
|
86
|
+
"/#{EpoOps::API_VERSION}/rest-services/register/search?" + query
|
93
87
|
).parsed
|
94
88
|
|
95
89
|
EpoOps::Factories::RegisterSearchResultFactory.build(data)
|
data/lib/epo_ops/token_store.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
|
-
require 'oauth2'
|
2
|
-
require 'epo_ops'
|
3
|
-
|
4
1
|
module EpoOps
|
5
2
|
# This class saves the token in memory, you may want to subclass this and
|
6
3
|
# overwrite #token if you want to store it somewhere else.
|
7
4
|
#
|
8
5
|
class TokenStore
|
9
6
|
def token
|
10
|
-
@token = generate_token if
|
7
|
+
@token = generate_token if @token.nil? || @token.expired?
|
11
8
|
|
12
9
|
@token
|
13
10
|
end
|
@@ -23,7 +20,7 @@ module EpoOps
|
|
23
20
|
EpoOps.config.consumer_key,
|
24
21
|
EpoOps.config.consumer_secret,
|
25
22
|
site: 'https://ops.epo.org/',
|
26
|
-
token_url:
|
23
|
+
token_url: "/#{EpoOps::API_VERSION}/auth/accesstoken",
|
27
24
|
raise_errors: false
|
28
25
|
)
|
29
26
|
|
data/lib/epo_ops/util.rb
CHANGED
@@ -46,7 +46,7 @@ module EpoOps
|
|
46
46
|
def self.parse_change_gazette_num(num)
|
47
47
|
res = /^(?<year>\d{4})\/(?<week>\d{2})$/.match(num)
|
48
48
|
return nil if res.nil?
|
49
|
-
Date.commercial(Integer(res[:year], 10),
|
49
|
+
Date.commercial(Integer(res[:year], 10), Integer(res[:week], 10))
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
data/lib/epo_ops/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epo-ops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Max Kießling
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-06-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -32,14 +32,14 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '11'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '11'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: minitest
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -221,7 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
221
|
version: '0'
|
222
222
|
requirements: []
|
223
223
|
rubyforge_project:
|
224
|
-
rubygems_version: 2.
|
224
|
+
rubygems_version: 2.6.11
|
225
225
|
signing_key:
|
226
226
|
specification_version: 4
|
227
227
|
summary: Ruby interface to the European Patent Office API (OPS)
|