vermillion-client 1.0.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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.hound.yml +2 -0
  4. data/.rubocop.yml +320 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +26 -0
  7. data/README.md +55 -0
  8. data/Rakefile +10 -0
  9. data/bin/setup +7 -0
  10. data/bin/vermillion +16 -0
  11. data/doc/ChangeBranchTest.html +240 -0
  12. data/doc/ConfigurationTest.html +277 -0
  13. data/doc/CreateTest.html +240 -0
  14. data/doc/Gemfile.html +145 -0
  15. data/doc/Gemfile_lock.html +173 -0
  16. data/doc/README_md.html +216 -0
  17. data/doc/Rakefile.html +151 -0
  18. data/doc/UpdateTest.html +280 -0
  19. data/doc/Vermillion.html +272 -0
  20. data/doc/Vermillion/Cfg.html +362 -0
  21. data/doc/Vermillion/Controller.html +185 -0
  22. data/doc/Vermillion/Controller/Base.html +503 -0
  23. data/doc/Vermillion/Controller/Change.html +301 -0
  24. data/doc/Vermillion/Controller/Create.html +301 -0
  25. data/doc/Vermillion/Controller/Firstrun.html +256 -0
  26. data/doc/Vermillion/Controller/Status.html +308 -0
  27. data/doc/Vermillion/Controller/Update.html +326 -0
  28. data/doc/Vermillion/Helper.html +252 -0
  29. data/doc/Vermillion/Helper/ApiCommunication.html +307 -0
  30. data/doc/Vermillion/Helper/Endpoint.html +506 -0
  31. data/doc/Vermillion/Helper/Formatting.html +250 -0
  32. data/doc/Vermillion/Helper/Network.html +304 -0
  33. data/doc/Vermillion/Helper/Results.html +341 -0
  34. data/doc/Vermillion/Helper/Time.html +295 -0
  35. data/doc/Vermillion/Request.html +332 -0
  36. data/doc/Vermillion/Router.html +351 -0
  37. data/doc/Vermillion/Test.html +183 -0
  38. data/doc/Vermillion/Test/Base.html +260 -0
  39. data/doc/Vermillion/Utils.html +247 -0
  40. data/doc/bin/setup.html +147 -0
  41. data/doc/created.rid +33 -0
  42. data/doc/images/add.png +0 -0
  43. data/doc/images/arrow_up.png +0 -0
  44. data/doc/images/brick.png +0 -0
  45. data/doc/images/brick_link.png +0 -0
  46. data/doc/images/bug.png +0 -0
  47. data/doc/images/bullet_black.png +0 -0
  48. data/doc/images/bullet_toggle_minus.png +0 -0
  49. data/doc/images/bullet_toggle_plus.png +0 -0
  50. data/doc/images/date.png +0 -0
  51. data/doc/images/delete.png +0 -0
  52. data/doc/images/find.png +0 -0
  53. data/doc/images/loadingAnimation.gif +0 -0
  54. data/doc/images/macFFBgHack.png +0 -0
  55. data/doc/images/package.png +0 -0
  56. data/doc/images/page_green.png +0 -0
  57. data/doc/images/page_white_text.png +0 -0
  58. data/doc/images/page_white_width.png +0 -0
  59. data/doc/images/plugin.png +0 -0
  60. data/doc/images/ruby.png +0 -0
  61. data/doc/images/tag_blue.png +0 -0
  62. data/doc/images/tag_green.png +0 -0
  63. data/doc/images/transparent.png +0 -0
  64. data/doc/images/wrench.png +0 -0
  65. data/doc/images/wrench_orange.png +0 -0
  66. data/doc/images/zoom.png +0 -0
  67. data/doc/index.html +138 -0
  68. data/doc/js/darkfish.js +155 -0
  69. data/doc/js/jquery.js +4 -0
  70. data/doc/js/navigation.js +142 -0
  71. data/doc/js/search.js +94 -0
  72. data/doc/js/search_index.js +1 -0
  73. data/doc/js/searcher.js +228 -0
  74. data/doc/rdoc.css +595 -0
  75. data/doc/table_of_contents.html +255 -0
  76. data/doc/vermillion-client_gemspec.html +166 -0
  77. data/lib/client.rb +35 -0
  78. data/lib/client/config.rb +58 -0
  79. data/lib/client/controller.rb +68 -0
  80. data/lib/client/controller/change.rb +26 -0
  81. data/lib/client/controller/create.rb +26 -0
  82. data/lib/client/controller/firstrun.rb +30 -0
  83. data/lib/client/controller/status.rb +43 -0
  84. data/lib/client/controller/update.rb +26 -0
  85. data/lib/client/helper.rb +21 -0
  86. data/lib/client/helper/apicommunication.rb +78 -0
  87. data/lib/client/helper/endpoint.rb +61 -0
  88. data/lib/client/helper/formatting.rb +23 -0
  89. data/lib/client/helper/network.rb +54 -0
  90. data/lib/client/helper/results.rb +28 -0
  91. data/lib/client/helper/time.rb +33 -0
  92. data/lib/client/request.rb +22 -0
  93. data/lib/client/router.rb +56 -0
  94. data/lib/client/utils.rb +18 -0
  95. data/lib/client/version.rb +4 -0
  96. data/lib/test.rb +13 -0
  97. data/lib/test/base.rb +17 -0
  98. data/test/test_change_branch.rb +14 -0
  99. data/test/test_configuration.rb +21 -0
  100. data/test/test_create.rb +14 -0
  101. data/test/test_update.rb +24 -0
  102. data/vermillion-client.gemspec +23 -0
  103. metadata +201 -0
