ponominalu 0.1.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/.gitignore +16 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +1 -0
- data/Rakefile +16 -0
- data/lib/generators/ponominalu/install/USAGE +2 -0
- data/lib/generators/ponominalu/install/install_generator.rb +9 -0
- data/lib/generators/ponominalu/install/templates/initializer.rb +22 -0
- data/lib/ponominalu.rb +25 -0
- data/lib/ponominalu/api.rb +48 -0
- data/lib/ponominalu/configuration.rb +60 -0
- data/lib/ponominalu/error.rb +32 -0
- data/lib/ponominalu/helpers.rb +27 -0
- data/lib/ponominalu/middleware.rb +58 -0
- data/lib/ponominalu/response.rb +39 -0
- data/lib/ponominalu/simple_methods.yml +2 -0
- data/lib/ponominalu/version.rb +4 -0
- data/ponominalu.gemspec +32 -0
- data/spec/ponominalu/api_spec.rb +58 -0
- data/spec/ponominalu/configuration_spec.rb +55 -0
- data/spec/ponominalu/error_spec.rb +40 -0
- data/spec/ponominalu/helpers_spec.rb +22 -0
- data/spec/ponominalu/middleware_spec.rb +112 -0
- data/spec/ponominalu/response_spec.rb +58 -0
- data/spec/ponominalu_spec.rb +17 -0
- data/spec/spec_helper.rb +14 -0
- metadata +191 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e0874352084fa0f25f93070346e2fbe698c120d8
|
4
|
+
data.tar.gz: fc304746e61dc9f077ee0467b25aabd1f633fbfa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f639a3397dc6b5b53d50a9a1326da6cb1a5658ff007982bff6744394a39e2142d1e6d7e6f3f2fbc3f69b3dbc2c942536e716fca1e547048773fcc51ca3249ed5
|
7
|
+
data.tar.gz: a6948cb2478101635fe93a78de2446afc0478cbe6a4e1ac659495ada868418c10e84e33f2f6e638f1deb4f414e16525a5bb4c7755419ca5883f3cadc9601f278
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
File without changes
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Dmitry Kovalevsky
|
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.
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
## ponominalu [](https://travis-ci.org/crossaidi/ponominalu) [](https://codeclimate.com/github/crossaidi/ponominalu) [](https://gemnasium.com/crossaidi/ponominalu.png)
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
|
4
|
+
require 'rspec/core'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
desc 'Turn on the console with preloaded ponominalu'
|
8
|
+
task :debug do
|
9
|
+
sh 'pry -I ./lib -r ./lib/ponominalu'
|
10
|
+
end
|
11
|
+
|
12
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
13
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => :spec
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# A rails generator `ponominalu:install`. It creates a config file in `config/initializers/ponominalu.rb`.
|
2
|
+
class Ponominalu::InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
# Creates the config file.
|
6
|
+
def create_initializer
|
7
|
+
copy_file 'initializer.rb', 'config/initializers/ponominalu.rb'
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Ponominalu.configure do |config|
|
2
|
+
# config.session = '123'
|
3
|
+
|
4
|
+
# Faraday adapter to make requests with:
|
5
|
+
# config.adapter = :net_http
|
6
|
+
|
7
|
+
# HTTP verb for API methods (:get or :post)
|
8
|
+
# config.http_verb = :get
|
9
|
+
|
10
|
+
# Logging parameters:
|
11
|
+
# log everything through the rails logger
|
12
|
+
config.logger = Rails.logger
|
13
|
+
|
14
|
+
# log requests' URLs
|
15
|
+
# config.log_requests = true
|
16
|
+
|
17
|
+
# log response JSON after errors
|
18
|
+
# config.log_errors = true
|
19
|
+
|
20
|
+
# log response JSON after successful responses
|
21
|
+
# config.log_responses = false
|
22
|
+
end
|
data/lib/ponominalu.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
require 'yaml'
|
4
|
+
require 'hashie'
|
5
|
+
require 'oj'
|
6
|
+
|
7
|
+
require 'ponominalu/configuration'
|
8
|
+
require 'ponominalu/helpers'
|
9
|
+
require 'ponominalu/middleware'
|
10
|
+
require 'ponominalu/api'
|
11
|
+
require 'ponominalu/response'
|
12
|
+
require 'ponominalu/error'
|
13
|
+
|
14
|
+
module Ponominalu
|
15
|
+
extend Configuration
|
16
|
+
|
17
|
+
class << self
|
18
|
+
def method_missing(method, *args, &block)
|
19
|
+
API.call_method(method, *args, &block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Register alias
|
24
|
+
Object.const_set(:Pn, Ponominalu)
|
25
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Ponominalu
|
2
|
+
module API
|
3
|
+
# Base part of Ponominalu API endpoint url.
|
4
|
+
BASE_URL = 'http://api.cultserv.ru/jtransport'.freeze
|
5
|
+
|
6
|
+
class << self
|
7
|
+
# API method call.
|
8
|
+
# @param [String] method_name A name of the method.
|
9
|
+
# @param [Hash] args Method arguments.
|
10
|
+
# @return [Hashie::Mash] Mashed server response.
|
11
|
+
def call_method(method_name, args = {}, &block)
|
12
|
+
method_name_str = method_name.to_s
|
13
|
+
url = create_url(method_name_str)
|
14
|
+
args = Helpers.flatten(args)
|
15
|
+
|
16
|
+
response = connection(url).send(Ponominalu.http_verb,
|
17
|
+
method_name_str, args).body
|
18
|
+
Response.process(response, block)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Faraday connection.
|
22
|
+
# @param [String] url Connection URL (either full or just prefix).
|
23
|
+
# @return [Faraday::Connection] Created connection.
|
24
|
+
def connection(url)
|
25
|
+
Faraday.new(url, Ponominalu.faraday_options) do |faraday|
|
26
|
+
faraday.request :multipart
|
27
|
+
faraday.request :url_encoded
|
28
|
+
faraday.request :retry, Ponominalu.max_retries
|
29
|
+
faraday.response :ponominalu
|
30
|
+
faraday.adapter Ponominalu.adapter
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
# Creates a complete url from prefixes and the method name
|
36
|
+
# @param [String] method_name A name of the method.
|
37
|
+
# @return [String] url
|
38
|
+
def create_url(method_name)
|
39
|
+
filename = File.expand_path('../simple_methods.yml', __FILE__)
|
40
|
+
simple_methods = YAML.load_file(filename)
|
41
|
+
url_prefix = simple_methods.include?(method_name) ? '/simple/' :
|
42
|
+
'/partner/'
|
43
|
+
BASE_URL + url_prefix
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Ponominalu
|
4
|
+
module Configuration
|
5
|
+
# Default global options
|
6
|
+
DEFAULT_OPTIONS = {
|
7
|
+
adapter: Faraday.default_adapter,
|
8
|
+
session: '123',
|
9
|
+
max_retries: 2,
|
10
|
+
empty_strict: false,
|
11
|
+
raw_json: false,
|
12
|
+
logger: ::Logger.new(STDOUT),
|
13
|
+
log_requests: true,
|
14
|
+
log_responses: false,
|
15
|
+
wrap_response: false,
|
16
|
+
http_verb: :post,
|
17
|
+
faraday_options: {}
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
attr_accessor *DEFAULT_OPTIONS.keys
|
21
|
+
|
22
|
+
alias_method :log_requests?, :log_requests
|
23
|
+
alias_method :log_responses?, :log_responses
|
24
|
+
|
25
|
+
# A global configuration set via the block or hash.
|
26
|
+
# @param [Hash] options Hash of options
|
27
|
+
# @example
|
28
|
+
# Ponominalu.configure do |config|
|
29
|
+
# config.adapter = :net_http
|
30
|
+
# config.logger = Rails.logger
|
31
|
+
# end
|
32
|
+
def configure(options={})
|
33
|
+
configure_by_hash(options) unless options.empty?
|
34
|
+
yield self if block_given?
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
# Reset configuration options to default values.
|
39
|
+
def reset
|
40
|
+
DEFAULT_OPTIONS.each do |k, v|
|
41
|
+
send("#{k}=", v)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Set configuration options to their default values,
|
46
|
+
# when this module is extended.
|
47
|
+
def self.extended(base)
|
48
|
+
base.reset
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
# Configures global options via hash
|
53
|
+
# @param [Hash] options Hash of options
|
54
|
+
def configure_by_hash(options)
|
55
|
+
DEFAULT_OPTIONS.keys.each do |k|
|
56
|
+
send("#{k}=", options[k])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Ponominalu
|
2
|
+
# An exception raised by `Ponominalu::Response` when given a response with an error.
|
3
|
+
class Error < StandardError
|
4
|
+
# An error code.
|
5
|
+
# @return [Fixnum]
|
6
|
+
attr_reader :error_code
|
7
|
+
# An exception is initialized by the data from response mash.
|
8
|
+
# @param [Hash] data Error data.
|
9
|
+
def initialize(data)
|
10
|
+
@error_code = data.code
|
11
|
+
@error_msg = data.message
|
12
|
+
@method_name = data.method_name
|
13
|
+
@session = data.session
|
14
|
+
@params = data.params
|
15
|
+
end
|
16
|
+
|
17
|
+
# A full description of the error.
|
18
|
+
# @return [String]
|
19
|
+
def message
|
20
|
+
message = "Ponominalu returned an error #{@error_code}: '#{@error_msg}'"\
|
21
|
+
" after calling method '#{@method_name}'"
|
22
|
+
|
23
|
+
if (@params.empty?)
|
24
|
+
message << " without parameters."
|
25
|
+
else
|
26
|
+
message << " with parameters #{@params.inspect}."
|
27
|
+
end
|
28
|
+
message << " App session is '#{@session}'."
|
29
|
+
message
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ponominalu
|
2
|
+
module Helpers
|
3
|
+
class << self
|
4
|
+
# Flattens enumerable values of user param
|
5
|
+
# (for example "exclude")
|
6
|
+
# @param [Hash] Hash of unflatten arguments
|
7
|
+
# @return [Hash] Result hash
|
8
|
+
def flatten(args)
|
9
|
+
args.inject({}) do |hash, (k, v)|
|
10
|
+
hash[k] = v.respond_to?(:join) ? v.join(',') : v
|
11
|
+
hash
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Converts params string to hash
|
16
|
+
# @param [String] Part of the request url with user params
|
17
|
+
# @return [Hash] Hash of user params
|
18
|
+
def parse_params(params_str)
|
19
|
+
params_str.split('&').inject({}) do |hash, part|
|
20
|
+
key_value = part.split('=')
|
21
|
+
hash[key_value.first] = key_value.last
|
22
|
+
hash
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Ponominalu
|
2
|
+
# Faraday middleware for a passing the session param to the request
|
3
|
+
# and config data to the response under the hood.
|
4
|
+
# Also it handles errors
|
5
|
+
class Middleware < Faraday::Response::Middleware
|
6
|
+
# Passes the session param
|
7
|
+
# @param [Hash] env Request data.
|
8
|
+
def initialize(app)
|
9
|
+
super(app)
|
10
|
+
@session = Ponominalu.session
|
11
|
+
@logger = Ponominalu.logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
# Parse the params and the method name from request body
|
16
|
+
@method_name = env.url.to_s.split('/').last
|
17
|
+
@params = Helpers.parse_params(env.body)
|
18
|
+
|
19
|
+
if Ponominalu.log_requests?
|
20
|
+
@logger.debug "Ponominalu: #{@method_name.upcase} #{env.url.to_s}"
|
21
|
+
@logger.debug "session: #{@session} params: #{@params}"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Add the session to the user request params
|
25
|
+
env.body << "&session=#{@session}"
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
# Passes the user params and handle request errors
|
30
|
+
# @param [Hash] env Response data.
|
31
|
+
def on_complete(env)
|
32
|
+
if env.status != 200
|
33
|
+
@logger.error "Request failed with status code #{env.status}."
|
34
|
+
raise "Request failed with status code #{env.status}."
|
35
|
+
end
|
36
|
+
|
37
|
+
config_data = {
|
38
|
+
method_name: @method_name,
|
39
|
+
params: @params,
|
40
|
+
session: @session
|
41
|
+
}
|
42
|
+
|
43
|
+
env.body = Hashie::Mash.new(Oj.load(env.body).merge(config_data))
|
44
|
+
|
45
|
+
if env.body.code.zero? && !Ponominalu.empty_strict
|
46
|
+
@logger.warn 'Nothing was found. Result is empty.'
|
47
|
+
elsif env.body.code < 1
|
48
|
+
@logger.error "#{env.body.code}: #{env.body.message}."
|
49
|
+
raise Ponominalu::Error.new(env.body)
|
50
|
+
else
|
51
|
+
@logger.debug "body: #{env.body}" if Ponominalu.log_responses?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Faraday::Response.register_middleware ponominalu:
|
58
|
+
Ponominalu::Middleware
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Ponominalu
|
2
|
+
module Response
|
3
|
+
class << self
|
4
|
+
# The main method result processing.
|
5
|
+
# @param [Hashie::Mash] response The server response in mash format.
|
6
|
+
# @param [Proc] block A block passed to the API method.
|
7
|
+
# @return [Array, Hashie::Mash] The processed result.
|
8
|
+
# @raise [Ponominalu::Error] raised when Ponominalu returns
|
9
|
+
# an error response.
|
10
|
+
def process(response, block)
|
11
|
+
result = get_result(response)
|
12
|
+
result = Oj.dump(result) if Ponominalu.raw_json
|
13
|
+
|
14
|
+
if result.respond_to?(:each)
|
15
|
+
# enumerable result receives :map with a block when called
|
16
|
+
# with a block or is returned untouched otherwise
|
17
|
+
block.nil? ? result : result.map(&block)
|
18
|
+
else
|
19
|
+
# non-enumerable result is yielded if block_given?)
|
20
|
+
block.nil? ? result : block.call(result)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def get_result(response)
|
26
|
+
# an empty array is returned if error code is 0 (not found)
|
27
|
+
# and empty_strict option is false
|
28
|
+
if response.code.zero? && !Ponominalu.empty_strict
|
29
|
+
[]
|
30
|
+
else
|
31
|
+
# if wrap_response option is true response is returned
|
32
|
+
# as element of response wrapper with api status code
|
33
|
+
# and params
|
34
|
+
Ponominalu.wrap_response ? response : response.message
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/ponominalu.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
$: << File.expand_path('../lib', __FILE__)
|
3
|
+
require 'ponominalu/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'ponominalu'
|
7
|
+
s.version = Ponominalu::VERSION
|
8
|
+
s.summary = "Ponominalu gem"
|
9
|
+
s.description = "Ponominalu API Ruby wrapper"
|
10
|
+
s.authors = ["Dmitry Kovalevsky"]
|
11
|
+
s.email = 'crossonrails@gmail.com'
|
12
|
+
s.files = ["lib/ponominalu.rb"]
|
13
|
+
s.homepage = 'https://github.com/crossaidi/ponominalu'
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split($/)
|
17
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
19
|
+
s.require_paths = ['lib']
|
20
|
+
|
21
|
+
s.required_ruby_version = '>= 1.9.2'
|
22
|
+
|
23
|
+
s.add_runtime_dependency 'faraday', '~> 0.8'
|
24
|
+
s.add_runtime_dependency 'faraday_middleware', '~> 0.8'
|
25
|
+
s.add_runtime_dependency 'hashie', '~> 2.0'
|
26
|
+
s.add_runtime_dependency 'oj', '~> 2.8'
|
27
|
+
|
28
|
+
s.add_development_dependency 'bundler', '~> 1.3'
|
29
|
+
s.add_development_dependency 'rake'
|
30
|
+
s.add_development_dependency 'pry'
|
31
|
+
s.add_development_dependency 'rspec'
|
32
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu::API do
|
4
|
+
let(:connection) do
|
5
|
+
Faraday.new do |builder|
|
6
|
+
builder.adapter :test do |stub|
|
7
|
+
stub.post('/api_method') do
|
8
|
+
[200, {}, double('Response')]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".call_method" do
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
subject.stub(:connection).and_return(connection)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "calls a connection" do
|
21
|
+
Ponominalu::Response.stub(:process)
|
22
|
+
expect(subject).to receive(:connection)
|
23
|
+
subject.call_method('api_method', { some: :params })
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns the response body" do
|
27
|
+
response = connection.send(Ponominalu.http_verb, 'api_method', {}).body
|
28
|
+
Ponominalu::Response.stub(:process).and_return(response)
|
29
|
+
|
30
|
+
expect(subject.call_method('api_method')).to eq(response)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "gets an HTTP verb from Ponominalu.http_verb" do
|
34
|
+
Ponominalu::Response.stub(:process)
|
35
|
+
http_verb = double("HTTP verb")
|
36
|
+
Ponominalu.http_verb = http_verb
|
37
|
+
|
38
|
+
response = double("Response", body: double)
|
39
|
+
expect(connection).to receive(:send).with(http_verb, 'api_method', {}).and_return(response)
|
40
|
+
subject.call_method('api_method')
|
41
|
+
end
|
42
|
+
|
43
|
+
after(:each) do
|
44
|
+
Ponominalu.reset
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '.connection' do
|
49
|
+
let(:url) { double('URL') }
|
50
|
+
let(:faraday_options) { double('Faraday options') }
|
51
|
+
|
52
|
+
it 'initiliazes new Faraday connection' do
|
53
|
+
Ponominalu.stub(:faraday_options).and_return(faraday_options)
|
54
|
+
expect(Faraday).to receive(:new).with(url, faraday_options)
|
55
|
+
subject.connection(url)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu::Configuration do
|
4
|
+
|
5
|
+
class ConfigurationTest
|
6
|
+
extend Ponominalu::Configuration
|
7
|
+
end
|
8
|
+
|
9
|
+
subject { ConfigurationTest }
|
10
|
+
|
11
|
+
describe '.configure' do
|
12
|
+
let(:options) { { session: '321', empty_strict: true, max_retries: 4 } }
|
13
|
+
|
14
|
+
it 'configured by passed hash' do
|
15
|
+
subject.configure(options)
|
16
|
+
expect(subject.session).to eq('321')
|
17
|
+
expect(subject.empty_strict).to be_true
|
18
|
+
expect(subject.max_retries).to eq(4)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'yields self' do
|
22
|
+
expect(subject).to receive(:option)
|
23
|
+
subject.configure { |pn| pn.option }
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns self' do
|
27
|
+
expect(subject.configure).to eq(subject)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'defines log params predicates as aliases' do
|
32
|
+
expect { subject.log_requests = false }.to change { subject.log_requests? }
|
33
|
+
.from(true).to(false)
|
34
|
+
expect { subject.log_responses = true }.to change { subject.log_responses? }
|
35
|
+
.from(false).to(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '.reset' do
|
39
|
+
it 'resets options to default values' do
|
40
|
+
subject.reset
|
41
|
+
|
42
|
+
expect(subject.adapter).to eq(:net_http)
|
43
|
+
expect(subject.logger).to be_instance_of(::Logger)
|
44
|
+
expect(subject.session).to eq('123')
|
45
|
+
expect(subject.max_retries).to eq(2)
|
46
|
+
expect(subject.empty_strict).to be_false
|
47
|
+
expect(subject.raw_json).to be_false
|
48
|
+
expect(subject.log_requests).to be_true
|
49
|
+
expect(subject.log_responses).to be_false
|
50
|
+
expect(subject.wrap_response).to be_false
|
51
|
+
expect(subject.http_verb).to eq(:post)
|
52
|
+
expect(subject.faraday_options).to eq({})
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu::Error do
|
4
|
+
let(:error_data) do
|
5
|
+
Hashie::Mash.new(
|
6
|
+
{
|
7
|
+
code: -200,
|
8
|
+
message: 'Test error',
|
9
|
+
method_name: 'The method name',
|
10
|
+
session: '123'
|
11
|
+
}
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#message' do
|
16
|
+
let(:error) { Ponominalu::Error.new(error_data) }
|
17
|
+
|
18
|
+
it 'includes params message when params are passed' do
|
19
|
+
error_data.params = Hashie::Mash.new({alias: 'alias'})
|
20
|
+
|
21
|
+
message = "Ponominalu returned an error -200: 'Test error'"\
|
22
|
+
" after calling method 'The method name'"
|
23
|
+
message << " with parameters #{error_data.params.inspect}."
|
24
|
+
message << " App session is '123'."
|
25
|
+
|
26
|
+
expect(error.message).to eq(message)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'does not includes params message when params are not passed' do
|
30
|
+
error_data.params = []
|
31
|
+
|
32
|
+
message = "Ponominalu returned an error -200: 'Test error'"\
|
33
|
+
" after calling method 'The method name'"
|
34
|
+
message << " without parameters."
|
35
|
+
message << " App session is '123'."
|
36
|
+
|
37
|
+
expect(error.message).to eq(message)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu::Helpers do
|
4
|
+
|
5
|
+
describe '.flatten' do
|
6
|
+
let(:args) { { str_arg: 'string', array_arg: ['str1', 'str2'] } }
|
7
|
+
|
8
|
+
it 'leaves flat arguments untouched and flats a collection' do
|
9
|
+
expect(subject.flatten(args))
|
10
|
+
.to eq({ str_arg: 'string', array_arg: 'str1,str2' })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.parse_params' do
|
15
|
+
let(:param_str) { 'alias=something&id=123&exclude=venue' }
|
16
|
+
|
17
|
+
it 'correctly parses the params' do
|
18
|
+
expect(subject.parse_params(param_str))
|
19
|
+
.to eq({ 'alias' => 'something', 'id' => '123', 'exclude' => 'venue'})
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu::Middleware do
|
4
|
+
let(:logger) { double("Logger").as_null_object }
|
5
|
+
let(:app) { double("App").as_null_object }
|
6
|
+
let(:url) { double('URL', to_s: Ponominalu::API::BASE_URL + '/test_method' ) }
|
7
|
+
|
8
|
+
let(:env_request) { double('Env object', body: 'param_1=1¶m_2=2',
|
9
|
+
url: url, status: 200) }
|
10
|
+
|
11
|
+
let(:env_success) { double('Env success object',
|
12
|
+
body: double('Body', code: 1) , status: 200) }
|
13
|
+
|
14
|
+
let(:env_empty) { double('Env empty object', body: double('Body', code: 0),
|
15
|
+
status: 200) }
|
16
|
+
|
17
|
+
let(:api_error) { double('API error body', code: -200, message: 'API error',
|
18
|
+
method_name: 'test_method', session: Ponominalu.session, params: {} ) }
|
19
|
+
|
20
|
+
let(:env_api_error) { double('Env api error object', body: api_error,
|
21
|
+
status: 200) }
|
22
|
+
|
23
|
+
let(:env_fail) { double('Env fail object', body: double('Body', code: 1),
|
24
|
+
status: 404) }
|
25
|
+
|
26
|
+
before(:each) do
|
27
|
+
Ponominalu.logger = logger
|
28
|
+
Ponominalu.session = 'test_session'
|
29
|
+
Ponominalu.log_requests = false
|
30
|
+
Ponominalu.log_responses = false
|
31
|
+
end
|
32
|
+
|
33
|
+
subject { Ponominalu::Middleware.new(app) }
|
34
|
+
|
35
|
+
context 'when request is processing' do
|
36
|
+
it 'calls debug method on the logger with correct messages' do
|
37
|
+
Ponominalu.log_requests = true
|
38
|
+
expect(logger).to receive(:debug)
|
39
|
+
.with('Ponominalu: TEST_METHOD '\
|
40
|
+
'http://api.cultserv.ru/jtransport/test_method')
|
41
|
+
expect(logger).to receive(:debug)
|
42
|
+
.with('session: test_session params: {"param_1"=>"1", "param_2"=>"2"}')
|
43
|
+
subject.call(env_request)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'adds the session param to the request body' do
|
47
|
+
expect(env_request.body).to receive(:<<)
|
48
|
+
.with('&session=test_session')
|
49
|
+
subject.call(env_request)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when response is processing' do
|
54
|
+
before(:each) do
|
55
|
+
Oj.stub(:load).and_return({})
|
56
|
+
end
|
57
|
+
|
58
|
+
context '(logging)' do
|
59
|
+
before(:each) { subject.stub(:raise) }
|
60
|
+
|
61
|
+
it 'calls warn method on the logger if result is empty' do
|
62
|
+
env_empty.stub(:body=)
|
63
|
+
|
64
|
+
expect(logger).to receive(:warn)
|
65
|
+
.with('Nothing was found. Result is empty.')
|
66
|
+
subject.on_complete(env_empty)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'calls error method on the logger if API error is returned' do
|
70
|
+
env_api_error.stub(:body=)
|
71
|
+
|
72
|
+
expect(logger).to receive(:error)
|
73
|
+
.with('-200: API error.')
|
74
|
+
subject.on_complete(env_api_error)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'calls error method on the logger if API error is returned' do
|
78
|
+
env_fail.stub(:body=)
|
79
|
+
|
80
|
+
expect(logger).to receive(:error)
|
81
|
+
.with('Request failed with status code 404.')
|
82
|
+
subject.on_complete(env_fail)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'calls debug method on the logger if log_responses is true' do
|
86
|
+
env_success.stub(:body=)
|
87
|
+
|
88
|
+
Ponominalu.log_responses = true
|
89
|
+
|
90
|
+
expect(logger).to receive(:debug)
|
91
|
+
.with("body: #{env_success.body}")
|
92
|
+
subject.on_complete(env_success)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context '(error raising)' do
|
97
|
+
it 'raises runtime error if response status is not 200' do
|
98
|
+
env_fail.stub(:body=)
|
99
|
+
|
100
|
+
expect { subject.on_complete(env_fail) }.to \
|
101
|
+
raise_error(RuntimeError, 'Request failed with status code 404.')
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'raises Ponominalu::Error if response code is negative number' do
|
105
|
+
env_api_error.stub(:body=)
|
106
|
+
|
107
|
+
expect { subject.on_complete(env_api_error) }.to \
|
108
|
+
raise_error(Ponominalu::Error)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu::Response do
|
4
|
+
let(:block) { proc(&:method) }
|
5
|
+
let(:data_enum) { double('Enumerable data', each: block ) }
|
6
|
+
let(:response_full_enum) { double('Full response', code: 1, message: data_enum) }
|
7
|
+
|
8
|
+
before { Ponominalu.reset }
|
9
|
+
|
10
|
+
describe '.process' do
|
11
|
+
it 'returns a string if the raw_json option is true' do
|
12
|
+
Ponominalu.raw_json = true
|
13
|
+
expect(Oj).to receive(:dump).with(data_enum)
|
14
|
+
subject.process(response_full_enum, nil)
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when block given' do
|
18
|
+
let(:data_non_enum) { double('Non-enumerable data') }
|
19
|
+
let(:response_full_non_enum) { double('Full response', code: 1, message: data_non_enum) }
|
20
|
+
|
21
|
+
it 'receives :map with a block if it is collection' do
|
22
|
+
subject.stub(:get_result).and_return(data_enum)
|
23
|
+
expect(data_enum).to receive(:map)
|
24
|
+
subject.process(response_full_enum, block)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'is yielded if result is non-enumerable' do
|
28
|
+
subject.stub(:get_result).and_return(data_non_enum)
|
29
|
+
expect(block).to receive(:call).with(data_non_enum)
|
30
|
+
subject.process(response_full_non_enum, block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '.get_result' do
|
36
|
+
let(:response_empty) { double('Empty response', code: 0, message: 'empty') }
|
37
|
+
|
38
|
+
it 'returns an empty array if a result is not found' do
|
39
|
+
expect(subject.send(:get_result, response_empty)).to eq([])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'does not return an empty array if empty_strict is true' do
|
43
|
+
Ponominalu.empty_strict = true
|
44
|
+
expect(subject.send(:get_result, response_empty)).not_to eq([])
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns a result if it is not empty' do
|
48
|
+
expect(subject.send(:get_result, response_full_enum))
|
49
|
+
.to eq(response_full_enum.message)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns a result in a wrapper if the wrap_response option is true' do
|
53
|
+
Ponominalu.wrap_response = true
|
54
|
+
expect(subject.send(:get_result, response_full_enum))
|
55
|
+
.to eq(response_full_enum)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ponominalu do
|
4
|
+
context 'when short alias is registered' do
|
5
|
+
it 'automatically registers the short alias' do
|
6
|
+
expect(subject).to eq(Pn)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'when delegating to API module' do
|
11
|
+
it 'delegates methods to API.call_method' do
|
12
|
+
expect(subject::API).to receive(:call_method)
|
13
|
+
.with(:test_method)
|
14
|
+
subject.test_method
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'ponominalu'
|
2
|
+
|
3
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
4
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
5
|
+
# loaded once.
|
6
|
+
#
|
7
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
10
|
+
config.run_all_when_everything_filtered = true
|
11
|
+
config.filter_run :focus
|
12
|
+
config.color = true
|
13
|
+
config.order = 'random'
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ponominalu
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dmitry Kovalevsky
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday_middleware
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.8'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hashie
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: oj
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.8'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.8'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Ponominalu API Ruby wrapper
|
126
|
+
email: crossonrails@gmail.com
|
127
|
+
executables: []
|
128
|
+
extensions: []
|
129
|
+
extra_rdoc_files: []
|
130
|
+
files:
|
131
|
+
- ".gitignore"
|
132
|
+
- ".travis.yml"
|
133
|
+
- CHANGELOG.md
|
134
|
+
- Gemfile
|
135
|
+
- LICENSE.txt
|
136
|
+
- README.md
|
137
|
+
- Rakefile
|
138
|
+
- lib/generators/ponominalu/install/USAGE
|
139
|
+
- lib/generators/ponominalu/install/install_generator.rb
|
140
|
+
- lib/generators/ponominalu/install/templates/initializer.rb
|
141
|
+
- lib/ponominalu.rb
|
142
|
+
- lib/ponominalu/api.rb
|
143
|
+
- lib/ponominalu/configuration.rb
|
144
|
+
- lib/ponominalu/error.rb
|
145
|
+
- lib/ponominalu/helpers.rb
|
146
|
+
- lib/ponominalu/middleware.rb
|
147
|
+
- lib/ponominalu/response.rb
|
148
|
+
- lib/ponominalu/simple_methods.yml
|
149
|
+
- lib/ponominalu/version.rb
|
150
|
+
- ponominalu.gemspec
|
151
|
+
- spec/ponominalu/api_spec.rb
|
152
|
+
- spec/ponominalu/configuration_spec.rb
|
153
|
+
- spec/ponominalu/error_spec.rb
|
154
|
+
- spec/ponominalu/helpers_spec.rb
|
155
|
+
- spec/ponominalu/middleware_spec.rb
|
156
|
+
- spec/ponominalu/response_spec.rb
|
157
|
+
- spec/ponominalu_spec.rb
|
158
|
+
- spec/spec_helper.rb
|
159
|
+
homepage: https://github.com/crossaidi/ponominalu
|
160
|
+
licenses:
|
161
|
+
- MIT
|
162
|
+
metadata: {}
|
163
|
+
post_install_message:
|
164
|
+
rdoc_options: []
|
165
|
+
require_paths:
|
166
|
+
- lib
|
167
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: 1.9.2
|
172
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
requirements: []
|
178
|
+
rubyforge_project:
|
179
|
+
rubygems_version: 2.2.2
|
180
|
+
signing_key:
|
181
|
+
specification_version: 4
|
182
|
+
summary: Ponominalu gem
|
183
|
+
test_files:
|
184
|
+
- spec/ponominalu/api_spec.rb
|
185
|
+
- spec/ponominalu/configuration_spec.rb
|
186
|
+
- spec/ponominalu/error_spec.rb
|
187
|
+
- spec/ponominalu/helpers_spec.rb
|
188
|
+
- spec/ponominalu/middleware_spec.rb
|
189
|
+
- spec/ponominalu/response_spec.rb
|
190
|
+
- spec/ponominalu_spec.rb
|
191
|
+
- spec/spec_helper.rb
|