phraseapp-ruby 1.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 +7 -0
- data/lib/auth.rb +78 -0
- data/lib/phraseapp-ruby.rb +1977 -0
- data/lib/request_handler.rb +150 -0
- data/lib/version.rb +3 -0
- metadata +48 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'version'
|
2
|
+
|
3
|
+
module PhraseApp
|
4
|
+
|
5
|
+
API_CLIENT_IDENTIFIER = "PhraseApp Ruby " + VERSION
|
6
|
+
|
7
|
+
class ErrorResponse
|
8
|
+
attr_accessor :message
|
9
|
+
|
10
|
+
def initialize(http_response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def error
|
14
|
+
self.message
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class ValidationErrorResponse
|
19
|
+
attr_accessor :error_response
|
20
|
+
attr_accessor :errors
|
21
|
+
|
22
|
+
def initialize(http_response)
|
23
|
+
hash = JSON.load(http_response.body)
|
24
|
+
puts hash.inspect
|
25
|
+
end
|
26
|
+
|
27
|
+
def errors
|
28
|
+
self.error + "\n" + self.errors.join("\n")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class ValidationErrorMessage
|
33
|
+
attr_accessor :resource, :field, :message
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
return sprintf("\t[%s:%s] %s", self.resource, self.field, self.message)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class RateLimitingError
|
41
|
+
attr_accessor :limit, :remaining, :reset
|
42
|
+
|
43
|
+
def initialize(resp)
|
44
|
+
re = RateLimitingError.new(resp)
|
45
|
+
puts resp.body.inspect
|
46
|
+
re.limit = resp["X-Rate-Limit-Limit"].to_i
|
47
|
+
re.remaining = resp["X-Rate-Limit-Remaining"].to_i
|
48
|
+
re.reset = Time.at(resp["X-Rate-Limit-Reset"].to_i)
|
49
|
+
return re, nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
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()))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.multipart(hash)
|
58
|
+
hash.inject("") do |res, (k, v)|
|
59
|
+
res << "--#{PhraseApp::MULTIPART_BOUNDARY}\r\n"
|
60
|
+
res << "Content-Disposition: form-data; name=\"#{k}\"\r\n"
|
61
|
+
# res << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"]
|
62
|
+
res << "\r\n"
|
63
|
+
res << "#{v}\r\n"
|
64
|
+
res
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.send_request_paginated(method, path_with_query, ctype, body, status, page, per_page)
|
69
|
+
uri = URI.parse(path_with_query)
|
70
|
+
|
71
|
+
hash = if uri.query then CGI::parse(uri.query) else {} end
|
72
|
+
hash["page"] = page
|
73
|
+
hash["per_page"] = per_page
|
74
|
+
|
75
|
+
query_str = URI.encode_www_form(hash)
|
76
|
+
path = [uri.path, query_str].compact.join('?')
|
77
|
+
|
78
|
+
return send_request(method, path, ctype, body, status)
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.send_request(method, path, ctype, data, status)
|
82
|
+
req = Net::HTTPGenericRequest.new(method,
|
83
|
+
Module.const_get("Net::HTTP::#{method.capitalize}::REQUEST_HAS_BODY"),
|
84
|
+
Module.const_get("Net::HTTP::#{method.capitalize}::RESPONSE_HAS_BODY"),
|
85
|
+
path)
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
puts "data:"
|
90
|
+
puts data.inspect
|
91
|
+
req.body = data
|
92
|
+
|
93
|
+
if ctype != ""
|
94
|
+
req["Content-Type"] = ctype
|
95
|
+
end
|
96
|
+
|
97
|
+
resp, err = send(req, status)
|
98
|
+
|
99
|
+
|
100
|
+
return resp, err
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.send(req, status)
|
104
|
+
err = PhraseApp::Auth.authenticate(req)
|
105
|
+
if err != nil
|
106
|
+
return nil, err
|
107
|
+
end
|
108
|
+
|
109
|
+
uri = URI.parse(PhraseApp::URL)
|
110
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
111
|
+
http.use_ssl = true
|
112
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
113
|
+
if ENV['DEBUG']
|
114
|
+
puts "#{req.method} #{req.path}"
|
115
|
+
puts req.body.inspect
|
116
|
+
puts "-------"
|
117
|
+
end
|
118
|
+
resp = http.request(req)
|
119
|
+
|
120
|
+
err = handleResponseStatus(resp, status)
|
121
|
+
|
122
|
+
return resp, err
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.handleResponseStatus(resp, expectedStatus)
|
126
|
+
case resp.code.to_i
|
127
|
+
when expectedStatus
|
128
|
+
return
|
129
|
+
when 400
|
130
|
+
e = ErrorResponse.new(resp)
|
131
|
+
return e
|
132
|
+
when 404
|
133
|
+
return raise("not found")
|
134
|
+
when 422
|
135
|
+
e = ValidationErrorResponse.new(resp)
|
136
|
+
if e != nil
|
137
|
+
return e
|
138
|
+
end
|
139
|
+
return e
|
140
|
+
when 429
|
141
|
+
e, err = RateLimitError.new(resp)
|
142
|
+
if err != nil
|
143
|
+
return err
|
144
|
+
end
|
145
|
+
return e
|
146
|
+
else
|
147
|
+
return raise("unexpected status code (#{resp.code}) received; expected #{expectedStatus}")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: phraseapp-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- PhraseApp
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-17 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: PhraseApp API client libary
|
14
|
+
email:
|
15
|
+
- info@phraseapp.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/auth.rb
|
21
|
+
- lib/phraseapp-ruby.rb
|
22
|
+
- lib/request_handler.rb
|
23
|
+
- lib/version.rb
|
24
|
+
homepage: https://github.com/phrase/phraseapp-ruby
|
25
|
+
licenses:
|
26
|
+
- BSD
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 2.4.7
|
45
|
+
signing_key:
|
46
|
+
specification_version: 4
|
47
|
+
summary: Interact with the PhraseApp API
|
48
|
+
test_files: []
|