@@ -0,0 +1,23 @@
1
+ module Vermillion
2
+ module Helper
3
+ class Formatting
4
+ # Recursively symbolize keys in a hash
5
+ # Params:
6
+ # +h+:: The hash you want to symbolize
7
+ def symbolize(h)
8
+ case h
9
+ when Hash
10
+ Hash[
11
+ h.map do |k, v|
12
+ [k.respond_to?(:to_sym) ? k.to_sym : k, symbolize(v)]
13
+ end
14
+ ]
15
+ when Enumerable
16
+ h.map { |v| symbolize(v) }
17
+ else
18
+ h
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,54 @@
1
+ module Vermillion
2
+ module Helper
3
+ class Network
4
+ attr_accessor :config
5
+
6
+ # Perform a GET request to a specified URL
7
+ # Params:
8
+ # +url+:: The URL you want to hit
9
+ # +key+:: The authentication key to pass via headers to the URL
10
+ def get(url, key)
11
+ _request(url, :GET, key)
12
+ end
13
+
14
+ # Perform a POST request to a specified URL
15
+ # Params:
16
+ # +url+:: The URL you want to hit
17
+ # +key+:: The authentication key to pass via headers to the URL
18
+ def post(url, key)
19
+ _request(url, :POST, key)
20
+ end
21
+
22
+ private
23
+
24
+ # Create and send the HTTP request
25
+ # Params:
26
+ # +url+:: The URL you want to hit
27
+ # +type+:: The HTTP method to send
28
+ # +key+:: The authentication key to pass via headers to the URL
29
+ def _request(url, type, key)
30
+ url = URI(url)
31
+ type ||= :GET
32
+ req_path = "#{url.path}?#{url.query}"
33
+
34
+ if type == :GET
35
+ req = Net::HTTP::Get.new(req_path)
36
+ elsif type == :POST
37
+ req = Net::HTTP::Post.new(req_path)
38
+ end
39
+
40
+ req.add_field('X-Vermillion-Key', key)
41
+ req.add_field('Accept', 'application/json')
42
+ req.add_field('Cache-Control', 'no-cache')
43
+ req.add_field('From', @config.get(:user))
44
+ req.add_field('User-Agent', 'Vermillion Client 1.0')
45
+
46
+ res = Net::HTTP.new(url.host, url.port).start do |http|
47
+ http.request(req)
48
+ end
49
+
50
+ res
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,28 @@
1
+ module Vermillion
2
+ module Helper
3
+ class Results
4
+ attr_reader :bucket
5
+
6
+ # Create the Results object
7
+ def initialize
8
+ @bucket = []
9
+ @bucket
10
+ end
11
+
12
+ # Add a result for processing
13
+ # Params:
14
+ # +result+:: The value you want to store
15
+ def add(result)
16
+ @bucket.push(result)
17
+ result
18
+ end
19
+
20
+ # Check if all values match a specified value
21
+ # Params:
22
+ # +pass_value+:: What all values in the array should evaluate to
23
+ def should_eval_to(pass_value)
24
+ @bucket.all? == pass_value
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ module Vermillion
2
+ module Helper
3
+ class Time
4
+ # Human readable strings to represent the length between two time objects
5
+ # Params:
6
+ # +start+:: Start time object
7
+ # +finish+:: End time object
8
+ def self.human_readable(start, finish)
9
+ seconds = finish.to_f - start.to_f
10
+
11
+ if seconds < 60
12
+ "No time at all!"
13
+ else
14
+ minutes = (seconds / 60).round(1)
15
+ if minutes < 1
16
+ "#{minutes} minute"
17
+ else
18
+ "#{minutes} minutes"
19
+ end
20
+ end
21
+ end
22
+
23
+ # Use the following format for a given timestamp: "d/m/y @ H:M:S AM/PM"
24
+ # Params:
25
+ # +time+:: Optional time value, uses the current time if not provided,
26
+ # to format
27
+ def self.formatted(time = nil)
28
+ time = ::Time.now if time.nil?
29
+ time.strftime("%e/%-m/%Y @ %I:%M:%S%P")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ module Vermillion
2
+ class Request
3
+ attr_reader :controller, :command, :custom, :flags, :raw_flags, :param
4
+
5
+ # Create the request object, parse ARGV for values
6
+ def initialize
7
+ @controller = nil
8
+ @flags = ARGV.select { |f| f.start_with?('-') }.map { |f| f.split("=").map(&:to_sym) } || []
9
+ @raw_flags = ARGV.select { |f| f.start_with?('-') } || []
10
+
11
+ unless ARGV.empty?
12
+ @controller = ARGV[0].to_sym unless ARGV[0].start_with?('-')
13
+ @command = ARGV[1].to_sym unless ARGV[1].nil?
14
+
15
+ if ARGV.size > 2
16
+ @custom = ARGV[2..ARGV.size].select { |p| !p.start_with?('-') }.map(&:to_sym) || []
17
+ @param = ARGV[2]
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,56 @@
1
+ module Vermillion
2
+ class Router
3
+ # Create the router object
4
+ # Params:
5
+ # +config_instance+:: An instance of Vermillion::Cfg
6
+ def initialize(config_instance)
7
+ @config = config_instance
8
+ end
9
+
10
+ # Prepare for routing
11
+ def pre_exec
12
+ @request = Request.new
13
+
14
+ begin
15
+ # include the controller
16
+ require "client/controller/#{@request.controller}"
17
+ # include helpers
18
+ require "client/helper/#{@request.controller}" if File.exist? "client/helpers/#{@request.controller}"
19
+ rescue LoadError
20
+ Notify.error("Controller not found: #{@request.controller}")
21
+ end
22
+ end
23
+
24
+ # Perform command routing
25
+ def route
26
+ pre_exec
27
+
28
+ # Create object context and pass it the required command line arguments
29
+ begin
30
+ unless @request.controller.nil?
31
+ controller = Vermillion::Controller.const_get @request.controller.capitalize
32
+
33
+ # create an instance of the requested controller
34
+ context = controller.new(@config, @request)
35
+
36
+ if context.can_exec? @request.command
37
+ # Set things up
38
+ context.pre_exec
39
+
40
+ # Run the requested action
41
+ context.exec
42
+
43
+ # Run cleanup commands
44
+ context.post_exec
45
+ end
46
+ end
47
+ rescue NoMethodError => e
48
+ Notify.error(e.message)
49
+ rescue RuntimeError => e
50
+ Notify.error(e.message, show_time: false)
51
+ rescue NameError => e
52
+ Notify.error("#{e}\n#{e.backtrace.join("\n")}", show_time: false)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,18 @@
1
+ module Vermillion
2
+ class Utils
3
+ # Convert a hash to a query string
4
+ # Params:
5
+ # +args+:: Hash to convert
6
+ def self.to_query_string(args)
7
+ query_string = "?"
8
+
9
+ unless args.empty?
10
+ args.each_pair do |arg, val|
11
+ query_string += "#{arg}=#{val}"
12
+ end
13
+ end
14
+
15
+ query_string
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,4 @@
1
+ module Vermillion
2
+ # Program version
3
+ VERSION = '1.0.0'.freeze
4
+ end
data/lib/test.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'client'
2
+ require 'test/base'
3
+
4
+ module Vermillion
5
+ # Flag to determine if module is running in test mode
6
+ def self.test?
7
+ true
8
+ end
9
+
10
+ # Define Test namespace
11
+ module Test
12
+ end
13
+ end
data/lib/test/base.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'minitest/autorun'
2
+
3
+ module Vermillion
4
+ module Test
5
+ class Base < Minitest::Test
6
+ include Vermillion::Controller
7
+
8
+ # Struct to mock the actual Request object
9
+ MockRequest = Struct.new(:controller, :command, :param)
10
+
11
+ # Perform setup tasks
12
+ def setup
13
+ Notify.spit "Executing Tests (#{Time.now})"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ require "test"
2
+ require "client/controller/change"
3
+
4
+ class ChangeBranchTest < Vermillion::Test::Base
5
+ # Test changing a branch on one server
6
+ def test_change_branch_one
7
+ req = MockRequest.new(:change, :branch)
8
+ cfg = Vermillion::Cfg.new.populate_config
9
+
10
+ change = Change.new(cfg, req)
11
+
12
+ assert change.branch(:local, :master).zero?
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require "test"
2
+ require "client/controller/status"
3
+
4
+ class ConfigurationTest < Vermillion::Test::Base
5
+ # Test if the config file exists
6
+ def test_config_exist
7
+ path = File.expand_path("~/.vermillion.yml")
8
+
9
+ assert File.exist? path
10
+ end
11
+
12
+ # Test the default method
13
+ def test_default
14
+ req = MockRequest.new(:status, :default)
15
+ cfg = Vermillion::Cfg.new.populate_config
16
+
17
+ status = Status.new(cfg, req)
18
+
19
+ assert status.default.zero?
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ require "test"
2
+ require "client/controller/create"
3
+
4
+ class CreateTest < Vermillion::Test::Base
5
+ # Test the default method
6
+ def test_default
7
+ req = MockRequest.new(:create, :default, "test-sample-#{Time.now.to_i}")
8
+ cfg = Vermillion::Cfg.new.populate_config
9
+
10
+ create = Create.new(cfg, req)
11
+
12
+ assert create.one(:local, req.param).zero?
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ require "test"
2
+ require "client/controller/update"
3
+
4
+ class UpdateTest < Vermillion::Test::Base
5
+ # Test updating one server
6
+ def test_update_one
7
+ req = MockRequest.new(:update, :one, "local/vermillion-server")
8
+ cfg = Vermillion::Cfg.new.populate_config
9
+
10
+ status = Update.new(cfg, req)
11
+
12
+ assert status.one(req.param).zero?
13
+ end
14
+
15
+ # Test updating the config manifest on one server
16
+ def test_update_config
17
+ req = MockRequest.new(:update, :one, :local)
18
+ cfg = Vermillion::Cfg.new.populate_config
19
+
20
+ status = Update.new(cfg, req)
21
+
22
+ assert status.one(req.param).zero?
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'client/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'vermillion-client'
7
+ s.version = Vermillion::VERSION
8
+ s.date = '2015-07-03'
9
+ s.summary = 'Client for communicating with vermillion-server'
10
+ s.description = 'Deploy, rebuild, rollback git-managed websites'
11
+ s.authors = ['Ryan Priebe']
12
+ s.email = 'hello@ryanpriebe.com'
13
+ s.files = `git ls-files`.split($ORS)
14
+ s.homepage = 'http://rubygems.org/gems/vermillion-client'
15
+ s.license = 'MIT'
16
+ s.executables = 'vermillion'
17
+
18
+ s.add_runtime_dependency 'notifaction'
19
+ s.add_runtime_dependency 'mime-types'
20
+
21
+ s.add_development_dependency "bundler", "~> 1.10"
22
+ s.add_development_dependency "rake", "~> 10.0"
23
+ end
metadata ADDED
@@ -0,0 +1,201 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vermillion-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Priebe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: notifaction
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mime-types
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description: Deploy, rebuild, rollback git-managed websites
70
+ email: hello@ryanpriebe.com
71
+ executables:
72
+ - vermillion
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .hound.yml
78
+ - .rubocop.yml
79
+ - Gemfile
80
+ - Gemfile.lock
81
+ - README.md
82
+ - Rakefile
83
+ - bin/setup
84
+ - bin/vermillion
85
+ - doc/ChangeBranchTest.html
86
+ - doc/ConfigurationTest.html
87
+ - doc/CreateTest.html
88
+ - doc/Gemfile.html
89
+ - doc/Gemfile_lock.html
90
+ - doc/README_md.html
91
+ - doc/Rakefile.html
92
+ - doc/UpdateTest.html
93
+ - doc/Vermillion.html
94
+ - doc/Vermillion/Cfg.html
95
+ - doc/Vermillion/Controller.html
96
+ - doc/Vermillion/Controller/Base.html
97
+ - doc/Vermillion/Controller/Change.html
98
+ - doc/Vermillion/Controller/Create.html
99
+ - doc/Vermillion/Controller/Firstrun.html
100
+ - doc/Vermillion/Controller/Status.html
101
+ - doc/Vermillion/Controller/Update.html
102
+ - doc/Vermillion/Helper.html
103
+ - doc/Vermillion/Helper/ApiCommunication.html
104
+ - doc/Vermillion/Helper/Endpoint.html
105
+ - doc/Vermillion/Helper/Formatting.html
106
+ - doc/Vermillion/Helper/Network.html
107
+ - doc/Vermillion/Helper/Results.html
108
+ - doc/Vermillion/Helper/Time.html
109
+ - doc/Vermillion/Request.html
110
+ - doc/Vermillion/Router.html
111
+ - doc/Vermillion/Test.html
112
+ - doc/Vermillion/Test/Base.html
113
+ - doc/Vermillion/Utils.html
114
+ - doc/bin/setup.html
115
+ - doc/created.rid
116
+ - doc/images/add.png
117
+ - doc/images/arrow_up.png
118
+ - doc/images/brick.png
119
+ - doc/images/brick_link.png
120
+ - doc/images/bug.png
121
+ - doc/images/bullet_black.png
122
+ - doc/images/bullet_toggle_minus.png
123
+ - doc/images/bullet_toggle_plus.png
124
+ - doc/images/date.png
125
+ - doc/images/delete.png
126
+ - doc/images/find.png
127
+ - doc/images/loadingAnimation.gif
128
+ - doc/images/macFFBgHack.png
129
+ - doc/images/package.png
130
+ - doc/images/page_green.png
131
+ - doc/images/page_white_text.png
132
+ - doc/images/page_white_width.png
133
+ - doc/images/plugin.png
134
+ - doc/images/ruby.png
135
+ - doc/images/tag_blue.png
136
+ - doc/images/tag_green.png
137
+ - doc/images/transparent.png
138
+ - doc/images/wrench.png
139
+ - doc/images/wrench_orange.png
140
+ - doc/images/zoom.png
141
+ - doc/index.html
142
+ - doc/js/darkfish.js
143
+ - doc/js/jquery.js
144
+ - doc/js/navigation.js
145
+ - doc/js/search.js
146
+ - doc/js/search_index.js
147
+ - doc/js/searcher.js
148
+ - doc/rdoc.css
149
+ - doc/table_of_contents.html
150
+ - doc/vermillion-client_gemspec.html
151
+ - lib/client.rb
152
+ - lib/client/config.rb
153
+ - lib/client/controller.rb
154
+ - lib/client/controller/change.rb
155
+ - lib/client/controller/create.rb
156
+ - lib/client/controller/firstrun.rb
157
+ - lib/client/controller/status.rb
158
+ - lib/client/controller/update.rb
159
+ - lib/client/helper.rb
160
+ - lib/client/helper/apicommunication.rb
161
+ - lib/client/helper/endpoint.rb
162
+ - lib/client/helper/formatting.rb
163
+ - lib/client/helper/network.rb
164
+ - lib/client/helper/results.rb
165
+ - lib/client/helper/time.rb
166
+ - lib/client/request.rb
167
+ - lib/client/router.rb
168
+ - lib/client/utils.rb
169
+ - lib/client/version.rb
170
+ - lib/test.rb
171
+ - lib/test/base.rb
172
+ - test/test_change_branch.rb
173
+ - test/test_configuration.rb
174
+ - test/test_create.rb
175
+ - test/test_update.rb
176
+ - vermillion-client.gemspec
177
+ homepage: http://rubygems.org/gems/vermillion-client
178
+ licenses:
179
+ - MIT
180
+ metadata: {}
181
+ post_install_message:
182
+ rdoc_options: []
183
+ require_paths:
184
+ - lib
185
+ required_ruby_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ requirements: []
196
+ rubyforge_project:
197
+ rubygems_version: 2.0.14.1
198
+ signing_key:
199
+ specification_version: 4
200
+ summary: Client for communicating with vermillion-server
201
+ test_files: []