hivonic 0.2.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ce1271a2a7e8a46a17c6df3e796918f76d7df93c
4
+ data.tar.gz: a87587af4fabfebedb2254f8827da4ad79432668
5
+ SHA512:
6
+ metadata.gz: c7c968719506310322513f21a56eecf824cdfee320f3ccb3462d68349232981e568cfdc7f46e8654654dffe7f84a14feece64fa44a445086426b429bf685013c
7
+ data.tar.gz: d60377e3ea9145876fc06d2f26fae7ee9961b897e415c36f3467710e370427371fd1196a8bf9b93d93849de28687b0ecf3e2fef49960324149eaf41cbcb606b7
data/.envrc.example ADDED
@@ -0,0 +1 @@
1
+ PATH_add bin
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ .DS_Store
2
+ .bundle/
3
+ *.swp
4
+ *.swo
5
+ .idea
6
+ ~*
7
+ log/*
8
+ tmp/*
9
+ vendor/bundle
10
+ .tags
11
+ .gemtags
12
+ ctags*
13
+ *.sublime-*
14
+ *.gem
@@ -0,0 +1 @@
1
+ 2.1.4
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.1.4
5
+ cache: bundler
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ Hivonic Changelog
2
+ ===
3
+
4
+ 0.2.0
5
+ ---
6
+ * Added ability to specify match group index for regexp time capture
7
+ * Tweaked Gemfile and hivonic.gemspec
8
+ * Added unit tests and example files
9
+
10
+ 0.1.0
11
+ ---
12
+ * Basic functionality for cleaning up temporary tables
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :development do
4
+ gem 'pry', '~> 0.10.0'
5
+ end
6
+
7
+ group :test do
8
+ gem 'rake', '~> 10.4.0'
9
+ gem 'mocha', '~> 1.1.0'
10
+ gem 'shoulda-context', '~> 1.2.0'
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,24 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ coderay (1.1.0)
5
+ metaclass (0.0.4)
6
+ method_source (0.8.2)
7
+ mocha (1.1.0)
8
+ metaclass (~> 0.0.1)
9
+ pry (0.10.1)
10
+ coderay (~> 1.1.0)
11
+ method_source (~> 0.8.1)
12
+ slop (~> 3.4)
13
+ rake (10.4.2)
14
+ shoulda-context (1.2.1)
15
+ slop (3.6.0)
16
+
17
+ PLATFORMS
18
+ ruby
19
+
20
+ DEPENDENCIES
21
+ mocha (~> 1.1.0)
22
+ pry (~> 0.10.0)
23
+ rake (~> 10.4.0)
24
+ shoulda-context (~> 1.2.0)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Will Drew
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ hivonic
2
+ ========
3
+
4
+ Tonic oriented utilities for hive (Hive + Tonic => hivonic)
5
+
6
+ This tool requires tmp hive tables to include timestamp as part of the table name by convention.
7
+
8
+ ### Status
9
+ [![Build Status](https://travis-ci.org/willdrew/hivonic.svg?branch=master)](https://travis-ci.org/willdrew/hivonic)
10
+
11
+
12
+ ## Shell Environment Variables
13
+ - $HIVONIC_HIVE_OPTS
14
+ * Options passed to the hive client
15
+ * Defaults to '-S' # Silent
16
+ - $HIVONIC_REGEXP
17
+ * This is the regexp used to match tables and capture time from name
18
+ * Defaults to '\A(tmp|view)[a-z|_|0-9]+_(\d{14})\Z'
19
+ - $HIVONIC_TIME_FORMAT
20
+ * This is the time format used to parse the timestamp from the table name
21
+ * Defaults to '%Y%m%d%H%M%S'
22
+ - $HIVONIC_TIME_GROUP_INDEX
23
+ * Ability to specify match group index for regexp time capture
24
+ * Defaults to '2'
25
+ - $HIVONIC_TTL
26
+ * This is the Time-To-Live for Hive temporary tables
27
+ * Defaults to '86400' (24 hours)
28
+
29
+
30
+ ## Hadpuils' Commands
31
+ - list __db__
32
+ * Lists all tmp hive tables that match regexp and are expired
33
+ - rm __db__ __table__
34
+ * Removes specified table from specified db
35
+ - cleanup __db__
36
+ * Cleans up (removes) all tmp hive tables that match regexp and are expired
37
+
38
+
39
+ ### Example Usages
40
+ ``` shell
41
+ hivonic list default
42
+ hivonic cleanup default
43
+ hivonic rm default sometimestamp_sometable
44
+ ```
45
+
46
+
47
+ Credit [Ethan Rowe ](https://github.com/ethanrowe) for the original command handler technique in [hadupils](https://github.com/ethanrowe/hadupils).
data/Rakefile.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/clean'
4
+
5
+ Rake::TestTask.new do |task|
6
+ task.libs << %w(test lib)
7
+ task.pattern = 'test/unit/*_test.rb'
8
+ task.ruby_opts << '-rtest_helper'
9
+ end
10
+
11
+ task :default => :test
data/bin/hivonic ADDED
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # vim: set filetype=ruby:
4
+
5
+ require 'gli'
6
+ require 'hivonic'
7
+
8
+ include GLI::App
9
+ include Hivonic::Commands
10
+
11
+ version Hivonic::VERSION
12
+
13
+ program_desc 'A simple hive utility application for cleaning up temporary tables'
14
+
15
+ # arg_name 'database'
16
+
17
+ hive_opts = ENV['HIVONIC_HIVE_OPTS'] || '-S' # -hiveconf hive.root.logger=DEBUG -S
18
+ regexp = ENV['HIVONIC_REGEXP'] || '\A(tmp|view)[a-z|_|0-9]+_(\d{14})\Z'
19
+ time_format = ENV['HIVONIC_TIME_FORMAT'] || '%Y%m%d%H%M%S'
20
+ time_group_index = ENV['HIVONIC_TIME_GROUP_INDEX'] || 2
21
+ ttl = ENV['HIVONIC_TTL'] || 86400
22
+
23
+ flag ['hive-opts'], :default_value => hive_opts
24
+ flag ['regexp'], :default_value => regexp
25
+ flag ['time-format'], :default_value => time_format
26
+ flag ['time-group-index'], :default_value => time_group_index
27
+ flag ['ttl'], :default_value => ttl
28
+
29
+ # switch [:d, 'debug']
30
+ # switch [:v, 'verbose']
31
+ switch [:n, 'dry-run']
32
+
33
+ def database_check!(args)
34
+ exit_now!('No database given!') if args[0].nil? || args[0].empty?
35
+ end
36
+
37
+ def table_check!(args)
38
+ exit_now!('No table given!') if args[1].nil? || args[1].empty?
39
+ end
40
+
41
+ command :list do |c|
42
+ c.action do |global_options, options, args|
43
+ database_check!(args)
44
+ Hivonic::Commands.run 'list_tables', global_options, args
45
+ end
46
+ end
47
+
48
+ command :rm do |c|
49
+ c.action do |global_options, options, args|
50
+ database_check!(args)
51
+ table_check!(args)
52
+ Hivonic::Commands.run 'drop_table', global_options, args
53
+ end
54
+ end
55
+
56
+ command :cleanup do |c|
57
+ c.action do |global_options, options, args|
58
+ database_check!(args)
59
+ Hivonic::Commands.run 'cleanup_tables', global_options, args
60
+ end
61
+ end
62
+
63
+ exit run(ARGV)
data/hivonic.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require File.expand_path('../lib/hivonic/version', __FILE__)
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = 'hivonic'
7
+ gem.version = Hivonic::VERSION
8
+ gem.platform = Gem::Platform::RUBY
9
+ gem.authors = ['Will Drew']
10
+ gem.email = ['willdrew@gmail.com']
11
+ gem.summary = %q{Tonic oriented utilities for hive (Hive + Tonic => hivonic)}
12
+ gem.description = %q{Hivonic provides utilities for dealing with temporary hive tables}
13
+ gem.homepage = 'https://github.com/willdrew/hivonic'
14
+
15
+ gem.required_rubygems_version = '>= 1.3.6'
16
+ gem.required_ruby_version = ::Gem::Requirement.new('>= 1.9.3')
17
+
18
+ gem.add_dependency('gli', '~> 2.13.0')
19
+ gem.add_development_dependency('rake', '~> 10.4.0')
20
+ gem.add_development_dependency('bundler', '~> 1.7.0')
21
+ gem.add_development_dependency('pry', '~> 0.10.0')
22
+ gem.add_development_dependency('mocha', '~> 1.1.0')
23
+ gem.add_development_dependency('shoulda-context', '~> 1.2.0')
24
+
25
+ gem.files = `git ls-files`.split($\)
26
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
27
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
28
+
29
+ gem.require_paths = %w(lib)
30
+ end
@@ -0,0 +1,210 @@
1
+ require 'time'
2
+
3
+ using Hivonic::Common::StringHelper unless RUBY_VERSION < '2.0'
4
+
5
+ module Hivonic::Commands
6
+ def self.run(cmd, opts, args)
7
+ handler = handler_for cmd
8
+ output, exitstatus = handler.run opts, args
9
+
10
+ # Send Subcommand output to STDOUT
11
+ puts output
12
+
13
+ # Return exit status
14
+ exitstatus
15
+ end
16
+
17
+ def self.normalize_cmd(cmd)
18
+ cmd.to_s.downcase
19
+ end
20
+
21
+ def self.handler_for(cmd)
22
+ if @handlers
23
+ @handlers[normalize_cmd(cmd)]
24
+ else
25
+ raise 'Uh Oh!'
26
+ end
27
+ end
28
+
29
+ def self.register_handler_for(cmd, handler=nil)
30
+ normalized_cmd = normalize_cmd(cmd)
31
+ handler = Hivonic::Commands.const_get(normalized_cmd.classify) if handler.nil?
32
+
33
+ @handlers ||= {}
34
+ @handlers[normalized_cmd] = handler
35
+ end
36
+
37
+ class Subcommand
38
+ attr_reader :regexp
39
+ attr_reader :time_format
40
+ attr_reader :time_group_index
41
+ attr_reader :ttl
42
+ attr_reader :query
43
+ attr_reader :subcommand
44
+ attr_reader :dry_run
45
+ attr_reader :exitstatus
46
+
47
+ def initialize(opts, args)
48
+ @regexp = Regexp.new opts['regexp']
49
+ @time_format = opts['time-format']
50
+ @time_group_index = opts['time-group-index'].to_i
51
+ @ttl = opts['ttl'].to_i
52
+ @dry_run = opts['dry-run']
53
+ @exitstatus = 1
54
+ end
55
+
56
+ def self.run(opts, args)
57
+ output, exitstatus = self.new(opts, args).run
58
+ return output, exitstatus
59
+ end
60
+
61
+ def subcommand
62
+ @subcommand = nil
63
+ end
64
+
65
+ def output(stdout)
66
+ stdout
67
+ end
68
+
69
+ def run
70
+ raise "subcommand can't be nil" if subcommand.nil?
71
+
72
+ if dry_run
73
+ stdout = "DRY RUN: Subcommand => #{subcommand}"
74
+ @exitstatus = 0
75
+ else
76
+ stdout = `#{subcommand}`
77
+ @exitstatus = $?.exitstatus
78
+ end
79
+
80
+ return output(stdout), self.exitstatus
81
+ end
82
+
83
+ def successful?
84
+ self.exitstatus == 0
85
+ end
86
+
87
+ def is_successful?(status)
88
+ status == 0
89
+ end
90
+ end
91
+
92
+ class HiveQueryCommand < Subcommand
93
+ attr_reader :hive_opts
94
+ attr_reader :db
95
+
96
+ def initialize(opts, args)
97
+ super
98
+ @hive_opts = opts['hive-opts']
99
+ @db = args[0]
100
+ end
101
+
102
+ def query
103
+ @query = nil
104
+ end
105
+
106
+ def subcommand
107
+ @subcommand = "hive #{self.hive_opts} -e \"#{self.query}\""
108
+ end
109
+ end
110
+
111
+ class ListTables < HiveQueryCommand
112
+ def is_expired?(time)
113
+ (Time.now.utc - self.ttl) > time
114
+ end
115
+
116
+ def is_table_expired?(table)
117
+ match = table.match self.regexp
118
+
119
+ if match.nil?
120
+ false
121
+ else
122
+ is_expired? Time.strptime(match[self.time_group_index], self.time_format)
123
+ end
124
+ end
125
+
126
+ def filter(stdout)
127
+ lines = stdout.split(/\n/)
128
+
129
+ lines.select do |line|
130
+ is_table_expired? line
131
+ end.join("\n")
132
+ end
133
+
134
+ def output(stdout)
135
+ if dry_run
136
+ super
137
+ else
138
+ filter(stdout)
139
+ end
140
+ end
141
+
142
+ def query
143
+ @query = "USE #{self.db}; SHOW TABLES;"
144
+ end
145
+ end
146
+
147
+ register_handler_for :list_tables
148
+
149
+ class DropTable < HiveQueryCommand
150
+ attr_reader :table
151
+
152
+ def initialize(opts, args)
153
+ super
154
+ @table = args[1]
155
+ end
156
+
157
+ def query
158
+ @query = "DROP TABLE '#{self.db}.#{self.table}';"
159
+ end
160
+ end
161
+
162
+ register_handler_for :drop_table
163
+
164
+ class CleanupTables < HiveQueryCommand
165
+ def list_tables
166
+ opts = {}
167
+ opts['regexp'] = self.regexp
168
+ opts['time-format'] = self.time_format
169
+ opts['time-group-index'] = self.time_group_index
170
+ opts['ttl'] = self.ttl
171
+ opts['hive-opts'] = self.hive_opts
172
+
173
+ output, status = ListTables.run opts, [self.db]
174
+ raise 'Uh oh!' unless is_successful? status
175
+ output.split(/\n/)
176
+ end
177
+
178
+ def filter(tables)
179
+ tables.select do |table|
180
+ is_table_expired? table
181
+ end
182
+ end
183
+
184
+ def build_query
185
+ tables = list_tables
186
+
187
+ tables.map do |table|
188
+ opts = {}
189
+ opts['regexp'] = self.regexp
190
+
191
+ DropTable.new(opts, [self.db, table]).query
192
+ end.join(' ')
193
+ end
194
+
195
+ def query
196
+ @query = build_query
197
+ end
198
+
199
+ def subcommand
200
+ if self.query.nil? || self.query.empty?
201
+ puts 'Nothing to cleanup!'
202
+ Kernel.exit! 0
203
+ else
204
+ super
205
+ end
206
+ end
207
+ end
208
+
209
+ register_handler_for :cleanup_tables
210
+ end
@@ -0,0 +1,79 @@
1
+ if RUBY_VERSION < '2.0'
2
+ module Hivonic
3
+ module Common
4
+ module StringHelper
5
+ def randcase
6
+ dup.split('').map do |char|
7
+ if rand(1..10) > 5
8
+ char.upcase
9
+ else
10
+ char.downcase
11
+ end
12
+ end.join
13
+ end
14
+
15
+ def classify
16
+ self.split('_').collect(&:capitalize).join
17
+ end
18
+
19
+ def underscore
20
+ self.gsub(/::/, '/').
21
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
22
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
23
+ tr("-", "_").
24
+ downcase
25
+ end
26
+
27
+ def titleize
28
+ self.gsub(/\b('?[a-z])/) { $1.capitalize }
29
+ end
30
+
31
+ def titleize_words
32
+ self.gsub(/\w+/) { |s| s.capitalize }
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ class String
39
+ include Hivonic::Common::StringHelper
40
+ end
41
+ else
42
+ module Hivonic
43
+ module Common
44
+ module StringHelper
45
+ refine ::String do
46
+ def randcase
47
+ dup.split('').map do |char|
48
+ if rand(1..10) > 5
49
+ char.upcase
50
+ else
51
+ char.downcase
52
+ end
53
+ end.join
54
+ end
55
+
56
+ def classify
57
+ self.split('_').collect(&:capitalize).join
58
+ end
59
+
60
+ def underscore
61
+ self.gsub(/::/, '/').
62
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
63
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
64
+ tr("-", "_").
65
+ downcase
66
+ end
67
+
68
+ def titleize
69
+ self.gsub(/\b('?[a-z])/) { $1.capitalize }
70
+ end
71
+
72
+ def titleize_words
73
+ self.gsub(/\w+/) { |s| s.capitalize }
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,3 @@
1
+ module Hivonic
2
+ VERSION = '0.2.0'
3
+ end
data/lib/hivonic.rb ADDED
@@ -0,0 +1,10 @@
1
+ # Common
2
+ require 'hivonic/common/string_helper'
3
+
4
+ # Hivonic
5
+ require 'hivonic/version'
6
+ require 'hivonic/commands'
7
+
8
+ module Hivonic
9
+
10
+ end
@@ -0,0 +1,4 @@
1
+ require 'test/unit'
2
+ require 'shoulda-context'
3
+ require 'mocha/setup'
4
+ require 'hivonic'
@@ -0,0 +1,89 @@
1
+ using Hivonic::Common::StringHelper unless RUBY_VERSION < '2.0'
2
+
3
+ class Hivonic::CommandsTest < Test::Unit::TestCase
4
+ context Hivonic::Commands do
5
+ context 'run singleton method' do
6
+ should 'pass opts and args to #run method of the handler' do
7
+ Hivonic::Commands.expects(:handler_for).with(cmd = mock()).returns(handler = mock())
8
+ handler.expects(:run).with(opts = mock(), args = mock()).returns([output = mock(), exitstatus = mock()])
9
+ assert_equal exitstatus, Hivonic::Commands.run(cmd, opts, args)
10
+ end
11
+ end
12
+ end
13
+
14
+ context 'list tables' do
15
+ setup do
16
+ @klass = Hivonic::Commands::ListTables
17
+ end
18
+
19
+ should 'register with :list_tables' do
20
+ handlers = [:list_tables]
21
+ handlers.each do |handler|
22
+ Hivonic::Commands.register_handler_for handler
23
+ end
24
+ run_handler_assertions_for handlers
25
+ end
26
+
27
+ should 'have a #run singleton method that dispatches to an instance #run' do
28
+ opts = mock()
29
+ args = mock()
30
+ @klass.expects(:new).with(opts, args).returns(instance = mock())
31
+ instance.expects(:run).with.returns([output = mock(), exitstatus = mock()])
32
+ assert_equal [output, exitstatus], @klass.run(opts, args)
33
+ end
34
+ end
35
+
36
+ context 'drop table' do
37
+ setup do
38
+ @klass = Hivonic::Commands::DropTable
39
+ end
40
+
41
+ should 'register with :drop_table' do
42
+ handlers = [:drop_table]
43
+ handlers.each do |handler|
44
+ Hivonic::Commands.register_handler_for handler
45
+ end
46
+ run_handler_assertions_for handlers
47
+ end
48
+
49
+ should 'have a #run singleton method that dispatches to an instance #run' do
50
+ opts = mock()
51
+ args = mock()
52
+ @klass.expects(:new).with(opts, args).returns(instance = mock())
53
+ instance.expects(:run).with.returns([output = mock(), exitstatus = mock()])
54
+ assert_equal [output, exitstatus], @klass.run(opts, args)
55
+ end
56
+ end
57
+
58
+ context 'cleanup tables' do
59
+ setup do
60
+ @klass = Hivonic::Commands::CleanupTables
61
+ end
62
+
63
+ should 'register with :cleanup_tables' do
64
+ handlers = [:cleanup_tables]
65
+ handlers.each do |handler|
66
+ Hivonic::Commands.register_handler_for handler
67
+ end
68
+ run_handler_assertions_for handlers
69
+ end
70
+
71
+ should 'have a #run singleton method that dispatches to an instance #run' do
72
+ opts = mock()
73
+ args = mock()
74
+ @klass.expects(:new).with(opts, args).returns(instance = mock())
75
+ instance.expects(:run).with.returns([output = mock(), exitstatus = mock()])
76
+ assert_equal [output, exitstatus], @klass.run(opts, args)
77
+ end
78
+ end
79
+
80
+ def run_handler_assertions_for(handlers)
81
+ handlers.each do |handler|
82
+ handler = handler.to_s.downcase
83
+ assert_same @klass, Hivonic::Commands.handler_for(handler.to_sym)
84
+ assert_same @klass, Hivonic::Commands.handler_for(handler.randcase.to_sym)
85
+ assert_same @klass, Hivonic::Commands.handler_for(handler)
86
+ assert_same @klass, Hivonic::Commands.handler_for(handler.randcase)
87
+ end
88
+ end
89
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hivonic
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Will Drew
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gli
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.13.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.13.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 10.4.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 10.4.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.7.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.7.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.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: 0.10.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: mocha
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.1.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.1.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: shoulda-context
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.2.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.2.0
97
+ description: Hivonic provides utilities for dealing with temporary hive tables
98
+ email:
99
+ - willdrew@gmail.com
100
+ executables:
101
+ - hivonic
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".envrc.example"
106
+ - ".gitignore"
107
+ - ".ruby-version.example"
108
+ - ".travis.yml"
109
+ - CHANGELOG.md
110
+ - Gemfile
111
+ - Gemfile.lock
112
+ - LICENSE
113
+ - README.md
114
+ - Rakefile.rb
115
+ - bin/hivonic
116
+ - hivonic.gemspec
117
+ - lib/hivonic.rb
118
+ - lib/hivonic/commands.rb
119
+ - lib/hivonic/common/string_helper.rb
120
+ - lib/hivonic/version.rb
121
+ - test/test_helper.rb
122
+ - test/unit/commands_test.rb
123
+ homepage: https://github.com/willdrew/hivonic
124
+ licenses: []
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 1.9.3
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: 1.3.6
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.2.2
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Tonic oriented utilities for hive (Hive + Tonic => hivonic)
146
+ test_files:
147
+ - test/test_helper.rb
148
+ - test/unit/commands_test.rb