bvr 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,17 @@
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
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'minitest', '~> 4.7.5'
5
+ gem 'guard'
6
+ gem 'guard-minitest'
7
+ gem 'pry'
8
+ gem 'pry-debugger'
9
+ gem 'turn'
10
+ end
11
+ # Specify your gem's dependencies in bvr.gemspec
12
+ gemspec
@@ -0,0 +1,14 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :minitest do
5
+ ## with Minitest::Unit
6
+ #watch(%r{^test/(.*)\/?test_(.*)\.rb})
7
+ #watch(%r{^lib/(.*/)?([^/]+)\.rb}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
8
+ #watch(%r{^test/test_helper\.rb}) { 'test' }
9
+
10
+ # with Minitest::Spec
11
+ watch(%r{^spec/(.*)_spec\.rb})
12
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
13
+ watch(%r{^spec/spec_helper\.rb}) { 'spec' }
14
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 gregory
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,39 @@
1
+ # Bvr
2
+
3
+ The BestVoipReselling Ruby Gem
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'bvr'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install bvr
18
+
19
+ ## Usage
20
+
21
+ ### Configuration
22
+ `
23
+ Bvr.configure do |config|
24
+ config.username, config.password = ['username', 'password']
25
+ end
26
+ `
27
+ ### Retreiving Call Overview
28
+ `
29
+ Bvr::CallOverview.find('a customer id')
30
+ `
31
+
32
+
33
+ ## Contributing
34
+
35
+ 1. Fork it
36
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
37
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
38
+ 4. Push to the branch (`git push origin my-new-feature`)
39
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bvr/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bvr"
8
+ spec.version = Bvr::VERSION
9
+ spec.authors = ["gregory"]
10
+ spec.email = ["greg2502@gmail.com"]
11
+ spec.description = %q{A ruby interface to Bestvoipreselling API}
12
+ spec.summary = spec.description
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
+ spec.add_development_dependency 'rack'
24
+ spec.add_development_dependency "faraday"
25
+ spec.add_development_dependency "happymapper"
26
+ end
@@ -0,0 +1,16 @@
1
+ require 'happymapper'
2
+ Dir[File.dirname(__FILE__) + '/bvr/*.rb'].each{ |file| require file }
3
+
4
+ module Bvr
5
+ extend self
6
+
7
+ attr_accessor :config, :connection
8
+
9
+ def configure
10
+ @config = Bvr::Configuration.new.tap{ |configuration| yield(configuration) }
11
+ end
12
+
13
+ def connection
14
+ @connection ||= Bvr::Connection.new
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'phone'
2
+ module Bvr
3
+ class Call
4
+ include HappyMapper
5
+
6
+ tag 'Call'
7
+ attribute :id, String, tag: 'CallId'
8
+ attribute :calltype, String, tag: 'CallType'
9
+ attribute :start_time, Time, tag: 'StartTime'
10
+ attribute :dest, Phone, tag: 'Destination', parser: :phone_number_parser
11
+ attribute :duration, String, tag: 'Duration'
12
+ attribute :charge, String, tag: 'Charge' #? currency
13
+
14
+ def relative_duration
15
+ Time.parse(self.duration, start_time)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,46 @@
1
+ require_relative 'call'
2
+ module Bvr
3
+ class CallOverview
4
+ API_COMMAND = 'CallOverview'
5
+ # Valid Options:
6
+ # Variable Value Option Description
7
+ # command calloverview Mandatory
8
+ # username X..140 Mandatory the username of the reseller
9
+ # password X..100 Mandatory the password of the reseller
10
+ # customer X..140 Mandatory the username of the customer
11
+ # date YYYY-MM-DD hh:nn:ss Optional the datetime from which to start retrieving the history, current datetime is default
12
+ # callid N..1000000 Optional the callid from which to start retrieving the history, 0 is default
13
+ # recordcount 1 - 500 Optional the maximum number of records returned, 10 is default, 500 is maximum
14
+ # direction forward / backward Optional the direction to search, backward is default
15
+ VALID_OPTIONS = [:date, :callid, :recordcount, :direction]
16
+
17
+ include ::HappyMapper
18
+
19
+ tag 'Calls'
20
+ has_many :calls, Bvr::Call
21
+ attribute :count, Integer, tag: 'Count'
22
+
23
+
24
+ def self.find(customer_id, options={})
25
+ raise ArgumentError.new('Unknown Argument') unless self.valid_options?(options)
26
+
27
+ params = {
28
+ command: API_COMMAND,
29
+ customer: customer_id
30
+ }
31
+
32
+ options.merge! params
33
+ self.parse(self.result(options)).first #only one <Calls> tag
34
+ end
35
+
36
+ private
37
+
38
+ def self.result(options)
39
+ Bvr.connection.get(options)
40
+ end
41
+
42
+ def self.valid_options?(options)
43
+ options.empty? ? true : options.keys.all? { |option| VALID_OPTIONS.include? option}
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,3 @@
1
+ module Bvr
2
+ class Configuration < Struct.new(:username, :password); end
3
+ end
@@ -0,0 +1,36 @@
1
+ require 'faraday'
2
+ require 'rack'
3
+
4
+ module Bvr
5
+ class Connection
6
+ BASE_URI = 'https://www.voipinfocenter.com'
7
+ API_PATH = '/API/Request.ashx?'
8
+
9
+ attr_accessor :faraday_connection
10
+
11
+ def initialize(faraday_adapter=Faraday.default_adapter)
12
+ @faraday_connection = Faraday.new(url: self.base_uri) do |faraday|
13
+ faraday.response :logger
14
+ faraday.adapter faraday_adapter
15
+ end
16
+ end
17
+
18
+ def base_uri
19
+ BASE_URI
20
+ end
21
+
22
+ def get(params)
23
+ #TODO: prase body for 500
24
+ self.faraday_connection.get(uri(params)).body
25
+ end
26
+
27
+ def uri(queryH)
28
+ params = {
29
+ username: Bvr.config.username,
30
+ password: Bvr.config.password
31
+ }
32
+ queryH.merge! params
33
+ "#{API_PATH}#{::Rack::Utils.build_query queryH}"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ module Bvr
2
+ class Phone
3
+ attr_accessor :number
4
+
5
+ def initialize(phone_number)
6
+ @number = phone_number
7
+ end
8
+
9
+ def self.phone_number_parser(phone_number)
10
+ self.new(phone_number)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Bvr
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0"?>
2
+ <!DOCTYPE CallOverview>
3
+ <CallOverview>
4
+ <Calls Count="10">
5
+ <Call CallType="PSTNOutSip" Customer="this account" StartTime="2013-12-24 18:05:26 (UTC)" Destination="+32123456788" Duration="00:02:21" Charge="0.0705" CallId="1234567890" />
6
+ <Call CallType="PSTNOutSip" Customer="this account" StartTime="2013-12-24 18:05:14 (UTC)" Destination="+49123456789" Duration="00:02:41" Charge="0.10734" CallId="1234567891" />
7
+ <Call CallType="PSTNOutSip" Customer="this account" StartTime="2013-12-01 23:02:38 (UTC)" Destination="+49123456790" Duration="00:00:20" Charge="0.01334" CallId="1234567892" />
8
+ <Call CallType="PSTNOutSip" Customer="this account" StartTime="2013-12-01 22:59:01 (UTC)" Destination="+49123456791" Duration="00:00:15" Charge="0.01" CallId="1234567893" />
9
+ <Call CallType="PSTNOutSip" Customer="this account" StartTime="2013-10-29 11:30:18 (UTC)" Destination="+49123456792" Duration="00:00:15" Charge="0.01" CallId="1234567894" />
10
+ </Calls>
11
+ <MoreData>False</MoreData>
12
+ </CallOverview>
@@ -0,0 +1,94 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Bvr::CallOverview do
4
+ describe '.find(customer_id, options)' do
5
+ let(:customer_id) { 'john' }
6
+ let(:connection) { Minitest::Mock.new }
7
+ let(:body) { 'response' }
8
+
9
+ def stub_connection
10
+ Bvr.stub(:connection, connection) { yield }
11
+ end
12
+
13
+ def stub_result(res)
14
+ Bvr::CallOverview.stub(:result, res) { yield }
15
+ end
16
+
17
+ def stub_parse(result)
18
+ Bvr::CallOverview.stub(:parse, result) { yield }
19
+ end
20
+
21
+ describe 'when options are omitted' do
22
+ subject{ Bvr::CallOverview.find(customer_id) }
23
+
24
+ it 'sets the right command and the customer_id' do
25
+ stub_connection do
26
+ stub_parse([]) do
27
+ connection.expect :get, [], [{command: Bvr::CallOverview::API_COMMAND, customer: customer_id}]
28
+ subject
29
+ connection.verify
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ describe 'when options are provided, it merges the options with the command and customer_id' do
36
+ let(:options) { { recordcount: 'bar', callid: 'foo' } }
37
+
38
+ subject{ Bvr::CallOverview.find(customer_id, options) }
39
+
40
+ it 'merges the CallOverview command and the customer_id with options' do
41
+ stub_connection do
42
+ stub_parse([]) do
43
+ expected_options = options.merge({command: Bvr::CallOverview::API_COMMAND, customer: customer_id})
44
+ connection.expect :get, [], [expected_options]
45
+ subject
46
+ connection.verify
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ describe 'when wrong options are provided, raise an argument error' do
53
+ let(:options) { { foo: 'bar', john: 'Doe' } }
54
+
55
+ subject{ Bvr::CallOverview.find(customer_id, options) }
56
+
57
+ it 'merges the CallOverview command and the customer_id with options' do
58
+ expected_options = options.merge({command: Bvr::CallOverview::API_COMMAND, customer: customer_id})
59
+ proc {subject}.must_raise ArgumentError
60
+ end
61
+ end
62
+
63
+
64
+ describe 'when there is a response' do
65
+ let(:response) do
66
+ File.read(File.join(File.dirname(__FILE__), '/..', '/..', '/fixtures/CallOverview.xml'))
67
+ end
68
+
69
+ subject{ Bvr::CallOverview.find(customer_id) }
70
+
71
+ it 'parse the response to objects' do
72
+ stub_result(response) do |connection|
73
+ subject.must_be_instance_of Bvr::CallOverview
74
+ subject.calls.size.must_equal 5
75
+ subject.count.must_equal 10
76
+
77
+ subject.calls[0].tap do |call|
78
+ start_time = Time.parse("2013-12-24 18:05:26 (UTC)")
79
+ call.id.must_equal "1234567890"
80
+ call.calltype.must_equal "PSTNOutSip"
81
+ call.start_time.must_equal start_time
82
+ call.dest.must_be_instance_of Bvr::Phone
83
+ call.dest.number.must_equal "+32123456788"
84
+ call.duration.must_equal "00:02:21"
85
+ call.relative_duration.must_equal Time.parse("00:02:21", start_time)
86
+ call.charge.must_equal "0.0705"
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+
@@ -0,0 +1,15 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Bvr::Configuration do
4
+ describe '.new' do
5
+ subject{ Bvr::Configuration.new(username, password) }
6
+
7
+ let(:username) { 'foo' }
8
+ let(:password) { 'bar' }
9
+
10
+ it 'has username and password accessor' do
11
+ subject.username.must_equal username
12
+ subject.password.must_equal password
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,95 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Bvr::Connection do
4
+ describe '.new(faraday_adapter)' do
5
+ let(:default_faraday_adapter) { Faraday::Adapter::NetHttp }
6
+ subject{ Bvr::Connection.new }
7
+
8
+ it 'returns a Faraday::Connection with the nethttp adapter' do
9
+ subject.faraday_connection.must_be_instance_of Faraday::Connection
10
+ subject.faraday_connection.builder.handlers.must_include default_faraday_adapter
11
+ end
12
+ end
13
+
14
+ describe 'base_uri' do
15
+ subject{ Bvr::Connection.new.base_uri }
16
+ let(:base_uri) { 'https://www.voipinfocenter.com' }
17
+
18
+ it "returns the base_uri of the api" do
19
+ subject.must_equal base_uri
20
+ end
21
+ end
22
+
23
+
24
+ describe 'get(params)' do
25
+ let(:params) { {foo: 'bar'} }
26
+ let(:faraday_connection) { Minitest::Mock.new }
27
+ let(:username) { 'username' }
28
+ let(:password) { 'password' }
29
+ let(:connection) do
30
+ Bvr::Connection.new.tap do |connection|
31
+ connection.faraday_connection = faraday_connection
32
+ end
33
+ end
34
+
35
+ before do
36
+ Bvr.configure do |config|
37
+ config.username = username
38
+ config.password = password
39
+ end
40
+ end
41
+
42
+ subject { connection.get(params) }
43
+
44
+ it 'calls connection.get with the right uri' do
45
+ response = Minitest::Mock.new
46
+ faraday_connection.expect :get, response, [connection.uri(params)]
47
+ response.expect :body, nil
48
+ subject
49
+ faraday_connection.verify
50
+ response.verify
51
+ end
52
+
53
+ end
54
+
55
+ describe 'uri(queryH)' do
56
+ let(:queryH) { { foo: 'bar', bar: 'foo'} }
57
+ let(:username) { 'username' }
58
+ let(:faraday_connection) { Minitest::Mock.new }
59
+ let(:password) { 'password' }
60
+ let(:connection) do
61
+ Bvr::Connection.new.tap do |connection|
62
+ connection.faraday_connection = faraday_connection
63
+ end
64
+ end
65
+
66
+ before do
67
+ Bvr.configure do |config|
68
+ config.username = username
69
+ config.password = password
70
+ end
71
+ end
72
+
73
+ subject { connection.uri(queryH) }
74
+
75
+ it 'match the api path' do
76
+ subject.must_match Regexp.new(Bvr::Connection::API_PATH)
77
+ end
78
+
79
+ it 'transform queryH to valid GET params' do
80
+ subject.must_match Regexp.new("foo=#{queryH[:foo]}&bar=#{queryH[:bar]}")
81
+ end
82
+
83
+ it 'contain username and password from the config' do #This is pretty bad :(
84
+ subject.must_match Regexp.new("username=#{username}&password=#{password}")
85
+ end
86
+
87
+ describe 'when username and password are passed in the H' do
88
+ let(:queryH) { {username: 'foo', password: 'bar'} }
89
+
90
+ it 'overwrite username and password params' do
91
+ subject.must_match Regexp.new("username=#{username}&password=#{password}")
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Bvr do
4
+ subject { Bvr }
5
+
6
+ describe '.configure' do
7
+ let(:username) { 'foo' }
8
+ let(:password) { 'bar' }
9
+
10
+ before do
11
+ subject.configure do |config|
12
+ config.username = username
13
+ config.password = password
14
+ end
15
+ end
16
+
17
+ it 'has a username and password' do
18
+ subject.config.username.must_equal username
19
+ subject.config.password.must_equal password
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler.require(:test)
4
+
5
+ require_relative '../lib/bvr'
6
+
7
+ require 'minitest/autorun'
8
+ require 'minitest/pride'
9
+
10
+ Turn.config do |c|
11
+ c.format = :outline
12
+ c.natural = true
13
+ end
14
+
15
+ MiniTest::Spec.before :each do
16
+ Bvr.configure do |config|
17
+ config.username = 'default_username'
18
+ config.password = 'default_password'
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bvr
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - gregory
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-12-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ none: false
21
+ name: bundler
22
+ type: :development
23
+ prerelease: false
24
+ requirement: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ version: '1.3'
29
+ none: false
30
+ - !ruby/object:Gem::Dependency
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ none: false
37
+ name: rake
38
+ type: :development
39
+ prerelease: false
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ none: false
46
+ - !ruby/object:Gem::Dependency
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ! '>='
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ none: false
53
+ name: rack
54
+ type: :development
55
+ prerelease: false
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ none: false
62
+ - !ruby/object:Gem::Dependency
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ none: false
69
+ name: faraday
70
+ type: :development
71
+ prerelease: false
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ none: false
78
+ - !ruby/object:Gem::Dependency
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ none: false
85
+ name: happymapper
86
+ type: :development
87
+ prerelease: false
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ none: false
94
+ description: A ruby interface to Bestvoipreselling API
95
+ email:
96
+ - greg2502@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - Gemfile
103
+ - Guardfile
104
+ - LICENSE.txt
105
+ - README.md
106
+ - Rakefile
107
+ - bvr.gemspec
108
+ - lib/bvr.rb
109
+ - lib/bvr/call.rb
110
+ - lib/bvr/call_overview.rb
111
+ - lib/bvr/configuration.rb
112
+ - lib/bvr/connection.rb
113
+ - lib/bvr/phone.rb
114
+ - lib/bvr/version.rb
115
+ - spec/fixtures/CallOverview.xml
116
+ - spec/lib/bvr/call_overview_spec.rb
117
+ - spec/lib/bvr/configuration_spec.rb
118
+ - spec/lib/bvr/connection_spec.rb
119
+ - spec/lib/bvr_spec.rb
120
+ - spec/spec_helper.rb
121
+ homepage: ''
122
+ licenses:
123
+ - MIT
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ none: false
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ none: false
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 1.8.23
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: A ruby interface to Bestvoipreselling API
146
+ test_files:
147
+ - spec/fixtures/CallOverview.xml
148
+ - spec/lib/bvr/call_overview_spec.rb
149
+ - spec/lib/bvr/configuration_spec.rb
150
+ - spec/lib/bvr/connection_spec.rb
151
+ - spec/lib/bvr_spec.rb
152
+ - spec/spec_helper.rb
153
+ has_rdoc: