random_org_http_api 0.0.3.1 → 0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87cf6a543500185e6d40cf14dca165293ab0a10a
4
- data.tar.gz: 20ed9d531372a7d75c311091b441f3bd77c4d021
3
+ metadata.gz: a71dd4b3a01bcce935056f7297cdd5169a9fadfb
4
+ data.tar.gz: f0fa6046ae5de636309b22bc4cbdaadc3fc0b41c
5
5
  SHA512:
6
- metadata.gz: 5ee6fccefdb7e4d2ad4bfe3bb51f971614321323876100ca50d81af235935fd9d5bde4131856e2c06d61f5dd9d1cf23766ebebf31d0a5fcf33f33315d80d04ab
7
- data.tar.gz: 36aafa91b88db009501db467309e9fd148660bd83244d5f7109f18c7ade44990ab6ba3741c98dbaf8add1be3387bbdad76c4527095906cb7a5c8fd6d86e9fc77
6
+ metadata.gz: b01e9036de8feb91009704e5ff888b158b767bebd20c019d0fb8a887c232229967f265d1b4942bbaef638bd1c12a337f189146e46d3697eda114d5d4e75c429b
7
+ data.tar.gz: 1b3fb96d3e30229705f7968be11564623884d6fb42ccc490062adf5e986a81ba91c77a39631a4336ca96f5efd53b2a9d29b59d5cab7826934b9bb1bebdd38238
data/Gemfile CHANGED
@@ -1,9 +1,9 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in random_org_http_api.gemspec
4
3
  gemspec
5
4
 
6
5
  group :test do
7
- gem 'simplecov', :require => false
6
+ gem 'simplecov', require: false
8
7
  gem 'coveralls', require: false
9
- end
8
+ gem 'rubocop', require: false
9
+ end
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
2
 
3
3
  require 'rspec/core/rake_task'
4
4
 
5
5
  RSpec::Core::RakeTask.new('spec')
6
6
 
7
- task :default => :spec
7
+ task default: :spec
@@ -1,30 +1,32 @@
1
1
  module RandomOrgHttpApi
2
2
  module Configuration
3
- DOMAIN = 'https://www.random.org'
4
- DEFAULT_QUERY_PARAMS = {
5
- format: 'plain',
6
- base: '10',
7
- rnd: 'new',
8
- col: '1',
9
- min: '1',
10
- digits: 'on',
11
- loweralpha: 'on',
12
- upperalpha: 'on',
13
- unique: 'on'
14
- }
15
-
16
- # Query templates
17
- # Integer
18
- INTEGER_QUERY_KEYS = [:num, :min, :max, :col, :base, :format, :rnd]
19
- INTEGER_QUERY_TEMPLATE = "integers/?num=%{num}&min=%{min}&max=%{max}&col=%{col}&base=%{base}&format=%{format}&rnd=%{rnd}"
3
+ BASE_URI = 'https://www.random.org'.freeze
20
4
 
21
- # String
22
- STRING_QUERY_KEYS = [:num, :len, :digits, :upperalpha, :loweralpha, :unique, :format, :rnd]
23
- STRING_QUERY_TEMPLATE = "strings/?num=%{num}&len=%{len}&digits=%{digits}&upperalpha=%{upperalpha}&loweralpha=%{loweralpha}&unique=%{unique}&format=%{format}&rnd=%{rnd}"
24
-
25
- # Sequence
26
- SEQUENCE_QUERY_KEYS = [:min, :max, :col, :format, :rnd]
27
- SEQUENCE_QUERY_TEMPLATE = "sequences/?min=%{min}&max=%{max}&col=%{col}&format=%{format}&rnd=%{rnd}"
5
+ DEFAULT_QUERY_PARAMS = {
6
+ format: 'plain',
7
+ base: '10',
8
+ rnd: 'new',
9
+ col: '1',
10
+ min: '1',
11
+ digits: 'on',
12
+ loweralpha: 'on',
13
+ upperalpha: 'on',
14
+ unique: 'on'
15
+ }.freeze
28
16
 
17
+ QUERY_TEMPLATE = {
18
+ integer: {
19
+ path: '/integers',
20
+ query_keys: [:num, :min, :max, :col, :base, :format, :rnd]
21
+ },
22
+ string: {
23
+ path: '/strings',
24
+ query_keys: [:num, :len, :digits, :upperalpha, :loweralpha, :unique, :format, :rnd]
25
+ },
26
+ sequence: {
27
+ path: '/sequences',
28
+ query_keys: [:min, :max, :col, :format, :rnd]
29
+ }
30
+ }.freeze
29
31
  end
30
- end
32
+ end
@@ -0,0 +1,12 @@
1
+ module RandomOrgHttpApi
2
+ module Error
3
+ class QuotaError < StandardError
4
+ def message
5
+ 'Quota is over. Please try again later.'
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+
12
+
@@ -1,76 +1,73 @@
1
+ require 'open-uri'
2
+
1
3
  module RandomOrgHttpApi
2
4
  class Generator
3
- require 'net/http'
4
5
  include RandomOrgHttpApi::Configuration
5
-
6
- def generate_integers(params = {})
7
- integers_query = query('integer', params)
8
- request(DOMAIN, integers_query)
6
+ include RandomOrgHttpApi::Error
7
+
8
+ def generate_integers(params)
9
+ generate(:integer, params)
9
10
  end
10
11
 
11
- def generate_strings(params = {})
12
- strings_query = query('string', params)
13
- request(DOMAIN, strings_query)
12
+ def generate_strings(params)
13
+ generate(:string, params)
14
14
  end
15
15
 
16
- def generate_sequence(params = {})
17
- sequence_query = query('sequence', params)
18
- request(DOMAIN, sequence_query)
16
+ def generate_sequence(params)
17
+ generate(:sequence, params)
19
18
  end
20
19
 
21
- # Quota Checker
22
20
  def quota
23
- quota_query = "quota/?ip=#{ip}&format=plain"
24
- request(DOMAIN, quota_query).first.to_i
21
+ params = { path: '/quota', params: { ip: ip, format: 'plain' } }
22
+ api_request(params).first.to_i
23
+ end
24
+
25
+ def ip
26
+ request(uri: 'http://whatismyip.akamai.com').strip
25
27
  end
26
28
 
27
29
  private
28
30
 
29
- # Метод запроса на сайт random.org
30
- def request(domain, query)
31
- # Создаем запрос
32
- uri = URI.join(domain, query)
33
- http = Net::HTTP.new(uri.host, uri.port)
34
- http.use_ssl = true
35
- res = http.get(uri.request_uri)
36
- # Если все хорошо, то возвращаем форматированный ответ,
37
- # если нет, то показываем ответ ошибки сервера.
38
- res.is_a?(Net::HTTPSuccess) ? res.body.split : res.body.strip
31
+ def generate(type, params = {})
32
+ params = query(type, params)
33
+ api_request(params)
39
34
  end
40
35
 
41
- # Метод для генерации запроса
42
- def query(object_type, params)
43
- # Совмещаем параметры по умолчанию с параметами, который передал пользователь
44
- all_params = DEFAULT_QUERY_PARAMS.merge(params)
45
- # В зависимости от типа объекта, который нужно сгенерировать, оставляем только нужные для него параметры.
46
- case object_type
47
- when 'integer' then
48
- right_params = permit_params(all_params, INTEGER_QUERY_KEYS)
49
- insert_params(right_params, INTEGER_QUERY_TEMPLATE)
50
- when 'string' then
51
- right_params = permit_params(all_params, STRING_QUERY_KEYS)
52
- insert_params(right_params, STRING_QUERY_TEMPLATE)
53
- when 'sequence' then
54
- right_params = permit_params(all_params, SEQUENCE_QUERY_KEYS)
55
- insert_params(right_params, SEQUENCE_QUERY_TEMPLATE)
56
- end
36
+ def api_request(hash)
37
+ request(uri: URI(BASE_URI), path: hash[:path], query: hash[:params]).split
57
38
  end
58
39
 
59
- # Метод оставляющий только нужные параметры.
60
- def permit_params(params, required_keys)
61
- params.select { |k| required_keys.include?(k) }
62
- end
63
40
 
64
- # Метод подстановки параметров в темплейт.
65
- # Параметры должны передаваться в хеше
66
- def insert_params(params, template)
67
- template % params
41
+ def request(params)
42
+ uri = URI params[:uri]
43
+ uri.path = params[:path] if params[:path]
44
+ uri.query = URI.encode_www_form(params[:query]) if params[:query]
45
+
46
+ exception_cb = Proc.new do |exception|
47
+ puts exception
48
+ end
49
+
50
+ Retryable.retryable(tries: 3, on: OpenURI::HTTPError, exception_cb: exception_cb) do |retries, exception|
51
+ if retries > 1
52
+ raise QuotaError if quota == 0
53
+ end
54
+ open(uri).read
55
+ end
68
56
  end
69
57
 
70
- def ip
71
- uri = URI('http://whatismyip.akamai.com')
72
- Net::HTTP.get(uri)
58
+
59
+ def query(generator_type, params)
60
+ all_params = DEFAULT_QUERY_PARAMS.merge(params)
61
+ template = QUERY_TEMPLATE[generator_type]
62
+
63
+ {
64
+ path: template[:path],
65
+ params: permit_params(all_params, template[:query_keys])
66
+ }
73
67
  end
74
68
 
69
+ def permit_params(params, required_keys)
70
+ params.select { |k| required_keys.include?(k) }
71
+ end
75
72
  end
76
- end
73
+ end
@@ -1,3 +1,3 @@
1
1
  module RandomOrgHttpApi
2
- VERSION = "0.0.3.1"
2
+ VERSION = '0.1.alpha'.freeze
3
3
  end
@@ -1,5 +1,6 @@
1
- require "random_org_http_api/version"
2
- require "random_org_http_api/configuration"
3
- require "random_org_http_api/generator"
1
+ require 'random_org_http_api/version'
2
+ require 'random_org_http_api/error'
3
+ require 'random_org_http_api/configuration'
4
+ require 'random_org_http_api/generator'
4
5
 
5
- module RandomOrgHttpApi;end
6
+ module RandomOrgHttpApi; end
@@ -4,21 +4,20 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'random_org_http_api/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "random_org_http_api"
8
- spec.version = RandomOrgHttpApi::VERSION
9
- spec.authors = ["Temur Fatkulin"]
10
- spec.email = ["temur.fatkulin@gmail.com"]
11
- spec.summary = %q{Realization of old HTTP API provided by the random.org service}
12
- spec.description = %q{At present realized generation for numbers, strings and sequences}
13
- spec.homepage = "https://github.com/istickz/random_org_http_api"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0")
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.6"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec"
7
+ spec.name = 'random_org_http_api'
8
+ spec.version = RandomOrgHttpApi::VERSION
9
+ spec.authors = ['Temur Fatkulin']
10
+ spec.email = ['temur.fatkulin@gmail.com']
11
+ spec.summary = 'Realization of old HTTP API provided by the random.org service'
12
+ spec.description = 'At present realized generation for numbers, strings and sequences'
13
+ spec.homepage = 'https://github.com/istickz/random_org_http_api'
14
+ spec.license = 'MIT'
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+ spec.add_dependency 'retryable'
20
+ spec.add_development_dependency 'bundler', '~> 1.6'
21
+ spec.add_development_dependency 'rake'
22
+ spec.add_development_dependency 'rspec'
24
23
  end
@@ -1,63 +1,77 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
  describe RandomOrgHttpApi::Generator do
3
3
 
4
4
  before(:all) do
5
5
  @generator = RandomOrgHttpApi::Generator.new
6
6
  end
7
7
 
8
- describe '#insert_params' do
9
- it 'should do insert params in string' do
10
- params = {name: 'World'}
11
- string = 'Hello %{name}'
12
- expect(@generator.send(:insert_params, params, string)).to eq('Hello World')
13
- end
14
- end
15
-
16
8
  describe '#permit_params' do
17
9
  it 'should do permit only required params' do
18
- params = {a: 'A', b: 'B', c: 'C'}
10
+ input_params = { a: 'A', b: 'B', c: 'C' }
19
11
  required_keys = [:a, :b]
20
- expect(@generator.send(:permit_params, params, required_keys)).to eq({a: 'A', b: 'B'})
12
+ output_params = { a: 'A', b: 'B' }
13
+ expect(@generator.send(:permit_params, input_params, required_keys)).to eq(output_params)
21
14
  end
22
15
  end
23
16
 
24
17
  describe '#query' do
25
- it 'should do generate right query for integer' do
26
- object_type = 'integer'
27
- params = {num: 4, max: 100}
28
- right_query = 'integers/?num=4&min=1&max=100&col=1&base=10&format=plain&rnd=new'
29
- expect(@generator.send(:query, object_type, params)).to eq(right_query)
30
- end
18
+ it 'should do generate right params for integer' do
19
+ generator_type = :integer
20
+ input_params = { num: 4, max: 100 }
21
+ output_params =
22
+ {
23
+ path: '/integers',
24
+ params: {
25
+ format: 'plain',
26
+ base: '10',
27
+ rnd: 'new',
28
+ col: '1',
29
+ min: '1',
30
+ num: 4,
31
+ max: 100
32
+ }
33
+ }
31
34
 
