geohash36 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS.md +29 -0
  3. data/CHANGELOG.md +0 -0
  4. data/COPYING.md +12 -0
  5. data/Gemfile +107 -0
  6. data/LICENSE.md +14 -0
  7. data/MAINTAINERS.md +40 -0
  8. data/README.md +78 -0
  9. data/Rakefile +52 -0
  10. data/bin/geohash36 +45 -0
  11. data/geohash36.gemspec +136 -0
  12. data/lib/demo.rb +25 -0
  13. data/lib/geohash36/interface/rake/cucumber.rb +36 -0
  14. data/lib/geohash36/interface/rake/default.rb +28 -0
  15. data/lib/geohash36/interface/rake/documentation.rb +46 -0
  16. data/lib/geohash36/interface/rake/guard.rb +13 -0
  17. data/lib/geohash36/interface/rake/helpers.rb +27 -0
  18. data/lib/geohash36/interface/rake/library.rb +126 -0
  19. data/lib/geohash36/interface/rake/metric.rb +13 -0
  20. data/lib/geohash36/interface/rake/rspec.rb +8 -0
  21. data/lib/geohash36/interface/thor/info.thor +292 -0
  22. data/lib/geohash36/interface/thor/mixin/config_choice.rb +27 -0
  23. data/lib/geohash36/interface/thor/mixin/configuration.rb +28 -0
  24. data/lib/geohash36/interface/thor/mixin/default.rb +30 -0
  25. data/lib/geohash36/interface/thor/mixin/default_config.rb +31 -0
  26. data/lib/geohash36/interface/thor/mixin/guess.rb +57 -0
  27. data/lib/geohash36/interface/thor/mixin/logger.rb +43 -0
  28. data/lib/geohash36/interface/thor/mixin/shell.rb +225 -0
  29. data/lib/geohash36/interface/thor/version.thor +33 -0
  30. data/lib/geohash36/library/interval.rb +130 -0
  31. data/lib/geohash36/version.rb +13 -0
  32. data/lib/geohash36.rb +164 -0
  33. data/spec/geohash36_spec.rb +52 -0
  34. data/spec/library/interval_spec.rb +55 -0
  35. data/spec/spec_helper.rb +55 -0
  36. metadata +281 -0
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # System
5
+ require 'shellwords'
6
+ require 'fileutils'
7
+
8
+ require 'date'
9
+ require 'ostruct'
10
+
11
+
12
+
13
+ ### Actions
14
+
15
+ desc "Look for TODO and FIXME tags in the code" # {{{
16
+ task :todo do
17
+ egrep /(FIXME|TODO|TBD|FIXME1|FIXME2|FIXME3)/
18
+ end # }}}
19
+
20
+ desc "Git Tag number of this repo" # {{{
21
+ task :version do |t|
22
+ # sh 'git describe --abbrev=0 --tags'
23
+ sh 'git describe --tags'
24
+ end # }}}
25
+
26
+
27
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # System
5
+ require 'shellwords'
6
+ require 'fileutils'
7
+
8
+ require 'date'
9
+ require 'ostruct'
10
+
11
+
12
+ ### Helper Functions
13
+
14
+ # @fn def egrep(pattern) # {{{
15
+ # @brief Searches for a given regular expression among all ruby files
16
+ #
17
+ # @param [Regexp] pattern Regular Expression pattern class
18
+ def egrep( pattern )
19
+
20
+ Dir[ "**/*.{rb,thor,rake}" ].each do |fn|
21
+ count = 0
22
+ open(fn) do |f|
23
+
24
+ while line = f.gets
25
+ count += 1
26
+ STDOUT.puts "#{fn}:#{count}:#{line}" if line =~ pattern
27
+ end
28
+
29
+ end # end of open
30
+ end # end of Dir.each
31
+
32
+ end # }}}
33
+
34
+ # @fn def clean target # {{{
35
+ # @brief Clean thrift output from folder
36
+ #
37
+ # @param [String] target Target folder to clean
38
+ def clean target
39
+
40
+ files = Dir.glob( File.join( target, "*" ) )
41
+
42
+ files.each do |file|
43
+ print "(--) "
44
+ sh "rm -vrf #{file.to_s}" if( File.exists?( "#{file.to_s}" ) )
45
+ end
46
+
47
+ end # }}}
48
+
49
+ # @fn def colorize color, message {{{
50
+ # @brief The function colorize takes a message and wraps it into standard color commands such as for bash.
51
+ #
52
+ # @param [String] color The colorname in plain english. e.g. "LightGray", "Gray", "Red", "BrightRed"
53
+ # @param [String] message The message which should be wrapped
54
+ #
55
+ # @return [String] Colorized message string
56
+ #
57
+ # @warning Might not work for your terminal
58
+ #
59
+ # FIXME: Implement bold behavior
60
+ # FIXME: This method is currently b0rked
61
+ def colorize color, message
62
+
63
+ # Black 0;30 Dark Gray 1;30
64
+ # Blue 0;34 Light Blue 1;34
65
+ # Green 0;32 Light Green 1;32
66
+ # Cyan 0;36 Light Cyan 1;36
67
+ # Red 0;31 Light Red 1;31
68
+ # Purple 0;35 Light Purple 1;35
69
+ # Brown 0;33 Yellow 1;33
70
+ # Light Gray 0;37 White 1;37
71
+
72
+ colors = {
73
+ "Gray" => "\e[1;30m",
74
+ "LightGray" => "\e[0;37m",
75
+ "Cyan" => "\e[0;36m",
76
+ "LightCyan" => "\e[1;36m",
77
+ "Blue" => "\e[0;34m",
78
+ "LightBlue" => "\e[1;34m",
79
+ "Green" => "\e[0;32m",
80
+ "LightGreen" => "\e[1;32m",
81
+ "Red" => "\e[0;31m",
82
+ "LightRed" => "\e[1;31m",
83
+ "LightRedBlink" => "\e[5;31m",
84
+ "Purple" => "\e[0;35m",
85
+ "LightPurple" => "\e[1;35m",
86
+ "Brown" => "\e[0;33m",
87
+ "Yellow" => "\e[1;33m",
88
+ "White" => "\e[1;37m"
89
+ }
90
+ nocolor = "\e[0m"
91
+
92
+ colors[ color ] + message + nocolor
93
+ end # of def colorize }}}
94
+
95
+ # @fn def message level, msg {{{
96
+ # @brief The function message will take a message as argument as well as a level (e.g. "info", "ok", "error", "question", "debug") which then would print
97
+ # ( "(--) msg..", "(II) msg..", "(EE) msg..", "(??) msg..")
98
+ #
99
+ # @param [Symbol] level Can either be :info, :success, :error or :question
100
+ # @param [String] msg Represents the message you want to send to stdout (info, ok, question) stderr (error)
101
+ #
102
+ # Helpers: colorize
103
+ def message level, msg
104
+
105
+ symbols = {
106
+ :info => [ "(--)", "Brown" ],
107
+ :success => [ "(II)", "LightGreen" ],
108
+ :error => [ "(EE)", "LightRed" ],
109
+ :question => [ "(??)", "LightCyan" ],
110
+ :debug => [ "(++)", "LightBlue" ],
111
+ :warning => [ "(WW)", "Yellow" ]
112
+ }
113
+
114
+ raise ArugmentError, "Can't find the corresponding symbol for this message level (#{level.to_s}) - is the spelling wrong?" unless( symbols.key?( level ) )
115
+
116
+ if( level == :error )
117
+ STDERR.puts colorize( symbols[ level.to_sym ].last, "#{symbols[ level.to_sym ].first.to_s} #{msg.to_s}" )
118
+ else
119
+ STDOUT.puts colorize( symbols[ level.to_sym ].last, "#{symbols[ level.to_sym ].first.to_s} #{msg.to_s}" )
120
+ end
121
+
122
+ end # of def message }}}
123
+
124
+
125
+
126
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ namespace :metric do
4
+
5
+ desc "Run metric fu for project" # {{{
6
+ task :metric do |t|
7
+ puts "(--) Running metric fu"
8
+ system "metric_fu"
9
+ end # }}}
10
+
11
+ end # of namespace :metric
12
+
13
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ desc "RSpec Core Tasks"
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+
@@ -0,0 +1,292 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # System includes
5
+ require 'ostruct'
6
+ require 'awesome_print'
7
+ require 'andand'
8
+ require 'tempfile'
9
+ require 'os'
10
+
11
+ # Custom includes
12
+ require File.expand_path( File.dirname( __FILE__ ) + '/mixin/shell' )
13
+
14
+
15
+ # @class Info command class
16
+ # @brief Implements the info command
17
+ class Info < Thor
18
+
19
+ include ::Mixin::Shell
20
+ # include ::Mixin::Command
21
+
22
+ default_task :info
23
+
24
+ class_option :'without-general', :type => :boolean, :desc => "Print general system environment information"
25
+ class_option :'without-project', :type => :boolean, :desc => "Print project environment information"
26
+ class_option :'without-ruby', :type => :boolean, :desc => "Print ruby environment information"
27
+
28
+ class_option :pretty, :type => :boolean, :desc => "Pretty print"
29
+
30
+
31
+ ## API
32
+
33
+ # @fn def info {{{
34
+ # @brief Main info task entry point
35
+ desc "overview", "Shows system overview"
36
+ def overview
37
+
38
+ # Default symbol action list to find info for
39
+ default = %i(
40
+ general
41
+ project
42
+ ruby
43
+ )
44
+
45
+ # Make sure if we have a --without-* opts to skip work
46
+ options.each_pair do |option, skip|
47
+ next unless( skip )
48
+ default.delete_if { |item| option =~ %r{#{item.to_s}}i }
49
+ end
50
+
51
+ # Execute scan & print
52
+ default.each do |item|
53
+ data = scan_for item
54
+ next if data.andand.broken.nil?
55
+
56
+ self.send :pretty_print, data
57
+ end # of default.each
58
+
59
+ end # }}}
60
+
61
+
62
+ private
63
+
64
+ no_tasks do
65
+
66
+ ## Actions
67
+
68
+ # @fn def scan_for what # {{{
69
+ # @brief When executed will run "what" method scanner and print relevant information
70
+ #
71
+ # @param [Symbol] what Symbol of scanner method to run, e.g. :general, :java, :ruby etc.
72
+ def scan_for what
73
+ result = nil
74
+
75
+ begin
76
+ result = self.send what
77
+ rescue Exception => e
78
+ say "(EE) " + e.message, :red
79
+ result = OpenStruct.new
80
+ result.broken = true
81
+ end
82
+
83
+ return result
84
+ end # }}}
85
+
86
+ # @fn def pretty_print information, playful = options[:pretty] # {{{
87
+ # @brief Pretty prints given data to stdout
88
+ #
89
+ # @param [OpenStruct] information Information gathered from other scanning methods, e.g. :ruby
90
+ # @param [Boolean] playful Prints some curses like lines if true
91
+ def pretty_print information, playful = options[:pretty]
92
+ begin
93
+ puts ""
94
+ say information.title, :yellow
95
+
96
+ if( playful )
97
+ puts "-"*26
98
+ puts " "*26 + "\\"
99
+ else
100
+ puts ""
101
+ end
102
+
103
+ values = information.send :table
104
+ raise ArgumentError, "Information openstruct is malformed" if( values[ :broken ] )
105
+
106
+ values.each do |key, value|
107
+
108
+ # Skip :broken, :title
109
+ next if( %i(title broken).include?( key.to_sym ) )
110
+
111
+ # Make sure value is a string
112
+ value = value.to_s
113
+
114
+ # Remove pre- and post-padding
115
+ value.strip!
116
+
117
+ # Turn key into a nice printable value
118
+ # e.g. :current_directory => Current directory
119
+ description = key.to_s
120
+ description.gsub!( "_", " " )
121
+ description.capitalize!
122
+
123
+
124
+ # Check if value is multi-line, if so, format accordingly
125
+ output = []
126
+
127
+ if( value =~ %r{\n} )
128
+ lines = value.split( "\n" )
129
+ output << sprintf( "%-25s | %s", description, lines.shift )
130
+ lines.each { |line| output << sprintf( "%-25s | %s", "", line ) }
131
+ else
132
+ output << sprintf( "%-25s | %s", description, value )
133
+ end
134
+
135
+ output.each { |something| say something }
136
+ end
137
+
138
+ if( playful )
139
+ puts " "*26 + "\\"
140
+ puts " "*27 + "-"*80
141
+ end
142
+
143
+ puts ""
144
+
145
+ rescue Exception => e
146
+ say "(EE) " + e.message, :red
147
+ end
148
+ end # }}}
149
+
150
+
151
+ ## Specific Scanners
152
+
153
+ # @fn def general {{{
154
+ # @brief Returns information collected from the general system
155
+ #
156
+ # @return [OpenStruct] Returns openstruct with gathered information
157
+ def general
158
+ result = nil
159
+
160
+ begin
161
+ result = OpenStruct.new
162
+ result.broken = false
163
+
164
+ os = os_report
165
+
166
+ result.title = "System Information"
167
+ result.system = os.host
168
+ result.cpus = OS.cpu_count
169
+ result.architecture = OS.bits
170
+ result.current_user = `whoami`.chomp
171
+
172
+ rescue Exception => e
173
+ result = OpenStruct.new
174
+ result.broken = true
175
+
176
+ say "(EE) " + e.message, :red
177
+ end
178
+
179
+ return result
180
+ end # }}}
181
+
182
+ # @fn def project {{{
183
+ # @brief Print project related information to stdout
184
+ #
185
+ # @return [OpenStruct] Returns openstruct with gathered information
186
+ def project
187
+ result = nil
188
+
189
+ begin
190
+ result = OpenStruct.new
191
+ result.broken = false
192
+
193
+ result.title = "Project information"
194
+
195
+ result.current_directory = Dir.pwd
196
+ result.version = `git describe --tags` || "unknown"
197
+
198
+ rescue Exception => e
199
+ result = OpenStruct.new
200
+ result.broken = true
201
+
202
+ say "(EE) " + e.message, :red
203
+ end
204
+
205
+ return result
206
+ end # }}}
207
+
208
+ # @fn def ruby {{{
209
+ # @brief Prints ruby environment information to stdout
210
+ #
211
+ # @return [OpenStruct] Returns openstruct with gathered information
212
+ def ruby
213
+
214
+ result = nil
215
+
216
+ begin
217
+ result = OpenStruct.new
218
+ result.broken = false
219
+
220
+ result.title = 'Ruby Information'
221
+
222
+ commands = %w(ruby rvm rbenv rake gem)
223
+
224
+ commands.each do |command|
225
+ next unless( self.which( command ) )
226
+
227
+ result.send "#{command}=", self.version( command )
228
+ end
229
+
230
+ rescue Exception => e
231
+ result = OpenStruct.new
232
+ result.broken = true
233
+
234
+ say "(EE) " + e.message, :red
235
+ end
236
+
237
+ return result
238
+ end # }}}
239
+
240
+
241
+ ## Helpers
242
+
243
+ # @fn def os_report {{{
244
+ # @brief Get overview of the Operating System
245
+ #
246
+ # @return [OpenStruct] Returns a openstruct with various information, e.g.
247
+ # arch, target_os, target_vendor, target_cpu, target, host_os, host_vendor, host_cpu, host, RUBY_PLATFORM
248
+ def os_report
249
+ result = nil
250
+
251
+ begin
252
+ yaml = OS.report
253
+ hash = YAML.load( yaml )
254
+ result = hashes_to_ostruct( hash )
255
+ rescue Exception => e
256
+ $stderr.puts set_color "(EE) #{e.message}", :red
257
+ end
258
+
259
+ result
260
+ end # }}}
261
+
262
+ # @fn def hashes_to_ostruct object # {{{
263
+ # @brief This function turns a nested hash into a nested open struct
264
+ #
265
+ # @author Dave Dribin
266
+ # Reference: http://www.dribin.org/dave/blog/archives/2006/11/17/hashes_to_ostruct/
267
+ #
268
+ # @param [Object] object Value can either be of type Hash or Array, if other then it is returned and not changed
269
+ #
270
+ # @return [OStruct] Returns nested open structs
271
+ def hashes_to_ostruct object
272
+
273
+ return case object
274
+ when Hash
275
+ object = object.clone
276
+ object.each { |key, value| object[key] = hashes_to_ostruct(value) }
277
+ OpenStruct.new( object )
278
+ when Array
279
+ object = object.clone
280
+ object.map! { |i| hashes_to_ostruct(i) }
281
+ else
282
+ object
283
+ end
284
+
285
+ end # of def hashes_to_ostruct }}}
286
+
287
+ end # of no_tasks do
288
+
289
+ end # of Class Info
290
+
291
+
292
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # @module module Mixin
4
+ # @brief Mixin module contains various functions to be used in other components
5
+ module Mixin
6
+
7
+ # @module ConfigChoice Module
8
+ # @brief Module wrapper around ConfigChoice tasks
9
+ module ConfigChoice
10
+
11
+ def config_choice
12
+ defaults = YAML.load_file(File.expand_path( File.dirname( __FILE__ ) + '/../../../template/default_values.yml'))
13
+ defaults['jason'].each_key { |key| choice_option(defaults['jason'], key) }
14
+ defaults
15
+ end
16
+
17
+ private def choice_option(defaults, option)
18
+ print ("%s (%s): " % [option, defaults[option]])
19
+ value = STDIN.gets.chomp
20
+ defaults[option] = value unless value.empty?
21
+ end
22
+ end # of module ConfigChoice
23
+
24
+ end # of module Mixin
25
+
26
+
27
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # @module module Mixin
5
+ # @brief Mixin module contains various functions to be used in other components
6
+ module Mixin
7
+
8
+ # @module Configuration Module
9
+ # @brief Module wrapper around tasks which demands config file
10
+ module Configuration
11
+
12
+ # @fn def initialize *args {{{
13
+ # @brief Default constructor
14
+ #
15
+ # @param [Array] args Argument array
16
+ def initialize *args
17
+ super
18
+ unless File.exist?("~/.geohash36/config.yaml")
19
+ abort("Could not find configuration file in ~/geohash36/config.yaml. Please run 'geohash36 config:generate' to generate it.")
20
+ end
21
+ end # }}}
22
+
23
+ end # of module Configuration
24
+
25
+ end # of module Mixin
26
+
27
+
28
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # System includes
5
+ require 'thor'
6
+ require 'andand'
7
+
8
+
9
+ # @module module Mixin
10
+ # @brief Mixin module contains various functions to be used in other components
11
+ module Mixin
12
+
13
+ # @module Default Module
14
+ # @brief Module wrapper around default tasks
15
+ module Default
16
+
17
+ # @fn def initialize *args {{{
18
+ # @brief Default constructor
19
+ #
20
+ # @param [Array] args Argument array
21
+ def initialize *args
22
+ super
23
+ end # }}}
24
+
25
+ end # of module Default
26
+
27
+ end # of module Mixin
28
+
29
+
30
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Custom includes
4
+ require File.expand_path( File.dirname( __FILE__ ) + '/config_choice' )
5
+
6
+ # @module module Mixin
7
+ # @brief Mixin module contains various functions to be used in other components
8
+ module Mixin
9
+
10
+ # @module DefaultConfig Module
11
+ # @brief Module wrapper around default tasks
12
+ module DefaultConfig
13
+
14
+ # Include various partials
15
+ include ::Mixin::ConfigChoice
16
+
17
+ def defaults
18
+ config_path = File.expand_path( '~/.geohash36/config.yml' )
19
+ if File.exists?(config_path)
20
+ YAML.load_file(config_path)
21
+ else
22
+ FileUtils.mkdir_p( File.expand_path( '~/.geohash36' ) )
23
+ config_choice
24
+ end
25
+ end
26
+ end # of module DefaultConfig
27
+
28
+ end # of module Mixin
29
+
30
+
31
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # System includes
5
+ require 'andand'
6
+
7
+
8
+ # @module module Mixin
9
+ # @brief Mixin module contains various functions to be used in other components
10
+ module Mixin
11
+
12
+ # @module Guess Module
13
+ # @brief Module wrapper around guess tasks to extract version numbers etc
14
+ module Guess
15
+
16
+ # @fn def initialize *args {{{
17
+ # @brief Default constructor
18
+ #
19
+ # @param [Array] args Argument array
20
+ def initialize *args
21
+ super
22
+ end # }}}
23
+
24
+ # @fn def guess_version string {{{
25
+ # @brief Guess version from full version string
26
+ #
27
+ # @example e.g. "ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux]"
28
+ # -> 2.1.1
29
+ #
30
+ # "rake, version 10.1.1"
31
+ # -> 10.1.1
32
+ def guess_version string
33
+
34
+ result = ""
35
+
36
+ begin
37
+
38
+ # Sanity
39
+ raise ArgumentError, "Version has to be of type string" unless( string.is_a?( String ) )
40
+ raise ArgumentError, "Version can't be empty" if( string.empty? )
41
+
42
+ result = string.match( /\d+\.\d+\.\d+/ ).to_s # matches first only
43
+
44
+ rescue Exception => e
45
+ say "(EE) " + e.message, :red
46
+ result = ""
47
+ end
48
+
49
+ return result
50
+ end # }}}
51
+
52
+ end # of Module Guess
53
+
54
+ end # of module Mixin
55
+
56
+
57
+ # vim:ts=2:tw=100:wm=100:syntax=ruby
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ # System includes
5
+ require 'thor'
6
+ require 'andand'
7
+
8
+ # Custom includes
9
+ require File.expand_path( File.dirname( __FILE__ ) + '/../../../library/logger' )
10
+
11
+
12
+ # @module module Mixin
13
+ # @brief Mixin module contains various functions to be used in other components
14
+ module Mixin
15
+
16
+ # @module Logger Module
17
+ # @brief Module wrapper around logger tasks
18
+ module Logger
19
+
20
+ # @fn def initialize *args {{{
21
+ # @brief Default constructor
22
+ #
23
+ # @param [Array] args Argument array
24
+ def initialize *args
25
+ super
26
+
27
+ @logger = ::ClothesNetwork::Logger.instance
28
+
29
+ @logger.color = options[ :colorize ]
30
+ @logger.silent = options[ :silent ]
31
+
32
+ end # }}}
33
+
34
+ Thor::class_option :colorize, :type => :boolean, :required => false, :default => true, :desc => 'Colorize the output for easier reading'
35
+ Thor::class_option :logger, :type => :boolean, :required => false, :default => true, :desc => 'Use default project logger'
36
+ Thor::class_option :silent, :type => :boolean, :required => false, :default => false, :desc => 'Turn off all logging'
37
+
38
+ end # of module Logger
39
+
40
+ end # of module Mixin
41
+
42
+
43
+ # vim:ts=2:tw=100:wm=100:syntax=ruby