gini-api 0.9.8 → 0.9.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/Gemfile.lock +133 -0
- data/README.md +8 -4
- data/lib/gini-api/document/extractions.rb +56 -3
- data/lib/gini-api/document.rb +1 -0
- data/lib/gini-api/version.rb +1 -1
- data/spec/gini-api/client_spec.rb +1 -1
- data/spec/gini-api/document/extraction_spec.rb +103 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f482221a91704b834f741e93bc66ed8d387f673b
|
4
|
+
data.tar.gz: 7cabfa0aa95303038767caf0058ac02e6684d9cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0819422ce704bd75d4ef24b46ee3566a980453e79819f541312cd6c08a49477f5178c2e7da36eda92c9c541b6dd4b2370ca2e57013c3974ae45477bf7d385c4e
|
7
|
+
data.tar.gz: b068d3ef18cf8daa7c9514c85c0fd69004e83f65c0f84f6b8bd4189a0589cfcf17b43ce7ab53366ffec32c201eee5b41d979343a9d767e88b4790a8f13144321
|
data/.gitignore
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
gini-api (0.9.9)
|
5
|
+
logger
|
6
|
+
oauth2
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
addressable (2.3.6)
|
12
|
+
builder (3.2.2)
|
13
|
+
celluloid (0.16.0)
|
14
|
+
timers (~> 4.0.0)
|
15
|
+
ci_reporter (2.0.0)
|
16
|
+
builder (>= 2.1.2)
|
17
|
+
ci_reporter_rspec (1.0.0)
|
18
|
+
ci_reporter (~> 2.0)
|
19
|
+
rspec (>= 2.14, < 4)
|
20
|
+
coderay (1.1.0)
|
21
|
+
coveralls (0.7.2)
|
22
|
+
multi_json (~> 1.3)
|
23
|
+
rest-client (= 1.6.7)
|
24
|
+
simplecov (>= 0.7)
|
25
|
+
term-ansicolor (= 1.2.2)
|
26
|
+
thor (= 0.18.1)
|
27
|
+
crack (0.4.2)
|
28
|
+
safe_yaml (~> 1.0.0)
|
29
|
+
diff-lcs (1.2.5)
|
30
|
+
docile (1.1.5)
|
31
|
+
faraday (0.9.1)
|
32
|
+
multipart-post (>= 1.2, < 3)
|
33
|
+
ffi (1.9.6)
|
34
|
+
formatador (0.2.5)
|
35
|
+
guard (2.11.1)
|
36
|
+
formatador (>= 0.2.4)
|
37
|
+
listen (~> 2.7)
|
38
|
+
lumberjack (~> 1.0)
|
39
|
+
nenv (~> 0.1)
|
40
|
+
notiffany (~> 0.0)
|
41
|
+
pry (>= 0.9.12)
|
42
|
+
shellany (~> 0.0)
|
43
|
+
thor (>= 0.18.1)
|
44
|
+
guard-compat (1.2.0)
|
45
|
+
guard-rspec (4.5.0)
|
46
|
+
guard (~> 2.1)
|
47
|
+
guard-compat (~> 1.1)
|
48
|
+
rspec (>= 2.99.0, < 4.0)
|
49
|
+
hitimes (1.2.2)
|
50
|
+
jwt (1.2.0)
|
51
|
+
listen (2.8.5)
|
52
|
+
celluloid (>= 0.15.2)
|
53
|
+
rb-fsevent (>= 0.9.3)
|
54
|
+
rb-inotify (>= 0.9)
|
55
|
+
logger (1.2.8)
|
56
|
+
lumberjack (1.0.9)
|
57
|
+
method_source (0.8.2)
|
58
|
+
mime-types (2.4.3)
|
59
|
+
multi_json (1.10.1)
|
60
|
+
multi_xml (0.5.5)
|
61
|
+
multipart-post (2.0.0)
|
62
|
+
nenv (0.1.1)
|
63
|
+
notiffany (0.0.2)
|
64
|
+
nenv (~> 0.1)
|
65
|
+
shellany (~> 0.0)
|
66
|
+
oauth2 (1.0.0)
|
67
|
+
faraday (>= 0.8, < 0.10)
|
68
|
+
jwt (~> 1.0)
|
69
|
+
multi_json (~> 1.3)
|
70
|
+
multi_xml (~> 0.5)
|
71
|
+
rack (~> 1.2)
|
72
|
+
pry (0.10.1)
|
73
|
+
coderay (~> 1.1.0)
|
74
|
+
method_source (~> 0.8.1)
|
75
|
+
slop (~> 3.4)
|
76
|
+
rack (1.6.0)
|
77
|
+
rake (10.4.2)
|
78
|
+
rb-fsevent (0.9.4)
|
79
|
+
rb-inotify (0.9.5)
|
80
|
+
ffi (>= 0.5.0)
|
81
|
+
redcarpet (3.2.2)
|
82
|
+
rest-client (1.6.7)
|
83
|
+
mime-types (>= 1.16)
|
84
|
+
rspec (3.1.0)
|
85
|
+
rspec-core (~> 3.1.0)
|
86
|
+
rspec-expectations (~> 3.1.0)
|
87
|
+
rspec-mocks (~> 3.1.0)
|
88
|
+
rspec-core (3.1.7)
|
89
|
+
rspec-support (~> 3.1.0)
|
90
|
+
rspec-expectations (3.1.2)
|
91
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
92
|
+
rspec-support (~> 3.1.0)
|
93
|
+
rspec-mocks (3.1.3)
|
94
|
+
rspec-support (~> 3.1.0)
|
95
|
+
rspec-support (3.1.2)
|
96
|
+
safe_yaml (1.0.4)
|
97
|
+
shellany (0.0.1)
|
98
|
+
simplecov (0.9.1)
|
99
|
+
docile (~> 1.1.0)
|
100
|
+
multi_json (~> 1.0)
|
101
|
+
simplecov-html (~> 0.8.0)
|
102
|
+
simplecov-html (0.8.0)
|
103
|
+
simplecov-rcov (0.2.3)
|
104
|
+
simplecov (>= 0.4.1)
|
105
|
+
slop (3.6.0)
|
106
|
+
term-ansicolor (1.2.2)
|
107
|
+
tins (~> 0.8)
|
108
|
+
thor (0.18.1)
|
109
|
+
timers (4.0.1)
|
110
|
+
hitimes
|
111
|
+
tins (0.13.2)
|
112
|
+
webmock (1.20.4)
|
113
|
+
addressable (>= 2.3.6)
|
114
|
+
crack (>= 0.3.2)
|
115
|
+
yard (0.8.7.6)
|
116
|
+
|
117
|
+
PLATFORMS
|
118
|
+
ruby
|
119
|
+
|
120
|
+
DEPENDENCIES
|
121
|
+
bundler
|
122
|
+
ci_reporter_rspec
|
123
|
+
coveralls
|
124
|
+
gini-api!
|
125
|
+
guard-rspec
|
126
|
+
pry
|
127
|
+
rake
|
128
|
+
redcarpet
|
129
|
+
rspec
|
130
|
+
simplecov
|
131
|
+
simplecov-rcov
|
132
|
+
webmock
|
133
|
+
yard
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
<img src="https://www.gini.net/
|
1
|
+
<img src="https://www.gini.net/assets/gini_api_logo.svg" width="222" alt="Gini API logo" />
|
2
2
|
|
3
3
|
# Gini API Ruby client
|
4
4
|
|
@@ -144,14 +144,18 @@ doc.extractions.candidates[:dates]
|
|
144
144
|
# => Array of all found candidates
|
145
145
|
doc.extractions.raw
|
146
146
|
# => {:extractions=>{...
|
147
|
+
doc.extractions.undefinedLabel
|
148
|
+
# => nil
|
147
149
|
```
|
148
150
|
|
149
151
|
### Submitting feedback
|
150
152
|
|
151
153
|
```ruby
|
152
|
-
doc.
|
153
|
-
# =>
|
154
|
-
doc.
|
154
|
+
doc.extractions.bic = 'XXXXXXXX'
|
155
|
+
# => 'XXXXXXXX'
|
156
|
+
doc.extractions.bic = { value: 'XXXXXXXX', :box=>{:top=>2176.0, :left=>2000.0, :width=>173.0, :height=>50.0, :page=>1 }
|
157
|
+
# => { value: 'XXXXXXXX', box: { top: 2176.0, left: 2000.0, width: 173.0, height: 50.0, page: 1 }
|
158
|
+
doc.extractions.unknownLabel = 'XXXXXXXX'
|
155
159
|
# => raises Gini::Api::DocumentError
|
156
160
|
```
|
157
161
|
|
@@ -35,11 +35,9 @@ module Gini
|
|
35
35
|
|
36
36
|
response.parsed[:extractions].each do |k,v|
|
37
37
|
instance_variable_set("@#{k}", v)
|
38
|
-
self.class.send(:attr_reader, k)
|
39
38
|
end
|
40
39
|
|
41
40
|
instance_variable_set("@candidates", response.parsed[:candidates])
|
42
|
-
self.class.send(:attr_reader, :candidates)
|
43
41
|
end
|
44
42
|
|
45
43
|
# Get filed value for given extraction key
|
@@ -49,11 +47,66 @@ module Gini
|
|
49
47
|
#
|
50
48
|
def [](item)
|
51
49
|
unless instance_variable_get("@#{item}")
|
52
|
-
raise Gini::Api::DocumentError.new("Invalid extraction key #{item}: Not found")
|
50
|
+
raise Gini::Api::DocumentError.new("Invalid extraction key '#{item}': Not found")
|
51
|
+
end
|
52
|
+
|
53
|
+
# method_missing requires some additional checks
|
54
|
+
label = instance_variable_get("@#{item}")
|
55
|
+
|
56
|
+
unless label.is_a? Hash and label.has_key? :value
|
57
|
+
raise Gini::Api::DocumentError.new("Extraction key '#{item}' has no :value defined")
|
53
58
|
end
|
54
59
|
|
55
60
|
instance_variable_get("@#{item}")[:value]
|
56
61
|
end
|
62
|
+
|
63
|
+
# Submit feedback on extraction label
|
64
|
+
#
|
65
|
+
# @param [String] label Extraction label to submit feedback on
|
66
|
+
# @param [Hash] feedback Hash containing at least key :value (:box is optional)
|
67
|
+
#
|
68
|
+
def submit_feedback(label, feedback)
|
69
|
+
response = @api.request(
|
70
|
+
:put,
|
71
|
+
"#{@location}/#{label}",
|
72
|
+
headers: { 'content-type' => @api.version_header[:accept] },
|
73
|
+
body: feedback.to_json
|
74
|
+
)
|
75
|
+
rescue Gini::Api::RequestError => e
|
76
|
+
if e.api_status == 422
|
77
|
+
raise Gini::Api::DocumentError.new(
|
78
|
+
"Failed to submit feedback for label '#{label}' (code=#{e.api_status}, msg=#{e.api_response.body})",
|
79
|
+
response
|
80
|
+
)
|
81
|
+
end
|
82
|
+
raise
|
83
|
+
end
|
84
|
+
|
85
|
+
# Create setter and getter dynamically with method_missing
|
86
|
+
#
|
87
|
+
# @param [Symbol] m method name
|
88
|
+
# @param [Array] args method arguments
|
89
|
+
# @param [Block] block Block passed to the missing method
|
90
|
+
# @return [Hash, Nil] Return extraction hash or nil
|
91
|
+
#
|
92
|
+
def method_missing(m, *args, &block)
|
93
|
+
m_name = m.to_s
|
94
|
+
label = m_name.split('=')[0]
|
95
|
+
|
96
|
+
if m_name.end_with? '='
|
97
|
+
# setter method. Set instance variable and submit feedback
|
98
|
+
if args[0].is_a? Hash
|
99
|
+
feedback = args[0]
|
100
|
+
else
|
101
|
+
feedback = { value: args[0] }
|
102
|
+
end
|
103
|
+
instance_variable_set("@#{label}", feedback)
|
104
|
+
submit_feedback(label, feedback)
|
105
|
+
else
|
106
|
+
# getter. return instance variable or nil
|
107
|
+
instance_variable_get("@#{label}")
|
108
|
+
end
|
109
|
+
end
|
57
110
|
end
|
58
111
|
end
|
59
112
|
end
|
data/lib/gini-api/document.rb
CHANGED
@@ -124,6 +124,7 @@ module Gini
|
|
124
124
|
|
125
125
|
# Submit feedback on extraction label
|
126
126
|
#
|
127
|
+
# @deprecated Use 'doc.extractions.LABEL = VALUE' instead. Will be removed in next version
|
127
128
|
# @param [String] label Extraction label to submit feedback on
|
128
129
|
# @param [String] value The new value for the given label
|
129
130
|
#
|
data/lib/gini-api/version.rb
CHANGED
@@ -47,7 +47,10 @@ describe Gini::Api::Document::Extractions do
|
|
47
47
|
entity: 'date',
|
48
48
|
value: '2012-06-20',
|
49
49
|
candidates: 'dates'
|
50
|
-
}
|
50
|
+
},
|
51
|
+
invalid: {
|
52
|
+
this_is: 'wrong'
|
53
|
+
},
|
51
54
|
},
|
52
55
|
candidates: {
|
53
56
|
dates: [
|
@@ -99,11 +102,20 @@ describe Gini::Api::Document::Extractions do
|
|
99
102
|
|
100
103
|
describe '#[]' do
|
101
104
|
|
102
|
-
context 'with
|
105
|
+
context 'with missing key' do
|
103
106
|
|
104
107
|
it 'raises exception' do
|
105
108
|
expect { extractions[:unknown] }.to \
|
106
|
-
raise_error(Gini::Api::DocumentError, /Invalid extraction key unknown/)
|
109
|
+
raise_error(Gini::Api::DocumentError, /Invalid extraction key 'unknown'/)
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'with missing :value in response' do
|
115
|
+
|
116
|
+
it 'raises exception' do
|
117
|
+
expect { extractions[:invalid] }.to \
|
118
|
+
raise_error(Gini::Api::DocumentError, /Extraction key 'invalid' has no :value defined/)
|
107
119
|
end
|
108
120
|
|
109
121
|
end
|
@@ -118,4 +130,92 @@ describe Gini::Api::Document::Extractions do
|
|
118
130
|
|
119
131
|
end
|
120
132
|
|
133
|
+
describe '#method_missing' do
|
134
|
+
|
135
|
+
context 'with unknown extraction' do
|
136
|
+
|
137
|
+
context 'and only value' do
|
138
|
+
|
139
|
+
it 'will set instance variable to new hash' do
|
140
|
+
expect(extractions).to receive(:instance_variable_set).with('@test', {value: :test})
|
141
|
+
expect(extractions).to receive(:submit_feedback).with('test', {:value=>:test})
|
142
|
+
extractions.test = :test
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
context 'and hash' do
|
148
|
+
|
149
|
+
it 'will set instance variable to supplied hash' do
|
150
|
+
expect(extractions).to receive(:instance_variable_set).with('@test', {value: 'test', box: {}})
|
151
|
+
expect(extractions).to receive(:submit_feedback).with('test', {value: 'test', box: {}})
|
152
|
+
extractions.test = {value: 'test', box: {} }
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
describe '#submit_feedback' do
|
162
|
+
|
163
|
+
context 'with valid label' do
|
164
|
+
|
165
|
+
before do
|
166
|
+
allow(api.token).to receive(:put).with(
|
167
|
+
"#{location}/test",
|
168
|
+
{
|
169
|
+
headers: { 'content-type' => header },
|
170
|
+
body: { value: 'Johnny Bravo' }.to_json
|
171
|
+
}
|
172
|
+
).and_return(OAuth2::Response.new(double('Response', status: 204)))
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'succeeds' do
|
176
|
+
expect(extractions.submit_feedback(:test, {value: 'Johnny Bravo'})).to be_a(OAuth2::Response)
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'with invalid label (http code 422)' do
|
182
|
+
|
183
|
+
before do
|
184
|
+
allow(api.token).to receive(:put).with(
|
185
|
+
"#{location}/test",
|
186
|
+
{
|
187
|
+
headers: { 'content-type' => header },
|
188
|
+
body: { value: 'Johnny Bravo' }.to_json
|
189
|
+
}
|
190
|
+
).and_raise(Gini::Api::RequestError.new('dummy', double('xxx', status: 422, env: {}, body: {})))
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'raises Gini::Api::DocumentError' do
|
194
|
+
expect{extractions.submit_feedback(:test, {value: 'Johnny Bravo'})}.to \
|
195
|
+
raise_error(Gini::Api::DocumentError, /Failed to submit feedback for label/)
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'with undefined error' do
|
201
|
+
|
202
|
+
before do
|
203
|
+
allow(api.token).to receive(:put).with(
|
204
|
+
"#{location}/test",
|
205
|
+
{
|
206
|
+
headers: { 'content-type' => header },
|
207
|
+
body: { value: 'Johnny Bravo' }.to_json
|
208
|
+
}
|
209
|
+
).and_raise(Gini::Api::RequestError.new('dummy', double('xxx', status: 500, env: {}, body: {})))
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'raises Gini::Api::RequestError' do
|
213
|
+
expect{extractions.submit_feedback(:test, {value: 'Johnny Bravo'})}.to \
|
214
|
+
raise_error(Gini::Api::RequestError)
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
121
221
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gini-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Kerwin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth2
|
@@ -217,6 +217,7 @@ files:
|
|
217
217
|
- ".rspec"
|
218
218
|
- ".travis.yml"
|
219
219
|
- Gemfile
|
220
|
+
- Gemfile.lock
|
220
221
|
- Guardfile
|
221
222
|
- README.md
|
222
223
|
- Rakefile
|