webcoder 0.0.1

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,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .tags
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in webcoder.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 novikov
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # Webcoder
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'webcoder'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install webcoder
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,26 @@
1
+ # Standard Library
2
+ require 'cgi'
3
+ require 'net/https'
4
+ require 'timeout'
5
+
6
+ # JSON serialization
7
+ require 'multi_json'
8
+
9
+ # Webcoder
10
+ require 'webcoder/version'
11
+ require 'webcoder/serializer'
12
+ require 'webcoder/webcoder'
13
+ require 'webcoder/resource'
14
+ require 'webcoder/http/net_http'
15
+ require 'webcoder/http/typhoeus'
16
+ require 'webcoder/http'
17
+ require 'webcoder/errors'
18
+ require 'webcoder/report'
19
+ require 'webcoder/job'
20
+ require 'webcoder/input'
21
+ require 'webcoder/output'
22
+ require 'webcoder/account'
23
+ require 'webcoder/notification'
24
+ require 'webcoder/response'
25
+ require 'webcoder/upload'
26
+ require 'webcoder/version'
@@ -0,0 +1,21 @@
1
+ module Webcoder
2
+ class Account < Resource
3
+
4
+ def self.create(params={}, options={})
5
+ post("/account", params, options)
6
+ end
7
+
8
+ def self.details(options={})
9
+ get("/account", options)
10
+ end
11
+
12
+ def self.integration(options={})
13
+ put("/account/integration", nil, options)
14
+ end
15
+
16
+ def self.live(options={})
17
+ put("/account/live", nil, options)
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,45 @@
1
+ module Webcoder
2
+ class Error < StandardError
3
+
4
+ def initialize(error_or_message)
5
+ if error_or_message.is_a?(Exception)
6
+ @error = error_or_message
7
+ else
8
+ @message = error_or_message
9
+ end
10
+ end
11
+
12
+ def message
13
+ @message || "#{@error.class} (wrapped in a #{self.class}) - #{@error.message}"
14
+ end
15
+
16
+ def backtrace
17
+ if @error
18
+ error_backtrace = ["--- Backtrace from #{@error.class} ---"] + (@error.backtrace || [])
19
+ wrapper_backtrace = ["--- Backtrace from #{self.class} ---"] + (super || [])
20
+ error_backtrace + wrapper_backtrace
21
+ else
22
+ super
23
+ end
24
+ end
25
+
26
+ def inspect
27
+ if @error
28
+ "#{@error.inspect} (wrapped in a #{self.class})"
29
+ else
30
+ super
31
+ end
32
+ end
33
+
34
+ def to_s
35
+ if @error
36
+ "#{@error.class} (wrapped in a #{self.class}) - #{@error}"
37
+ else
38
+ super
39
+ end
40
+ end
41
+ end
42
+
43
+ class HTTPError < Error; end
44
+
45
+ end
@@ -0,0 +1,97 @@
1
+ module Webcoder
2
+ class HTTP
3
+
4
+ CA_CHAIN_PATH = File.expand_path(File.join(File.dirname(__FILE__), "http", "resources", "webcoder_ca_chain.crt"))
5
+
6
+ include Webcoder::Serializer
7
+
8
+ attr_accessor :url, :options, :method
9
+
10
+ class << self
11
+ attr_accessor :default_options, :http_backend
12
+ end
13
+
14
+ self.http_backend = NetHTTP
15
+
16
+ self.default_options = {:timeout => 60000,
17
+ :headers => {'Accept' => 'application/json',
18
+ 'Content-Type' => 'application/json',
19
+ 'User-Agent' => "Webcoder v#{Webcoder::VERSION}"}}
20
+
21
+ def initialize(method, url, options={})
22
+ self.method = method
23
+ self.url = url
24
+ self.options = options
25
+ end
26
+
27
+ def self.post(url, body, options={})
28
+ new(:post, url, options.merge(:body => body)).perform_method
29
+ end
30
+
31
+ def self.put(url, body, options={})
32
+ new(:put, url, options.merge(:body => body)).perform_method
33
+ end
34
+
35
+ def self.get(url, options={})
36
+ new(:get, url, options).perform_method
37
+ end
38
+
39
+ def self.delete(url, options={})
40
+ new(:delete, url, options).perform_method
41
+ end
42
+
43
+ def perform_method
44
+ process(http_backend.send(method, url, options))
45
+ rescue StandardError => e
46
+ raise HTTPError.new(e)
47
+ end
48
+
49
+ def options=(value)
50
+ value ||= {}
51
+
52
+ # Hacky, deeper hash merge
53
+ default_options.keys.each do |key|
54
+ if value.has_key?(key)
55
+ if value[key].is_a?(Hash) && default_options[key].is_a?(Hash)
56
+ value[key] = default_options[key].merge(value[key])
57
+ end
58
+ else
59
+ value[key] = default_options[key]
60
+ end
61
+ end
62
+
63
+ @options = value
64
+ end
65
+
66
+ def options
67
+ @options || self.options = default_options
68
+ end
69
+
70
+ def http_backend
71
+ self.class.http_backend
72
+ end
73
+
74
+ def default_options
75
+ self.class.default_options
76
+ end
77
+
78
+
79
+ protected
80
+
81
+ def process(http_response)
82
+ response = Response.new
83
+ response.code = http_response.code
84
+
85
+ begin
86
+ response.body = decode(http_response.body.to_s)
87
+ rescue StandardError # Hack! Returns different exceptions depending on the decoding engine
88
+ response.body = http_response.body
89
+ end
90
+
91
+ response.raw_body = http_response.body
92
+ response.raw_response = http_response
93
+ response
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,122 @@
1
+ module Webcoder
2
+ class HTTP
3
+ class NetHTTP
4
+
5
+ attr_accessor :method, :url, :uri, :body, :params, :headers, :timeout, :skip_ssl_verify, :options
6
+
7
+ def initialize(method, url, options)
8
+ @method = method
9
+ @url = url
10
+ @body = options.delete(:body)
11
+ @params = options.delete(:params)
12
+ @headers = options.delete(:headers)
13
+ @timeout = options.delete(:timeout)
14
+ @skip_ssl_verify = options.delete(:skip_ssl_verify)
15
+ @options = options
16
+ end
17
+
18
+ def self.post(url, options={})
19
+ new(:post, url, options).perform
20
+ end
21
+
22
+ def self.put(url, options={})
23
+ new(:put, url, options).perform
24
+ end
25
+
26
+ def self.get(url, options={})
27
+ new(:get, url, options).perform
28
+ end
29
+
30
+ def self.delete(url, options={})
31
+ new(:delete, url, options).perform
32
+ end
33
+
34
+ def perform
35
+ deliver(http, request)
36
+ end
37
+
38
+
39
+ protected
40
+
41
+ def deliver(http, request)
42
+ if timeout
43
+ Timeout.timeout(timeout / 1000.0) do
44
+ http.request(request)
45
+ end
46
+ else
47
+ http.request(request)
48
+ end
49
+ end
50
+
51
+ def http
52
+ u = uri
53
+
54
+ http = Net::HTTP.new(u.host, u.port)
55
+
56
+ if u.scheme == 'https'
57
+ http.use_ssl = true
58
+
59
+ if skip_ssl_verify
60
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
61
+ else
62
+ http.ca_file = Webcoder::HTTP::CA_CHAIN_PATH
63
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
64
+ http.verify_depth = 5
65
+ end
66
+ end
67
+
68
+ http
69
+ end
70
+
71
+ def request
72
+ r = request_class.new(path)
73
+ if body
74
+ r.body = body
75
+ elsif [:post, :put].include?(@method)
76
+ r.body = ""
77
+ end
78
+
79
+ if headers
80
+ headers.each do |header, value|
81
+ r.add_field(header.to_s, value.to_s)
82
+ end
83
+ end
84
+ r
85
+ end
86
+
87
+ def uri
88
+ u = URI.parse(url)
89
+
90
+ if params
91
+ params_as_query = params.map{|k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
92
+ if u.query.to_s.empty?
93
+ u.query = params_as_query
94
+ else
95
+ u.query = [u.query.to_s, params_as_query].join('&')
96
+ end
97
+ end
98
+
99
+ u
100
+ end
101
+
102
+ def path
103
+ u = uri
104
+
105
+ if u.path.empty?
106
+ u.path = '/'
107
+ end
108
+
109
+ if u.query.to_s.empty?
110
+ u.path
111
+ else
112
+ u.path + '?' + u.query.to_s
113
+ end
114
+ end
115
+
116
+ def request_class
117
+ Net::HTTP.const_get(method.to_s.capitalize)
118
+ end
119
+
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,62 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
3
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
4
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
5
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
6
+ dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
7
+ MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
8
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
9
+ A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
10
+ b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
11
+ cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
12
+ bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
13
+ VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
14
+ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
15
+ uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
16
+ 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
17
+ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
18
+ pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
19
+ -----END CERTIFICATE-----
20
+ -----BEGIN CERTIFICATE-----
21
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
22
+ VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
23
+ ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
24
+ KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
25
+ ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
26
+ MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
27
+ ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
28
+ b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
29
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
30
+ U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
31
+ A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
32
+ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
33
+ wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
34
+ AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
35
+ oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
36
+ BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
37
+ dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
38
+ MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
39
+ b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
40
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
41
+ MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
42
+ E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
43
+ MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
44
+ hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
45
+ 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
46
+ 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
47
+ -----END CERTIFICATE-----
48
+ -----BEGIN CERTIFICATE-----
49
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
50
+ VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
51
+ bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
52
+ b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
53
+ UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
54
+ cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
55
+ b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
56
+ iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
57
+ r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
58
+ 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
59
+ GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
60
+ 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
61
+ lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
62
+ -----END CERTIFICATE-----
@@ -0,0 +1,31 @@
1
+ module Webcoder
2
+ class HTTP
3
+ class Typhoeus
4
+
5
+ def self.post(url, options={})
6
+ perform(:post, url, options)
7
+ end
8
+
9
+ def self.put(url, options={})
10
+ perform(:put, url, options)
11
+ end
12
+
13
+ def self.get(url, options={})
14
+ perform(:get, url, options)
15
+ end
16
+
17
+ def self.delete(url, options={})
18
+ perform(:delete, url, options)
19
+ end
20
+
21
+ def self.perform(method, url, options={})
22
+ if options.delete(:skip_ssl_verify)
23
+ options[:disable_ssl_peer_verification] = true
24
+ end
25
+
26
+ ::Typhoeus::Request.send(method, url, options)
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ module Webcoder
2
+ class Input < Resource
3
+
4
+ def self.details(input_id, options={})
5
+ get("/inputs/#{input_id}", options)
6
+ end
7
+
8
+ def self.progress(input_id, options={})
9
+ get("/inputs/#{input_id}/progress", options)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ module Webcoder
2
+ class Job < Resource
3
+
4
+ def self.create(params={}, options={})
5
+ post("/jobs", params, options)
6
+ end
7
+
8
+ def self.list(options={})
9
+ options = options.dup
10
+ params = { :page => options.delete(:page) || 1,
11
+ :per_page => options.delete(:per_page) || 50,
12
+ :state => options.delete(:state) }
13
+
14
+ get("/jobs", merge_params(options, params))
15
+ end
16
+
17
+ def self.details(job_id, options={})
18
+ get("/jobs/#{job_id}", options)
19
+ end
20
+
21
+ def self.progress(job_id, options={})
22
+ get("/jobs/#{job_id}/progress", options)
23
+ end
24
+
25
+ def self.resubmit(job_id, options={})
26
+ put("/jobs/#{job_id}/resubmit", nil, options)
27
+ end
28
+
29
+ def self.cancel(job_id, options={})
30
+ put("/jobs/#{job_id}/cancel", nil, options)
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ module Webcoder
2
+ class Notification < Resource
3
+
4
+ def self.list(options={})
5
+ options = options.dup
6
+ params = {:page => options.delete(:page) || 1,
7
+ :per_page => options.delete(:per_page) || 50 }
8
+
9
+ get("/notifications", merge_params(options, params))
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Webcoder
2
+ class Output < Resource
3
+
4
+ def self.details(output_id, options={})
5
+ get("/outputs/#{output_id}", options)
6
+ end
7
+
8
+ def self.progress(output_id, options={})
9
+ get("/outputs/#{output_id}/progress", options)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Webcoder
2
+ class Report < Resource
3
+
4
+ def self.minutes(options={})
5
+ get("/reports/minutes", options)
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,76 @@
1
+ module Webcoder
2
+ class Resource
3
+
4
+ include Webcoder::Serializer
5
+
6
+ def self.api_key
7
+ Webcoder.api_key
8
+ end
9
+
10
+ def self.base_url
11
+ Webcoder.base_url
12
+ end
13
+
14
+ def self.post(path, params={}, options={})
15
+ options = options.dup
16
+ url = url_for(path, options)
17
+ body = encode(params)
18
+ options = add_api_key_header(options)
19
+ HTTP.post(url, body, options)
20
+ end
21
+
22
+ def self.put(path, params={}, options={})
23
+ options = options.dup
24
+ url = url_for(path, options)
25
+ body = encode(params)
26
+ options = add_api_key_header(options)
27
+ HTTP.put(url, body, options)
28
+ end
29
+
30
+ def self.get(path, options={})
31
+ options = options.dup
32
+ url = url_for(path, options)
33
+ options = add_api_key_header(options)
34
+ HTTP.get(url, options)
35
+ end
36
+
37
+ def self.delete(path, options={})
38
+ options = options.dup
39
+ url = url_for(path)
40
+ options = add_api_key_header(options)
41
+ HTTP.delete(url, options)
42
+ end
43
+
44
+
45
+ protected
46
+
47
+ def self.url_for(path, options={})
48
+ File.join((options[:base_url] || base_url).to_s, path.to_s)
49
+ end
50
+
51
+ def self.add_api_key_header(options)
52
+ effective_api_key = options.delete(:api_key) || api_key
53
+
54
+ if effective_api_key
55
+ if options[:headers]
56
+ options[:headers] = options[:headers].dup
57
+ else
58
+ options[:headers] = {}
59
+ end
60
+ options[:headers]["Webcoder-Api-Key"] = effective_api_key
61
+ end
62
+
63
+ options
64
+ end
65
+
66
+ def self.merge_params(options, params)
67
+ if options[:params]
68
+ options[:params] = options[:params].merge(params)
69
+ options
70
+ else
71
+ options.merge(:params => params)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,33 @@
1
+ module Webcoder
2
+ class Response
3
+
4
+ attr_accessor :code, :body, :raw_body, :raw_response
5
+
6
+ def initialize(options={})
7
+ options.each do |k, v|
8
+ send("#{k}=", v) if respond_to?("#{k}=")
9
+ end
10
+ end
11
+
12
+ def success?
13
+ code.to_i > 199 && code.to_i < 300
14
+ end
15
+
16
+ def errors
17
+ if body.is_a?(Hash)
18
+ Array(body['errors']).compact
19
+ else
20
+ []
21
+ end
22
+ end
23
+
24
+ def body_without_wrapper
25
+ if body.is_a?(Hash) && body['api_response']
26
+ body['api_response']
27
+ else
28
+ body
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ module Webcoder
2
+ module Serializer
3
+
4
+ extend self
5
+
6
+ def self.included(klass)
7
+ klass.extend(self)
8
+ end
9
+
10
+ def encode(content)
11
+ if content.is_a?(String) || content.nil?
12
+ content
13
+ else
14
+ if MultiJson.respond_to?(:dump)
15
+ MultiJson.dump(content)
16
+ else
17
+ MultiJson.encode(content)
18
+ end
19
+ end
20
+ end
21
+
22
+ def decode(content)
23
+ if content.is_a?(String)
24
+ if MultiJson.respond_to?(:dump)
25
+ MultiJson.load(content)
26
+ else
27
+ MultiJson.decode(content)
28
+ end
29
+ else
30
+ content
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,8 @@
1
+ module Webcoder
2
+ class Upload < Resource
3
+
4
+ def self.create(params={}, options={})
5
+ post("/uploads", params, options)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Webcoder
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,18 @@
1
+ module Webcoder
2
+
3
+ class << self
4
+ attr_accessor :api_key, :base_url
5
+ end
6
+
7
+ self.api_key = nil
8
+ self.base_url = 'https://app.webcoder.com/api/v2'
9
+
10
+ def self.api_key
11
+ @api_key || ENV['WEBCODER_API_KEY']
12
+ end
13
+
14
+ def self.base_url(env=nil)
15
+ @base_url
16
+ end
17
+
18
+ end
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'webcoder/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "webcoder"
8
+ spec.version = Webcoder::VERSION
9
+ spec.authors = ["novikov"]
10
+ spec.email = ["novikov@inventos.ru"]
11
+ spec.description = %q{}
12
+ spec.summary = %q{Simple wrapper for Webcoder API}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webcoder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - novikov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-02-18 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ''
47
+ email:
48
+ - novikov@inventos.ru
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - Gemfile
55
+ - LICENSE.txt
56
+ - README.md
57
+ - Rakefile
58
+ - lib/webcoder.rb
59
+ - lib/webcoder/account.rb
60
+ - lib/webcoder/errors.rb
61
+ - lib/webcoder/http.rb
62
+ - lib/webcoder/http/net_http.rb
63
+ - lib/webcoder/http/resources/webcoder_ca_chain.crt
64
+ - lib/webcoder/http/typhoeus.rb
65
+ - lib/webcoder/input.rb
66
+ - lib/webcoder/job.rb
67
+ - lib/webcoder/notification.rb
68
+ - lib/webcoder/output.rb
69
+ - lib/webcoder/report.rb
70
+ - lib/webcoder/resource.rb
71
+ - lib/webcoder/response.rb
72
+ - lib/webcoder/serializer.rb
73
+ - lib/webcoder/upload.rb
74
+ - lib/webcoder/version.rb
75
+ - lib/webcoder/webcoder.rb
76
+ - webcoder.gemspec
77
+ homepage: ''
78
+ licenses:
79
+ - MIT
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ segments:
91
+ - 0
92
+ hash: 3063039980127814060
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: 3063039980127814060
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 1.8.25
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Simple wrapper for Webcoder API
108
+ test_files: []