32
- it 'should do generate right query for string' do
33
- object_type = 'string'
34
- params = {min: 1, max: 10, num: 3, len: 5}
35
- right_query = 'strings/?num=3&len=5&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new'
36
- expect(@generator.send(:query, object_type, params)).to eq(right_query)
35
+ expect(@generator.send(:query, generator_type, input_params)).to eq(output_params)
37
36
  end
38
37
 
39
- it 'should do generate right query for sequence' do
40
- object_type = 'sequence'
41
- params = {num: 5, len: 10, max: 10}
42
- right_query = 'sequences/?min=1&max=10&col=1&format=plain&rnd=new'
43
- expect(@generator.send(:query, object_type, params)).to eq(right_query)
44
- end
45
- end
38
+ it 'should do generate right params for string' do
39
+ generator_type = :string
40
+ input_params = { min: 1, max: 10, num: 3, len: 5 }
46
41
 
47
- describe '#request' do
48
- domain = 'https://www.random.org'
42
+ output_params = {
43
+ path: '/strings',
44
+ params: {
45
+ format: 'plain',
46
+ rnd: 'new',
47
+ digits: 'on',
48
+ loweralpha: 'on',
49
+ upperalpha: 'on',
50
+ unique: 'on',
51
+ num: 3,
52
+ len: 5
53
+ }
54
+ }
49
55
 
50
- it 'should do return string with error message if request have bad response' do
51
- bad_query = 'strings/?num=HelloWorld&len=5&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new'
52
- expect(@generator.send(:request, domain, bad_query).class).to eq(String)
56
+ expect(@generator.send(:query, generator_type, input_params)).to eq(output_params)
53
57
  end
54
58
 
55
- it 'should do return array if request have good response' do
56
- if @generator.quota > 0
57
- good_query = 'strings/?num=3&len=5&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new'
58
- expect(@generator.send(:request, domain, good_query).class).to eq(Array)
59
- end
59
+ it 'should do generate right params for sequence' do
60
+ generator_type = :sequence
61
+ input_params = { num: 5, len: 10, max: 10 }
62
+
63
+ output_params = {
64
+ path: '/sequences',
65
+ params: {
66
+ format: 'plain',
67
+ rnd: 'new',
68
+ col: '1',
69
+ min: '1',
70
+ max: 10
71
+ }
72
+ }
73
+
74
+ expect(@generator.send(:query, generator_type, input_params)).to eq(output_params)
60
75
  end
61
76
  end
62
-
63
77
  end
data/spec/spec_helper.rb CHANGED
@@ -2,9 +2,9 @@ require 'simplecov'
2
2
  require 'coveralls'
3
3
 
4
4
  SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
- SimpleCov::Formatter::HTMLFormatter,
6
- Coveralls::SimpleCov::Formatter
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
7
  ]
8
8
  SimpleCov.start
9
9
 
10
- require File.expand_path("../../lib/random_org_http_api", __FILE__)
10
+ require File.expand_path('../../lib/random_org_http_api', __FILE__)
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: random_org_http_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3.1
4
+ version: 0.1.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Temur Fatkulin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-18 00:00:00.000000000 Z
11
+ date: 2016-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: retryable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -69,6 +83,7 @@ files:
69
83
  - Rakefile
70
84
  - lib/random_org_http_api.rb
71
85
  - lib/random_org_http_api/configuration.rb
86
+ - lib/random_org_http_api/error.rb
72
87
  - lib/random_org_http_api/generator.rb
73
88
  - lib/random_org_http_api/version.rb
74
89
  - random_org_http_api.gemspec
@@ -89,12 +104,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
104
  version: '0'
90
105
  required_rubygems_version: !ruby/object:Gem::Requirement
91
106
  requirements:
92
- - - ">="
107
+ - - ">"
93
108
  - !ruby/object:Gem::Version
94
- version: '0'
109
+ version: 1.3.1
95
110
  requirements: []
96
111
  rubyforge_project:
97
- rubygems_version: 2.4.5.1
112
+ rubygems_version: 2.5.1
98
113
  signing_key:
99
114
  specification_version: 4
100
115
  summary: Realization of old HTTP API provided by the random.org service