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.
@@ -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: []