phraseapp-ruby 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,3 @@
1
+ module PhraseApp
2
+ VERSION = '1.0.0'
3
+ end
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: []