subtledata 0.0.2

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.
data/lib/monkey.rb ADDED
@@ -0,0 +1,90 @@
1
+ # module Swagger
2
+ class Object
3
+
4
+ unless Object.method_defined? :blank?
5
+ def blank?
6
+ respond_to?(:empty?) ? empty? : !self
7
+ end
8
+ end
9
+
10
+ unless Object.method_defined? :present?
11
+ def present?
12
+ !blank?
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ class String
19
+
20
+ unless String.method_defined? :underscore
21
+ def underscore
22
+ self.gsub(/::/, '/').
23
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
24
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
25
+ tr("-", "_").
26
+ downcase
27
+ end
28
+ end
29
+
30
+ unless String.method_defined? :camelize
31
+ def camelize(first_letter_in_uppercase = true)
32
+ if first_letter_in_uppercase != :lower
33
+ self.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
34
+ else
35
+ self.to_s[0].chr.downcase + camelize(self)[1..-1]
36
+ end
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ class Hash
43
+
44
+ unless Hash.method_defined? :stringify_keys
45
+ def stringify_keys
46
+ inject({}) do |options, (key, value)|
47
+ options[key.to_s] = value
48
+ options
49
+ end
50
+ end
51
+ end
52
+
53
+ unless Hash.method_defined? :stringify_keys!
54
+ def stringify_keys!
55
+ self.replace(self.stringify_keys)
56
+ end
57
+ end
58
+
59
+ unless Hash.method_defined? :symbolize_keys
60
+ def symbolize_keys
61
+ inject({}) do |options, (key, value)|
62
+ options[(key.to_sym rescue key) || key] = value
63
+ options
64
+ end
65
+ end
66
+ end
67
+
68
+ unless Hash.method_defined? :symbolize_keys!
69
+ def symbolize_keys!
70
+ self.replace(self.symbolize_keys)
71
+ end
72
+ end
73
+
74
+ unless Hash.method_defined? :symbolize_and_underscore_keys
75
+ def symbolize_and_underscore_keys
76
+ inject({}) do |options, (key, value)|
77
+ options[(key.to_s.underscore.to_sym rescue key) || key] = value
78
+ options
79
+ end
80
+ end
81
+ end
82
+
83
+ unless Hash.method_defined? :symbolize_and_underscore_keys!
84
+ def symbolize_and_underscore_keys!
85
+ self.replace(self.symbolize_and_underscore_keys)
86
+ end
87
+ end
88
+
89
+ end
90
+ # end
@@ -0,0 +1,19 @@
1
+ module Swagger
2
+
3
+ class Configuration
4
+ require 'swagger/version'
5
+
6
+ attr_accessor :format, :api_key, :username, :password, :auth_token, :scheme, :host, :base_path, :user_agent, :logger
7
+
8
+ # Defaults go in here..
9
+ def initialize
10
+ @format = 'json'
11
+ @scheme = 'http'
12
+ @host = 'api.wordnik.com'
13
+ @base_path = '/v4'
14
+ @user_agent = "ruby-#{Swagger::VERSION}"
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,186 @@
1
+ module Swagger
2
+
3
+ class Request
4
+ require 'uri'
5
+ require 'addressable/uri'
6
+ require 'typhoeus'
7
+ require "swagger/version"
8
+
9
+ attr_accessor :host, :path, :format, :params, :body, :http_method, :headers
10
+
11
+
12
+ # All requests must have an HTTP method and a path
13
+ # Optionals parameters are :params, :headers, :body, :format, :host
14
+ #
15
+ def initialize(http_method, path, attributes={})
16
+ attributes[:format] ||= Swagger.configuration.format
17
+ attributes[:params] ||= {}
18
+
19
+ # Set default headers
20
+ default_headers = {
21
+ 'Content-Type' => "application/#{attributes[:format].downcase}",
22
+ :api_key => Swagger.configuration.api_key
23
+ }
24
+
25
+ # api_key from headers hash trumps the default, even if its value is blank
26
+ if attributes[:headers].present? && attributes[:headers].has_key?(:api_key)
27
+ default_headers.delete(:api_key)
28
+ end
29
+
30
+ # api_key from params hash trumps all others (headers and default_headers)
31
+ if attributes[:params].present? && attributes[:params].has_key?(:api_key)
32
+ default_headers.delete(:api_key)
33
+ attributes[:headers].delete(:api_key) if attributes[:headers].present?
34
+ end
35
+
36
+ # Merge argument headers into defaults
37
+ attributes[:headers] = default_headers.merge(attributes[:headers] || {})
38
+
39
+ # Stick in the auth token if there is one
40
+ if Swagger.authenticated?
41
+ attributes[:headers].merge!({:auth_token => Swagger.configuration.auth_token})
42
+ end
43
+
44
+ self.http_method = http_method.to_sym
45
+ self.path = path
46
+ attributes.each do |name, value|
47
+ send("#{name.to_s.underscore.to_sym}=", value)
48
+ end
49
+ end
50
+
51
+ # Construct a base URL
52
+ #
53
+ def url(options = {})
54
+ u = Addressable::URI.new(
55
+ :scheme => Swagger.configuration.scheme,
56
+ :host => Swagger.configuration.host,
57
+ :path => self.interpreted_path,
58
+ :query => self.query_string.sub(/\?/, '')
59
+ ).to_s
60
+
61
+ # Drop trailing question mark, if present
62
+ u.sub! /\?$/, ''
63
+
64
+ # Obfuscate API key?
65
+ u.sub! /api\_key=\w+/, 'api_key=YOUR_API_KEY' if options[:obfuscated]
66
+
67
+ u
68
+ end
69
+
70
+ # Iterate over the params hash, injecting any path values into the path string
71
+ #
72
+ # e.g. /word.{format}/{word}/entries => /word.json/cat/entries
73
+ def interpreted_path
74
+ p = self.path.dup
75
+
76
+ # Fill in the path params
77
+ self.params.each_pair do |key, value|
78
+ p = p.gsub("{#{key}}", value.to_s)
79
+ end
80
+
81
+ # Stick a .{format} placeholder into the path if there isn't
82
+ # one already or an actual format like json or xml
83
+ # e.g. /words/blah => /words.{format}/blah
84
+ unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s }
85
+ p = p.sub(/^(\/?\w+)/, "\\1.#{format}")
86
+ end
87
+
88
+ p = p.sub("{format}", self.format.to_s)
89
+
90
+ URI.encode [Swagger.configuration.base_path, p].join("/").gsub(/\/+/, '/')
91
+ end
92
+
93
+ # Massage the request body into a state of readiness
94
+ # If body is a hash, camelize all keys then convert to a json string
95
+ #
96
+ def body=(value)
97
+ if value.is_a?(Hash)
98
+ value = value.inject({}) do |memo, (k,v)|
99
+ memo[k.to_s.camelize(:lower).to_sym] = v
100
+ memo
101
+ end
102
+ end
103
+ @body = value
104
+ end
105
+
106
+ # If body is an object, JSONify it before making the actual request.
107
+ #
108
+ def outgoing_body
109
+ body.is_a?(String) ? body : body.to_json
110
+ end
111
+
112
+ # Construct a query string from the query-string-type params
113
+ def query_string
114
+
115
+ # Iterate over all params,
116
+ # .. removing the ones that are part of the path itself.
117
+ # .. stringifying values so Addressable doesn't blow up.
118
+ query_values = {}
119
+ self.params.each_pair do |key, value|
120
+ next if self.path.include? "{#{key}}" # skip path params
121
+ next if value.blank? && value.class != FalseClass # skip empties
122
+ key = key.to_s.camelize(:lower).to_sym unless key.to_sym == :api_key # api_key is not a camelCased param
123
+ query_values[key] = value.to_s
124
+ end
125
+
126
+ # We don't want to end up with '?' as our query string
127
+ # if there aren't really any params
128
+ return "" if query_values.blank?
129
+
130
+ # Addressable requires query_values to be set after initialization..
131
+ qs = Addressable::URI.new
132
+ qs.query_values = query_values
133
+ qs.to_s
134
+ end
135
+
136
+ def make
137
+ logger = Logger.new STDOUT
138
+ logger.debug self.url
139
+ response = case self.http_method.to_sym
140
+ when :get,:GET
141
+ Typhoeus::Request.get(
142
+ self.url,
143
+ :headers => self.headers.stringify_keys,
144
+ )
145
+
146
+ when :post,:POST
147
+ Typhoeus::Request.post(
148
+ self.url,
149
+ :body => self.outgoing_body,
150
+ :headers => self.headers.stringify_keys,
151
+ )
152
+
153
+ when :put,:PUT
154
+ Typhoeus::Request.put(
155
+ self.url,
156
+ :body => self.outgoing_body,
157
+ :headers => self.headers.stringify_keys,
158
+ )
159
+
160
+ when :delete,:DELETE
161
+ Typhoeus::Request.delete(
162
+ self.url,
163
+ :body => self.outgoing_body,
164
+ :headers => self.headers.stringify_keys,
165
+ )
166
+ end
167
+ Response.new(response)
168
+ end
169
+
170
+ def response
171
+ self.make
172
+ end
173
+
174
+ def response_code_pretty
175
+ return unless @response.present?
176
+ @response.code.to_s
177
+ end
178
+
179
+ def response_headers_pretty
180
+ return unless @response.present?
181
+ # JSON.pretty_generate(@response.headers).gsub(/\n/, '<br/>') # <- This was for RestClient
182
+ @response.headers.gsub(/\n/, '<br/>') # <- This is for Typhoeus
183
+ end
184
+
185
+ end
186
+ end
@@ -0,0 +1,70 @@
1
+ module Swagger
2
+
3
+ class Response
4
+ require 'json'
5
+
6
+ attr_accessor :raw
7
+
8
+ def initialize(raw)
9
+ self.raw = raw
10
+
11
+ case self.code
12
+ when 500..510 then raise(ServerError, self.error_message)
13
+ when 299..426 then raise(ClientError, self.error_message)
14
+ end
15
+ end
16
+
17
+ def code
18
+ raw.code
19
+ end
20
+
21
+ # Account for error messages that take different forms...
22
+ def error_message
23
+ body['message']
24
+ rescue
25
+ body
26
+ end
27
+
28
+ # If body is JSON, parse it
29
+ # Otherwise return raw string
30
+ def body
31
+ JSON.parse raw.body
32
+ rescue
33
+ raw.body
34
+ end
35
+
36
+ # `headers_hash` is a Typhoeus-specific extension of Hash,
37
+ # so simplify it back into a regular old Hash.
38
+ def headers
39
+ h = {}
40
+ raw.headers_hash.each {|k,v| h[k] = v }
41
+ h
42
+ end
43
+
44
+ # Extract the response format from the header hash
45
+ # e.g. {'Content-Type' => 'application/json'}
46
+ def format
47
+ headers['Content-Type'].split("/").last.downcase
48
+ end
49
+
50
+ def json?
51
+ format == 'json'
52
+ end
53
+
54
+ def xml?
55
+ format == 'xml'
56
+ end
57
+
58
+ def pretty_body
59
+ return unless body.present?
60
+ case format
61
+ when 'json' then JSON.pretty_generate(body).gsub(/\n/, '<br/>')
62
+ end
63
+ end
64
+
65
+ def pretty_headers
66
+ JSON.pretty_generate(headers).gsub(/\n/, '<br/>')
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ module Swagger
2
+ VERSION = "4.06.08"
3
+ end
4
+
5
+
data/lib/swagger.rb ADDED
@@ -0,0 +1,84 @@
1
+ require 'monkey'
2
+ require 'swagger/configuration'
3
+ require 'swagger/request'
4
+ require 'swagger/response'
5
+ require 'swagger/version'
6
+ require 'logger'
7
+
8
+ module Swagger
9
+
10
+ class << self
11
+ attr_accessor :logger
12
+
13
+ # A Swagger configuration object. Must act like a hash and return sensible
14
+ # values for all Swagger configuration options. See Swagger::Configuration.
15
+ attr_accessor :configuration
16
+
17
+ attr_accessor :resources
18
+
19
+ # Call this method to modify defaults in your initializers.
20
+ #
21
+ # @example
22
+ # Swagger.configure do |config|
23
+ # config.api_key = '1234567890abcdef' # required
24
+ # config.username = 'wordlover' # optional, but needed for user-related functions
25
+ # config.password = 'i<3words' # optional, but needed for user-related functions
26
+ # config.format = 'json' # optional, defaults to 'json'
27
+ # end
28
+ #
29
+ def configure
30
+ self.configuration ||= Configuration.new
31
+ yield(configuration) if block_given?
32
+
33
+ # Configure logger. Default to use Rails
34
+ self.logger ||= configuration.logger || (defined?(Rails) ? Rails.logger : Logger.new(STDOUT))
35
+
36
+ # remove :// from scheme
37
+ configuration.scheme.sub!(/:\/\//, '')
38
+
39
+ # remove http(s):// and anything after a slash
40
+ configuration.host.sub!(/https?:\/\//, '')
41
+ configuration.host = configuration.host.split('/').first
42
+
43
+ # Add leading and trailing slashes to base_path
44
+ configuration.base_path = "/#{configuration.base_path}".gsub(/\/+/, '/')
45
+ configuration.base_path = "" if configuration.base_path == "/"
46
+ end
47
+
48
+ def authenticated?
49
+ Swagger.configuration.auth_token.present?
50
+ end
51
+
52
+ def de_authenticate
53
+ Swagger.configuration.auth_token = nil
54
+ end
55
+
56
+ def authenticate
57
+ return if Swagger.authenticated?
58
+
59
+ if Swagger.configuration.username.blank? || Swagger.configuration.password.blank?
60
+ raise ClientError, "Username and password are required to authenticate."
61
+ end
62
+
63
+ request = Swagger::Request.new(
64
+ :get,
65
+ "account/authenticate/{username}",
66
+ :params => {
67
+ :username => Swagger.configuration.username,
68
+ :password => Swagger.configuration.password
69
+ }
70
+ )
71
+
72
+ response_body = request.response.body
73
+ Swagger.configuration.auth_token = response_body['token']
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ class ServerError < StandardError
81
+ end
82
+
83
+ class ClientError < StandardError
84
+ end