phraseapp-ruby 1.2.4 → 1.2.5
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/lib/phraseapp-ruby.rb +297 -317
- data/lib/phraseapp-ruby/auth.rb +8 -16
- data/lib/phraseapp-ruby/request_handler.rb +18 -27
- data/lib/phraseapp-ruby/version.rb +1 -1
- metadata +3 -3
data/lib/phraseapp-ruby/auth.rb
CHANGED
@@ -15,22 +15,15 @@ module PhraseApp
|
|
15
15
|
@host
|
16
16
|
end
|
17
17
|
|
18
|
-
def validate
|
18
|
+
def validate!
|
19
19
|
if self.username.to_s == "" && self.token.to_s == ""
|
20
|
-
|
21
|
-
else
|
22
|
-
return nil
|
20
|
+
raise ValidationError.new("either username or token must be given")
|
23
21
|
end
|
24
22
|
end
|
25
23
|
|
26
24
|
def authenticate(req)
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
if err = validate
|
32
|
-
return err
|
33
|
-
end
|
25
|
+
load_config
|
26
|
+
validate!
|
34
27
|
|
35
28
|
if self.token && self.token != ""
|
36
29
|
req["Authorization"] = "token #{self.token}"
|
@@ -41,13 +34,11 @@ module PhraseApp
|
|
41
34
|
raise "Multi-Factor Token required in config but not provided." unless self.tfa_token
|
42
35
|
req["X-PhraseApp-OTP"] = auth.tfa_token
|
43
36
|
end
|
44
|
-
else
|
45
|
-
raise "No authentication present"
|
46
37
|
end
|
47
38
|
|
48
39
|
return nil
|
49
|
-
|
50
40
|
end
|
41
|
+
|
51
42
|
private
|
52
43
|
def load_config
|
53
44
|
path = config
|
@@ -81,9 +72,10 @@ module PhraseApp
|
|
81
72
|
if configCredentials.debug
|
82
73
|
self.debug = configCredentials.debug
|
83
74
|
end
|
84
|
-
|
85
|
-
return nil
|
86
75
|
end
|
87
76
|
end
|
88
77
|
end
|
89
78
|
end
|
79
|
+
|
80
|
+
class ValidationError < StandardError
|
81
|
+
end
|
@@ -10,12 +10,10 @@ module PhraseApp
|
|
10
10
|
|
11
11
|
def initialize(http_response)
|
12
12
|
hash = JSON.load(http_response.body)
|
13
|
-
|
13
|
+
@message = hash['message']
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
self.message
|
18
|
-
end
|
16
|
+
alias_method :error, :message
|
19
17
|
end
|
20
18
|
|
21
19
|
class ValidationErrorResponse
|
@@ -24,8 +22,8 @@ module PhraseApp
|
|
24
22
|
|
25
23
|
def initialize(http_response)
|
26
24
|
hash = JSON.load(http_response.body)
|
27
|
-
|
28
|
-
|
25
|
+
@message = hash['message']
|
26
|
+
@errors = hash['errors'].map { |error| ValidationErrorMessage.new(error) }
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
@@ -33,13 +31,13 @@ module PhraseApp
|
|
33
31
|
attr_reader :resource, :field, :message
|
34
32
|
|
35
33
|
def initialize(error)
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
@resource = error["resource"]
|
35
|
+
@field = error["field"]
|
36
|
+
@message = error["message"]
|
39
37
|
end
|
40
38
|
|
41
39
|
def to_s
|
42
|
-
|
40
|
+
sprintf("\t[%s:%s] %s", self.resource, self.field, self.message)
|
43
41
|
end
|
44
42
|
end
|
45
43
|
|
@@ -47,13 +45,13 @@ module PhraseApp
|
|
47
45
|
attr_reader :limit, :remaining, :reset
|
48
46
|
|
49
47
|
def initialize(resp)
|
50
|
-
|
51
|
-
|
52
|
-
|
48
|
+
@limit = resp["X-Rate-Limit-Limit"].to_i
|
49
|
+
@remaining = resp["X-Rate-Limit-Remaining"].to_i
|
50
|
+
@reset = Time.at(resp["X-Rate-Limit-Reset"].to_i)
|
53
51
|
end
|
54
52
|
|
55
53
|
def to_s
|
56
|
-
|
54
|
+
sprintf("Rate limit exceeded: from %d requests %d are remaning (reset in %d seconds)", self.limit, self.remaining, int64(rle.Reset.Sub(time.Now()).Seconds()))
|
57
55
|
end
|
58
56
|
end
|
59
57
|
end
|
@@ -64,15 +62,8 @@ module PhraseApp
|
|
64
62
|
res << "Content-Disposition: form-data; name=\"#{k}\"\r\n"
|
65
63
|
# res << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"]
|
66
64
|
res << "\r\n"
|
67
|
-
|
68
|
-
|
69
|
-
res << vv+","
|
70
|
-
end
|
71
|
-
res << "\r\n"
|
72
|
-
else
|
73
|
-
res << "#{v}\r\n"
|
74
|
-
end
|
75
|
-
res
|
65
|
+
res << Array(v).join(',')
|
66
|
+
res << "\r\n"
|
76
67
|
end
|
77
68
|
end
|
78
69
|
|
@@ -151,7 +142,7 @@ module PhraseApp
|
|
151
142
|
end
|
152
143
|
resp = http.request(req)
|
153
144
|
|
154
|
-
|
145
|
+
err = handleResponseStatus(resp, status)
|
155
146
|
|
156
147
|
return resp, err
|
157
148
|
end
|
@@ -159,17 +150,17 @@ module PhraseApp
|
|
159
150
|
def self.handleResponseStatus(resp, expectedStatus)
|
160
151
|
case resp.code.to_i
|
161
152
|
when expectedStatus
|
162
|
-
|
153
|
+
return
|
163
154
|
when 400
|
164
155
|
return PhraseApp::RequestErrors::ErrorResponse.new(resp)
|
165
156
|
when 404
|
166
|
-
|
157
|
+
return raise("not found")
|
167
158
|
when 422
|
168
159
|
return PhraseApp::RequestErrors::ValidationErrorResponse.new(resp)
|
169
160
|
when 429
|
170
161
|
return PhraseApp::RequestErrors::RateLimitingError.new(resp)
|
171
162
|
else
|
172
|
-
|
163
|
+
return raise("unexpected status code (#{resp.code}) received; expected #{expectedStatus}")
|
173
164
|
end
|
174
165
|
end
|
175
166
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phraseapp-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- PhraseApp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: PhraseApp API client libary
|
14
14
|
email:
|
@@ -41,7 +41,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
41
|
version: '0'
|
42
42
|
requirements: []
|
43
43
|
rubyforge_project:
|
44
|
-
rubygems_version: 2.
|
44
|
+
rubygems_version: 2.5.1
|
45
45
|
signing_key:
|
46
46
|
specification_version: 4
|
47
47
|
summary: Interact with the PhraseApp API
|