bone 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,48 @@
1
+ @spec = Gem::Specification.new do |s|
2
+ s.name = "bone"
3
+ s.rubyforge_project = 'bone'
4
+ s.version = "0.2.1"
5
+ s.summary = "Get Bones"
6
+ s.description = s.summary
7
+ s.author = "Delano Mandelbaum"
8
+ s.email = "delano@solutious.com"
9
+ s.homepage = ""
10
+
11
+ s.extra_rdoc_files = %w[README.md LICENSE.txt CHANGES.txt]
12
+ s.has_rdoc = true
13
+ s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.rdoc"]
14
+ s.require_paths = %w[lib]
15
+
16
+ s.executables = %w[bone]
17
+
18
+ s.add_dependency 'boned', '= 0.2.0'
19
+
20
+ # = MANIFEST =
21
+ # git ls-files
22
+ s.files = %w(
23
+ CHANGES.txt
24
+ LICENSE.txt
25
+ README.md
26
+ Rakefile
27
+ Rudyfile
28
+ bin/bone
29
+ bone.gemspec
30
+ lib/bone.rb
31
+ lib/bone/cli.rb
32
+ try/bone.rb
33
+ vendor/drydock-0.6.8/CHANGES.txt
34
+ vendor/drydock-0.6.8/LICENSE.txt
35
+ vendor/drydock-0.6.8/README.rdoc
36
+ vendor/drydock-0.6.8/Rakefile
37
+ vendor/drydock-0.6.8/bin/example
38
+ vendor/drydock-0.6.8/drydock.gemspec
39
+ vendor/drydock-0.6.8/lib/drydock.rb
40
+ vendor/drydock-0.6.8/lib/drydock/console.rb
41
+ vendor/drydock-0.6.8/lib/drydock/mixins.rb
42
+ vendor/drydock-0.6.8/lib/drydock/mixins/object.rb
43
+ vendor/drydock-0.6.8/lib/drydock/mixins/string.rb
44
+ vendor/drydock-0.6.8/lib/drydock/screen.rb
45
+ )
46
+
47
+
48
+ end
@@ -0,0 +1,150 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+
4
+ unless defined?(BONE_HOME)
5
+ BONE_HOME = File.expand_path(File.join(File.dirname(__FILE__), '..') )
6
+ end
7
+
8
+ module Bone
9
+ extend self
10
+ VERSION = "0.2.1"
11
+ APIVERSION = 'v1'.freeze
12
+
13
+ class Problem < RuntimeError; end
14
+ class BadBone < Problem; end
15
+
16
+ @digest_type = nil # set at the end
17
+ @debug = false
18
+ class << self
19
+ attr_accessor :digest_type
20
+ def enable_debug() @debug = true end
21
+ def disable_debug() @debug = false end
22
+ def debug?() @debug == true end
23
+ def ld(*msg)
24
+ return unless Bone.debug?
25
+ prefix = "D(#{Thread.current.object_id}): "
26
+ STDERR.puts "#{prefix}" << msg.join("#{$/}#{prefix}")
27
+ end
28
+ end
29
+
30
+ SOURCE = (ENV['BONE_SOURCE'] || "localhost:6043").freeze
31
+ TOKEN = ENV['BONE_TOKEN'].freeze
32
+
33
+ def get(key, opts={})
34
+ token = opts[:token] || ENV['BONE_TOKEN'] || TOKEN
35
+ request(:get, token, key) # returns the response body
36
+ end
37
+
38
+ def set(key, value, opts={})
39
+ token = opts[:token] || ENV['BONE_TOKEN'] || TOKEN
40
+ opts[:value] = value
41
+ request(:set, token, key, opts)
42
+ key # return the key b/c it could be a binary file
43
+ end
44
+
45
+ def del(key, opts={})
46
+ token = opts[:token] || ENV['BONE_TOKEN'] || TOKEN
47
+ request(:del, token, key, opts) # returns the response body
48
+ end
49
+
50
+ def [](keyname)
51
+ get(keyname)
52
+ end
53
+
54
+ def []=(keyname, value)
55
+ set(keyname, value)
56
+ end
57
+
58
+ def keys(keyname=nil, opts={})
59
+ token = opts[:token] || ENV['BONE_TOKEN'] || TOKEN
60
+ request(:keys, token, keyname, opts)
61
+ end
62
+
63
+ # <tt>require</tt> a library from the vendor directory.
64
+ # The vendor directory should be organized such
65
+ # that +name+ and +version+ can be used to create
66
+ # the path to the library.
67
+ #
68
+ # e.g.
69
+ #
70
+ # vendor/httpclient-2.1.5.2/httpclient
71
+ #
72
+ def require_vendor(name, version)
73
+ path = File.join(BONE_HOME, 'vendor', "#{name}-#{version}", 'lib')
74
+ $:.unshift path
75
+ Bone.ld "REQUIRE VENDOR: ", path
76
+ require name
77
+ end
78
+
79
+ def valid_token?(val)
80
+ is_sha256? val
81
+ end
82
+
83
+ def is_sha1?(val)
84
+ val.to_s.match /\A[0-9a-f]{40}\z/
85
+ end
86
+
87
+ def is_sha256?(val)
88
+ val.to_s.match /\A[0-9a-f]{64}\z/
89
+ end
90
+
91
+ def digest(val)
92
+ @digest_type.hexdigest val
93
+ end
94
+
95
+ def generate_token
96
+ srand
97
+ digest [`hostname`, `w`, Time.now, rand].join(':')
98
+ end
99
+
100
+ private
101
+
102
+ def request(action, token, key, params={})
103
+ params[:token] = token
104
+ path = "/#{APIVERSION}/#{action}/#{key}"
105
+ host, port = *SOURCE.split(':')
106
+ port ||= 6043
107
+
108
+ Bone.ld "URI: #{path}"
109
+ Bone.ld "PARAMS: " << params.inspect
110
+
111
+ case action
112
+ when :del
113
+ headers = { 'X-BONE_TOKEN' => token }
114
+ req = Net::HTTP::Delete.new(path, headers)
115
+ when :set
116
+ query = {}
117
+ params.each_pair {|n,v| query[n.to_s] = v }
118
+ req = Net::HTTP::Post.new(path)
119
+ req.set_form_data query
120
+ when :get, :keys
121
+ args = []
122
+ params.each_pair {|n,v| args << "#{n}=#{URI.encode(v.to_s)}" }
123
+ query = [path, args.join('&')].join('?')
124
+ Bone.ld "GET: #{query}"
125
+ req = Net::HTTP::Get.new(query)
126
+ else
127
+ raise Bone::Problem, "Unknown action: #{action}"
128
+ end
129
+ res = Net::HTTP.start(host, port) {|http| http.request(req) }
130
+ case res
131
+ when Net::HTTPSuccess, Net::HTTPRedirection
132
+ res.body
133
+ else
134
+ raise Bone::Problem, "#{res.body} (#{res.code} #{res.message})"
135
+ end
136
+ end
137
+
138
+ def determine_digest_type
139
+ if RUBY_PLATFORM == "java"
140
+ require 'openssl'
141
+ Bone.digest_type = OpenSSL::Digest::SHA256
142
+ else
143
+ require 'digest'
144
+ Bone.digest_type = Digest::SHA256
145
+ end
146
+ end
147
+
148
+ @digest_type = determine_digest_type
149
+ end
150
+
@@ -0,0 +1,69 @@
1
+ require 'bone'
2
+ require 'net/http'
3
+
4
+ class Bone::CLI < Drydock::Command
5
+
6
+ def check!
7
+ @token = @global.t || ENV['BONE_TOKEN']
8
+ raise Bone::BadBone, @token unless Bone.valid_token?(@token)
9
+ end
10
+
11
+ def get
12
+ check!
13
+ @argv.unshift @alias unless @alias == 'get'
14
+ raise "No key specified" unless @argv.first
15
+ puts Bone.get(@argv.first)
16
+ end
17
+
18
+ def del
19
+ check!
20
+ raise "No key specified" unless @argv.first
21
+ puts Bone.del(@argv.first)
22
+ end
23
+
24
+ def set
25
+ check!
26
+ opts = {:token => @token }
27
+ keyname, value = *(@argv.size == 1 ? @argv.first.split('=') : @argv)
28
+ raise "No key specified" unless keyname
29
+ raise "No value specified" unless value
30
+ if File.exists?(value) && !@option.string
31
+ value = File.readlines(value).join
32
+ opts[:file] = true
33
+ end
34
+ puts Bone.set(keyname, value, opts)
35
+ end
36
+
37
+ def keys
38
+ check!
39
+ list = Bone.keys(@argv[0])
40
+ if list.empty?
41
+ return if @global.quiet
42
+ puts "No keys"
43
+ puts "Try: bone set keyname=keyvalue"
44
+ else
45
+ puts list
46
+ end
47
+ end
48
+
49
+ def token
50
+ check!
51
+ if @option.force
52
+ generate_token_dialog
53
+ else
54
+ puts @token
55
+ end
56
+ rescue Bone::BadBone => ex
57
+ generate_token_dialog
58
+ exit 1
59
+ end
60
+
61
+ private
62
+ def generate_token_dialog
63
+ newtoken = Bone.generate_token
64
+ puts newtoken and return if @global.quiet
65
+ puts "Set the BONE_TOKEN environment variable with the following token"
66
+ puts newtoken
67
+ end
68
+
69
+ end
@@ -0,0 +1,9 @@
1
+ # ruby -rubygems -Ilib try/bone.rb
2
+ require 'bone'
3
+
4
+ ENV['BONE_TOKEN'] = '1c397d204aa4e94f566d7f78cc4bb5bef5b558d9bd64c1d8a45e67a621fb87dc'
5
+
6
+ Bone['poop'] = rand
7
+ puts Bone['poop']
8
+
9
+ puts Bone.keys
@@ -0,0 +1,159 @@
1
+ DRYDOCK, CHANGES
2
+
3
+ #### 0.6.9 (2009-10-??) #############################
4
+
5
+ * CHANGE: Using autoload where appropriate.
6
+
7
+ #### 0.6.8 (2009-09-15) #############################
8
+
9
+ * FIXED: require 'thread' added to Drydock::Screen
10
+ * FIXED: require 'drydock/console'
11
+
12
+
13
+ #### 0.6.7 (2009-09-15) #############################
14
+
15
+ * ADDED: Drydock::Screen
16
+
17
+ #### 0.6.6 (2009-06-24) #############################
18
+
19
+ NOTE: Because at_exit has been removed, Drydock scripts will no longer
20
+ run automatically. You can explicitly call the following at the bottom
21
+ of your scripts:
22
+
23
+ Drydock.run!(ARGV, STDIN) if Drydock.run?
24
+
25
+ * CHANGE: Removed at_exit
26
+ * CHANGE: Drydock.run? will now return false if Drydock hasl already run
27
+
28
+
29
+ #### 0.6.5 (2009-05-21) #############################
30
+
31
+ * ADDED: "with_args" support for default command. When specified,
32
+ arguments can be passed to the default command with run in the
33
+ short form. e.g. "script arg1 arg2" == "script cmdname arg1 arg2"
34
+
35
+ #### 0.6.3 (2009-05-10) #############################
36
+
37
+ * ADDED: show-commands now displays a note about which command is the default
38
+ * CHANGE: Moved mixins to lib/drydock/mixins (so other projects can require 'drydock/mixins')
39
+ * FIXED: Support for inline command aliases when specifying a class:
40
+ command [:name, :alias1, :alias2] => SomeClass
41
+
42
+
43
+ #### 0.6.2 (2009-05-07) #############################
44
+
45
+ * ADDED: drydock/console.rb to start a new wing in the drydock
46
+ * ADDED: mixins for String and Object (for Console)
47
+
48
+
49
+ #### 0.6.1 (2009-05-03) #############################
50
+
51
+ * FIXED: @@trawler raises an error in Ruby 1.8 if it's a Symbol
52
+
53
+
54
+ #### 0.6.0 (2009-04-30) #############################
55
+
56
+ * CHANGE: Cleaner default error message for UnknownCommand exceptions
57
+ * CHANGE: 'desc' is now 'about' (desc works, but it prints a notice)
58
+ * CHANGE: I now recommend implementing the Drydock DSL in a module.
59
+ bin/example was updated to reflect the change. This prevents Drydock
60
+ keywords from being included in the global namespace.
61
+ * ADDED: Inline commands aliases. command :cmd1, :cmd2 do; ...; end
62
+ * ADDED: Unknown commands can be directed to a trawler.
63
+
64
+
65
+ #### 0.5.6 (2009-04-22) #############################
66
+
67
+ * CHANGED: Interrupts now handled in rescue rather than a trap.
68
+ * ADDED: Drydock::ArgError and Drydock::OptError are rescued at runtime by default
69
+
70
+ #### 0.5.5 (2009-04-19) #############################
71
+
72
+ * CHANGED: Improved help screen formatting.
73
+
74
+ #### 0.5.4 (2009-04-15) #############################
75
+
76
+ * ADDED: Better error handling with new Drydock::ArgError and Drydock::OptError
77
+
78
+ #### 0.5.3 (2009-04-05) #############################
79
+
80
+ * FIXED: Command actions were not being handled correctly. Added rdocs to
81
+ clarify the code.
82
+
83
+ #### 0.5.2 (2009-04-04) #############################
84
+
85
+ * ADDED: before and after blocks now receive a primed reference to the
86
+ command object (which gives them access to the globals and options)
87
+ * CHANGE: The prep stuff in Drydock::Command#call is now split into a
88
+ separate method: prepare so call no longer takes arguments.
89
+ * FIXED: Drydock#capture_io was using yield. It now accepts a block instead.
90
+
91
+
92
+ #### 0.5.1 (2009-03-15) #############################
93
+
94
+ * FIXED: Prevent calling default command in at_exit when there's a LoadError.
95
+ * FIXED: Exit gracefully when the application exits.
96
+ * FIXED: Print command names with dashes rather than underscores
97
+
98
+
99
+ #### 0.5 (2009-03-11) ###############################
100
+
101
+ * ADDED: Checks that the command class is a subclass of Drydock::Command
102
+ * CHANGE: Cleaned up show-commands screen
103
+ * FIXED: Help didn't work when using command alias
104
+ * ADDED: Named argv values.
105
+ * CHANGE: argv are now part of the Command class (not passed to command blocks)
106
+ * CHANGE: "project" now automatically requires the lowercase name of the project
107
+ and gracefully continues if the require failed.
108
+ * CHANGE: Drydock will look for different validation method, based on the method
109
+ being executed. If a validation method is found it's executed and
110
+ must return a true valid (it can also raise its own exceptions).
111
+ * ADDED: command actions. These are boolean switches with a twist. Drydock looks
112
+ for command_action or action_command methods. Saves checking the switches
113
+ and sending to other methods manually.
114
+
115
+
116
+ #### 0.4 (2009-02-28) ###############################
117
+
118
+ * FIXED: "interning empty string" error when bare "option" is used
119
+ * ADDED: Calls valid? method (if present) before calling command block.
120
+ * ADDED: "capture" method. Auto capture STDOUT to obj.stdout etc...
121
+ * ADDED: Automatically calls init and print_header methods before the command
122
+ and print_footer after the command (if available)
123
+ * ADDED: Tries to call obj.command if available when no block is supplied
124
+ * ADDED: "show_commands" command built-in. Displays commands with descriptions
125
+ * ADDED: A default usage help msg for every command: "#{$0} command-name"
126
+ * ADDED: "usage" work multiple times for the same command.
127
+ * ADDED: "desc" method for per command descriptions
128
+ * CHANGE: options are now stored as obj.option.name instead of obj.name
129
+ * CHANGE: global options are now stored as obj.globals.name
130
+ * CHANGE: removed auto importing methods
131
+ OLD: require 'drydock'
132
+ ADDED: require 'drydock'
133
+ extend Drydock
134
+
135
+
136
+ #### 0.3.3 (2009-02-14) ###############################
137
+
138
+ * ADDED: init method hook for subclasses of Drydock::Command
139
+ * UPDATED: Rdocs
140
+ * CHANGE: added method command_aliaz to mirror aliaz_command
141
+
142
+
143
+ #### 0.3 (2009-02-05) ###############################
144
+
145
+ * Added support for custom Drydock::Commands objects
146
+ * Global and command-specific options are now available as
147
+ attributes of the Drydock::Commands class instance.
148
+ * Automatic execution
149
+ * Now in a single file (lib/drydock.rb)
150
+ * Started adding tests
151
+ * Improved documentation
152
+
153
+
154
+ #### 0.2 (2008-12-27) ###############################
155
+
156
+ * Initial release
157
+ * Forked from bmizerany/frylock
158
+
159
+
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2008-2009 Delano Mandelbaum, Solutious Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.