wpb 0.0.5 → 0.0.6.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wpb/bash.rb +23 -13
- data/lib/wpb/version.rb +1 -1
- data/lib/wpb.rb +10 -7
- data/wpb.gemspec +6 -3
- metadata +65 -55
- data/lib/wpb/clamp/attribute.rb +0 -37
- data/lib/wpb/clamp/attribute_declaration.rb +0 -40
- data/lib/wpb/clamp/command.rb +0 -137
- data/lib/wpb/clamp/errors.rb +0 -26
- data/lib/wpb/clamp/help.rb +0 -69
- data/lib/wpb/clamp/option/declaration.rb +0 -58
- data/lib/wpb/clamp/option/parsing.rb +0 -45
- data/lib/wpb/clamp/option.rb +0 -77
- data/lib/wpb/clamp/parameter/declaration.rb +0 -28
- data/lib/wpb/clamp/parameter/parsing.rb +0 -28
- data/lib/wpb/clamp/parameter.rb +0 -70
- data/lib/wpb/clamp/subcommand/declaration.rb +0 -40
- data/lib/wpb/clamp/subcommand/execution.rb +0 -37
- data/lib/wpb/clamp/subcommand.rb +0 -23
- data/lib/wpb/clamp/version.rb +0 -3
data/lib/wpb/bash.rb
CHANGED
@@ -1,18 +1,28 @@
|
|
1
|
-
require "
|
1
|
+
require "clamp"
|
2
2
|
|
3
3
|
class Bash < Clamp::Command
|
4
|
-
option ["-v", "--version"], :flag, "
|
4
|
+
option ["-v", "--version"], :flag, "Show version" do
|
5
|
+
require "wpb/version"
|
6
|
+
puts "WordPress Bash #{WPB::VERSION} (c) James Birtles"
|
7
|
+
exit 0
|
8
|
+
end
|
9
|
+
|
10
|
+
# self.default_subcommand = "console"
|
5
11
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
libs << " -r #{File.expand_path('../../wpb.rb', __FILE__)}"
|
14
|
-
puts "Connecting to database..."
|
15
|
-
exec "#{irb} #{libs}"
|
16
|
-
end
|
12
|
+
subcommand ["console", "c"], "Start the wpb console" do
|
13
|
+
def execute
|
14
|
+
require "pry"
|
15
|
+
require "wpb"
|
16
|
+
WPB::App.run
|
17
|
+
WPB.pry
|
18
|
+
end
|
17
19
|
end
|
20
|
+
|
21
|
+
subcommand "init", "Commands to be run when first using WPB with your wordpress instance" do
|
22
|
+
def execute
|
23
|
+
require "wpb"
|
24
|
+
WPB::App.connect
|
25
|
+
WPB::AddTypeToWpPosts.up
|
26
|
+
end
|
27
|
+
end
|
18
28
|
end
|
data/lib/wpb/version.rb
CHANGED
data/lib/wpb.rb
CHANGED
@@ -11,12 +11,14 @@ require "active_record"
|
|
11
11
|
# The wrapper for the wpb gem
|
12
12
|
|
13
13
|
module WPB
|
14
|
-
class
|
14
|
+
class AddTypeToWpPosts < ActiveRecord::Migration
|
15
15
|
def self.up
|
16
16
|
suppress_messages do
|
17
17
|
unless column_exists? :wp_posts, :type
|
18
18
|
add_column :wp_posts, :type, :string
|
19
19
|
PagePost.reset_column_information
|
20
|
+
else
|
21
|
+
puts "\tWordPress Database Already Initialized"
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -27,10 +29,10 @@ module WPB
|
|
27
29
|
end
|
28
30
|
|
29
31
|
class App
|
30
|
-
|
31
|
-
|
32
|
+
def self.connect
|
33
|
+
config = {
|
32
34
|
:adapter => "mysql",
|
33
|
-
|
35
|
+
# :socket => "/tmp/mysql.sock",
|
34
36
|
:host => "localhost",
|
35
37
|
:username => "root",
|
36
38
|
:password => "root",
|
@@ -38,8 +40,11 @@ module WPB
|
|
38
40
|
}
|
39
41
|
|
40
42
|
ActiveRecord::Base.establish_connection(config)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.run
|
46
|
+
self.connect
|
41
47
|
|
42
|
-
AddType::up
|
43
48
|
PagePost.all.each do |p|
|
44
49
|
p.type = p.post_type.capitalize
|
45
50
|
if p.post_type != "post" && p.post_type != "page"
|
@@ -50,5 +55,3 @@ module WPB
|
|
50
55
|
end
|
51
56
|
end
|
52
57
|
end
|
53
|
-
|
54
|
-
WPB::App::run
|
data/wpb.gemspec
CHANGED
@@ -8,14 +8,17 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["James Birtles"]
|
10
10
|
s.email = ["itsme@jamesbirtles.com"]
|
11
|
-
s.homepage = "http://
|
11
|
+
s.homepage = "http://jamesbirtles.org/wpb"
|
12
12
|
s.summary = %q{A Terminal interface to WordPress}
|
13
|
-
s.description = %q{WPB (WordPress Bash) provides a Terminal interface to WordPress. It
|
13
|
+
s.description = %q{WPB (WordPress Bash) provides a Terminal interface to WordPress. It uses ActiveRecord, which means the sytax is mostly the same}
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_dependency('activerecord', '
|
20
|
+
s.add_dependency('activerecord', '3.0.0')
|
21
|
+
s.add_dependency('clamp', '>= 0.3.0')
|
22
|
+
s.add_dependency('pry', '>= 0.9.7')
|
23
|
+
s.add_dependency('mysql')
|
21
24
|
end
|
metadata
CHANGED
@@ -1,39 +1,69 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: wpb
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6.pre
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- James Birtles
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-11-28 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: activerecord
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70301384249100 !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
22
|
-
- -
|
23
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - =
|
20
|
+
- !ruby/object:Gem::Version
|
24
21
|
version: 3.0.0
|
25
22
|
type: :runtime
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70301384249100
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: clamp
|
27
|
+
requirement: &70301384248580 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.3.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70301384248580
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: pry
|
38
|
+
requirement: &70301384248040 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.9.7
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70301384248040
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mysql
|
49
|
+
requirement: &70301384247620 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70301384247620
|
58
|
+
description: WPB (WordPress Bash) provides a Terminal interface to WordPress. It uses
|
59
|
+
ActiveRecord, which means the sytax is mostly the same
|
60
|
+
email:
|
29
61
|
- itsme@jamesbirtles.com
|
30
|
-
executables:
|
62
|
+
executables:
|
31
63
|
- wpb
|
32
64
|
extensions: []
|
33
|
-
|
34
65
|
extra_rdoc_files: []
|
35
|
-
|
36
|
-
files:
|
66
|
+
files:
|
37
67
|
- .gitignore
|
38
68
|
- Changelog.md
|
39
69
|
- Gemfile
|
@@ -67,21 +97,6 @@ files:
|
|
67
97
|
- doc/rdoc.css
|
68
98
|
- lib/wpb.rb
|
69
99
|
- lib/wpb/bash.rb
|
70
|
-
- lib/wpb/clamp/attribute.rb
|
71
|
-
- lib/wpb/clamp/attribute_declaration.rb
|
72
|
-
- lib/wpb/clamp/command.rb
|
73
|
-
- lib/wpb/clamp/errors.rb
|
74
|
-
- lib/wpb/clamp/help.rb
|
75
|
-
- lib/wpb/clamp/option.rb
|
76
|
-
- lib/wpb/clamp/option/declaration.rb
|
77
|
-
- lib/wpb/clamp/option/parsing.rb
|
78
|
-
- lib/wpb/clamp/parameter.rb
|
79
|
-
- lib/wpb/clamp/parameter/declaration.rb
|
80
|
-
- lib/wpb/clamp/parameter/parsing.rb
|
81
|
-
- lib/wpb/clamp/subcommand.rb
|
82
|
-
- lib/wpb/clamp/subcommand/declaration.rb
|
83
|
-
- lib/wpb/clamp/subcommand/execution.rb
|
84
|
-
- lib/wpb/clamp/version.rb
|
85
100
|
- lib/wpb/comment.rb
|
86
101
|
- lib/wpb/page.rb
|
87
102
|
- lib/wpb/pagepost.rb
|
@@ -90,33 +105,28 @@ files:
|
|
90
105
|
- lib/wpb/user.rb
|
91
106
|
- lib/wpb/version.rb
|
92
107
|
- wpb.gemspec
|
93
|
-
|
94
|
-
homepage: http://github.com/jamesbirtles/wpb
|
108
|
+
homepage: http://jamesbirtles.org/wpb
|
95
109
|
licenses: []
|
96
|
-
|
97
110
|
post_install_message:
|
98
111
|
rdoc_options: []
|
99
|
-
|
100
|
-
require_paths:
|
112
|
+
require_paths:
|
101
113
|
- lib
|
102
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
115
|
none: false
|
104
|
-
requirements:
|
105
|
-
- -
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
version:
|
108
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
121
|
none: false
|
110
|
-
requirements:
|
111
|
-
- -
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version:
|
122
|
+
requirements:
|
123
|
+
- - ! '>'
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.3.1
|
114
126
|
requirements: []
|
115
|
-
|
116
127
|
rubyforge_project:
|
117
|
-
rubygems_version: 1.
|
128
|
+
rubygems_version: 1.8.10
|
118
129
|
signing_key:
|
119
130
|
specification_version: 3
|
120
131
|
summary: A Terminal interface to WordPress
|
121
132
|
test_files: []
|
122
|
-
|
data/lib/wpb/clamp/attribute.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
|
3
|
-
class Attribute
|
4
|
-
|
5
|
-
attr_reader :description, :attribute_name, :default_value
|
6
|
-
|
7
|
-
def help_rhs
|
8
|
-
rhs = description
|
9
|
-
if defined?(@default_value)
|
10
|
-
rhs += " (default: #{@default_value.inspect})"
|
11
|
-
end
|
12
|
-
rhs
|
13
|
-
end
|
14
|
-
|
15
|
-
def help
|
16
|
-
[help_lhs, help_rhs]
|
17
|
-
end
|
18
|
-
|
19
|
-
def ivar_name
|
20
|
-
"@#{attribute_name}"
|
21
|
-
end
|
22
|
-
|
23
|
-
def read_method
|
24
|
-
attribute_name
|
25
|
-
end
|
26
|
-
|
27
|
-
def default_method
|
28
|
-
"default_#{read_method}"
|
29
|
-
end
|
30
|
-
|
31
|
-
def write_method
|
32
|
-
"#{attribute_name}="
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
|
3
|
-
module AttributeDeclaration
|
4
|
-
|
5
|
-
protected
|
6
|
-
|
7
|
-
def define_accessors_for(attribute, &block)
|
8
|
-
define_reader_for(attribute)
|
9
|
-
define_default_for(attribute)
|
10
|
-
define_writer_for(attribute, &block)
|
11
|
-
end
|
12
|
-
|
13
|
-
def define_reader_for(attribute)
|
14
|
-
define_method(attribute.read_method) do
|
15
|
-
if instance_variable_defined?(attribute.ivar_name)
|
16
|
-
instance_variable_get(attribute.ivar_name)
|
17
|
-
elsif respond_to?(attribute.default_method)
|
18
|
-
send(attribute.default_method)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def define_default_for(attribute)
|
24
|
-
define_method(attribute.default_method) do
|
25
|
-
attribute.default_value
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def define_writer_for(attribute, &block)
|
30
|
-
define_method(attribute.write_method) do |value|
|
31
|
-
if block
|
32
|
-
value = instance_exec(value, &block)
|
33
|
-
end
|
34
|
-
instance_variable_set(attribute.ivar_name, value)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
data/lib/wpb/clamp/command.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'clamp/errors'
|
2
|
-
require 'clamp/help'
|
3
|
-
require 'clamp/option/declaration'
|
4
|
-
require 'clamp/option/parsing'
|
5
|
-
require 'clamp/parameter/declaration'
|
6
|
-
require 'clamp/parameter/parsing'
|
7
|
-
require 'clamp/subcommand/declaration'
|
8
|
-
require 'clamp/subcommand/execution'
|
9
|
-
|
10
|
-
module Clamp
|
11
|
-
|
12
|
-
# {Command} models a shell command. Each command invocation is a new object.
|
13
|
-
# Command options and parameters are represented as attributes
|
14
|
-
# (see {Command::Declaration}).
|
15
|
-
#
|
16
|
-
# The main entry-point is {#run}, which uses {#parse} to populate attributes based
|
17
|
-
# on an array of command-line arguments, then calls {#execute} (which you provide)
|
18
|
-
# to make it go.
|
19
|
-
#
|
20
|
-
class Command
|
21
|
-
|
22
|
-
# Create a command execution.
|
23
|
-
#
|
24
|
-
# @param [String] invocation_path the path used to invoke the command
|
25
|
-
# @param [Hash] context additional data the command may need
|
26
|
-
#
|
27
|
-
def initialize(invocation_path, context = {})
|
28
|
-
@invocation_path = invocation_path
|
29
|
-
@context = context
|
30
|
-
end
|
31
|
-
|
32
|
-
# @return [String] the path used to invoke this command
|
33
|
-
#
|
34
|
-
attr_reader :invocation_path
|
35
|
-
|
36
|
-
# @return [Array<String>] unconsumed command-line arguments
|
37
|
-
#
|
38
|
-
def remaining_arguments
|
39
|
-
@remaining_arguments
|
40
|
-
end
|
41
|
-
|
42
|
-
# Parse command-line arguments.
|
43
|
-
#
|
44
|
-
# @param [Array<String>] arguments command-line arguments
|
45
|
-
# @return [Array<String>] unconsumed arguments
|
46
|
-
#
|
47
|
-
def parse(arguments)
|
48
|
-
@remaining_arguments = arguments.dup
|
49
|
-
parse_options
|
50
|
-
parse_parameters
|
51
|
-
@remaining_arguments
|
52
|
-
end
|
53
|
-
|
54
|
-
# Run the command, with the specified arguments.
|
55
|
-
#
|
56
|
-
# This calls {#parse} to process the command-line arguments,
|
57
|
-
# then delegates to {#execute}.
|
58
|
-
#
|
59
|
-
# @param [Array<String>] arguments command-line arguments
|
60
|
-
#
|
61
|
-
def run(arguments)
|
62
|
-
parse(arguments)
|
63
|
-
execute
|
64
|
-
execute_subcommands
|
65
|
-
end
|
66
|
-
|
67
|
-
# Execute the command (assuming that all options/parameters have been set).
|
68
|
-
#
|
69
|
-
# This method is designed to be overridden in sub-classes.
|
70
|
-
#
|
71
|
-
def execute
|
72
|
-
raise "you need to define #execute"
|
73
|
-
end
|
74
|
-
|
75
|
-
def execute_subcommands
|
76
|
-
if self.class.has_subcommands?
|
77
|
-
execute_subcommand
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# @return [String] usage documentation for this command
|
82
|
-
#
|
83
|
-
def help
|
84
|
-
self.class.help(invocation_path)
|
85
|
-
end
|
86
|
-
|
87
|
-
include Clamp::Option::Parsing
|
88
|
-
include Clamp::Parameter::Parsing
|
89
|
-
include Clamp::Subcommand::Execution
|
90
|
-
|
91
|
-
protected
|
92
|
-
|
93
|
-
attr_accessor :context
|
94
|
-
|
95
|
-
private
|
96
|
-
|
97
|
-
def signal_usage_error(message)
|
98
|
-
e = UsageError.new(message, self)
|
99
|
-
e.set_backtrace(caller)
|
100
|
-
raise e
|
101
|
-
end
|
102
|
-
|
103
|
-
def help_requested=(value)
|
104
|
-
raise Clamp::HelpWanted.new(self)
|
105
|
-
end
|
106
|
-
|
107
|
-
class << self
|
108
|
-
|
109
|
-
include Clamp::Option::Declaration
|
110
|
-
include Clamp::Parameter::Declaration
|
111
|
-
include Clamp::Subcommand::Declaration
|
112
|
-
include Help
|
113
|
-
|
114
|
-
# Create an instance of this command class, and run it.
|
115
|
-
#
|
116
|
-
# @param [String] invocation_path the path used to invoke the command
|
117
|
-
# @param [Array<String>] arguments command-line arguments
|
118
|
-
# @param [Hash] context additional data the command may need
|
119
|
-
#
|
120
|
-
def run(invocation_path = File.basename($0), arguments = ARGV, context = {})
|
121
|
-
begin
|
122
|
-
new(invocation_path, context).run(arguments)
|
123
|
-
rescue Clamp::UsageError => e
|
124
|
-
$stderr.puts "ERROR: #{e.message}"
|
125
|
-
$stderr.puts ""
|
126
|
-
$stderr.puts "See: '#{e.command.invocation_path} --help'"
|
127
|
-
exit(1)
|
128
|
-
rescue Clamp::HelpWanted => e
|
129
|
-
puts e.command.help
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|
data/lib/wpb/clamp/errors.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
|
3
|
-
class Error < StandardError
|
4
|
-
|
5
|
-
def initialize(message, command)
|
6
|
-
super(message)
|
7
|
-
@command = command
|
8
|
-
end
|
9
|
-
|
10
|
-
attr_reader :command
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
# raise to signal incorrect command usage
|
15
|
-
class UsageError < Error; end
|
16
|
-
|
17
|
-
# raise to request usage help
|
18
|
-
class HelpWanted < Error
|
19
|
-
|
20
|
-
def initialize(command)
|
21
|
-
super("I need help", command)
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
data/lib/wpb/clamp/help.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'stringio'
|
2
|
-
|
3
|
-
module Clamp
|
4
|
-
|
5
|
-
module Help
|
6
|
-
|
7
|
-
def usage(usage)
|
8
|
-
@declared_usage_descriptions ||= []
|
9
|
-
@declared_usage_descriptions << usage
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :declared_usage_descriptions
|
13
|
-
|
14
|
-
def description=(description)
|
15
|
-
@description = description.dup
|
16
|
-
if @description =~ /^\A\n*( +)/
|
17
|
-
indent = $1
|
18
|
-
@description.gsub!(/^#{indent}/, '')
|
19
|
-
end
|
20
|
-
@description.strip!
|
21
|
-
end
|
22
|
-
|
23
|
-
attr_reader :description
|
24
|
-
|
25
|
-
def derived_usage_description
|
26
|
-
parts = parameters.map { |a| a.name }
|
27
|
-
parts.unshift("[OPTIONS]") if has_options?
|
28
|
-
parts.join(" ")
|
29
|
-
end
|
30
|
-
|
31
|
-
def usage_descriptions
|
32
|
-
declared_usage_descriptions || [derived_usage_description]
|
33
|
-
end
|
34
|
-
|
35
|
-
def help(invocation_path)
|
36
|
-
help = StringIO.new
|
37
|
-
help.puts "Usage:"
|
38
|
-
usage_descriptions.each_with_index do |usage, i|
|
39
|
-
help.puts " #{invocation_path} #{usage}".rstrip
|
40
|
-
end
|
41
|
-
if description
|
42
|
-
help.puts ""
|
43
|
-
help.puts description.gsub(/^/, " ")
|
44
|
-
end
|
45
|
-
detail_format = " %-29s %s"
|
46
|
-
if has_parameters?
|
47
|
-
help.puts "\nParameters:"
|
48
|
-
parameters.each do |parameter|
|
49
|
-
help.puts detail_format % parameter.help
|
50
|
-
end
|
51
|
-
end
|
52
|
-
if has_subcommands?
|
53
|
-
help.puts "\nSubcommands:"
|
54
|
-
recognised_subcommands.each do |subcommand|
|
55
|
-
help.puts detail_format % subcommand.help
|
56
|
-
end
|
57
|
-
end
|
58
|
-
if has_options?
|
59
|
-
help.puts "\nOptions:"
|
60
|
-
recognised_options.each do |option|
|
61
|
-
help.puts detail_format % option.help
|
62
|
-
end
|
63
|
-
end
|
64
|
-
help.string
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'clamp/attribute_declaration'
|
2
|
-
require 'clamp/option'
|
3
|
-
|
4
|
-
module Clamp
|
5
|
-
class Option
|
6
|
-
|
7
|
-
module Declaration
|
8
|
-
|
9
|
-
include Clamp::AttributeDeclaration
|
10
|
-
|
11
|
-
def option(switches, type, description, opts = {}, &block)
|
12
|
-
option = Clamp::Option.new(switches, type, description, opts)
|
13
|
-
declared_options << option
|
14
|
-
define_accessors_for(option, &block)
|
15
|
-
end
|
16
|
-
|
17
|
-
def has_options?
|
18
|
-
!documented_options.empty?
|
19
|
-
end
|
20
|
-
|
21
|
-
def find_option(switch)
|
22
|
-
recognised_options.find { |o| o.handles?(switch) }
|
23
|
-
end
|
24
|
-
|
25
|
-
def declared_options
|
26
|
-
@declared_options ||= []
|
27
|
-
end
|
28
|
-
|
29
|
-
def documented_options
|
30
|
-
declared_options + inherited_declared_options
|
31
|
-
end
|
32
|
-
|
33
|
-
def recognised_options
|
34
|
-
documented_options + standard_options
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def inherited_declared_options
|
40
|
-
ancestors.inject([]) do |options, ancestor|
|
41
|
-
if ancestor.kind_of?(Clamp::Option::Declaration)
|
42
|
-
options + ancestor.declared_options
|
43
|
-
else
|
44
|
-
options
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
HELP_OPTION = Clamp::Option.new("--help", :flag, "print help", :attribute_name => :help_requested)
|
50
|
-
|
51
|
-
def standard_options
|
52
|
-
[HELP_OPTION]
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
class Option
|
3
|
-
|
4
|
-
module Parsing
|
5
|
-
|
6
|
-
protected
|
7
|
-
|
8
|
-
def parse_options
|
9
|
-
while remaining_arguments.first =~ /^-/
|
10
|
-
|
11
|
-
switch = remaining_arguments.shift
|
12
|
-
break if switch == "--"
|
13
|
-
|
14
|
-
case switch
|
15
|
-
when /^(-\w)(.+)$/ # combined short options
|
16
|
-
switch = $1
|
17
|
-
remaining_arguments.unshift("-#{$2}")
|
18
|
-
when /^(--[^=]+)=(.*)/
|
19
|
-
switch = $1
|
20
|
-
remaining_arguments.unshift($2)
|
21
|
-
end
|
22
|
-
|
23
|
-
option = find_option(switch)
|
24
|
-
value = option.extract_value(switch, remaining_arguments)
|
25
|
-
|
26
|
-
begin
|
27
|
-
send("#{option.attribute_name}=", value)
|
28
|
-
rescue ArgumentError => e
|
29
|
-
signal_usage_error "option '#{switch}': #{e.message}"
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def find_option(switch)
|
38
|
-
self.class.find_option(switch) ||
|
39
|
-
signal_usage_error("Unrecognised option '#{switch}'")
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
data/lib/wpb/clamp/option.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'clamp/attribute'
|
2
|
-
|
3
|
-
module Clamp
|
4
|
-
|
5
|
-
class Option < Attribute
|
6
|
-
|
7
|
-
def initialize(switches, type, description, options = {})
|
8
|
-
@switches = Array(switches)
|
9
|
-
@type = type
|
10
|
-
@description = description
|
11
|
-
if options.has_key?(:attribute_name)
|
12
|
-
@attribute_name = options[:attribute_name].to_s
|
13
|
-
end
|
14
|
-
if options.has_key?(:default)
|
15
|
-
@default_value = options[:default]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_reader :switches, :type
|
20
|
-
|
21
|
-
def attribute_name
|
22
|
-
@attribute_name ||= long_switch.sub(/^--(\[no-\])?/, '').tr('-', '_')
|
23
|
-
end
|
24
|
-
|
25
|
-
def long_switch
|
26
|
-
switches.find { |switch| switch =~ /^--/ }
|
27
|
-
end
|
28
|
-
|
29
|
-
def handles?(switch)
|
30
|
-
recognised_switches.member?(switch)
|
31
|
-
end
|
32
|
-
|
33
|
-
def flag?
|
34
|
-
@type == :flag
|
35
|
-
end
|
36
|
-
|
37
|
-
def flag_value(switch)
|
38
|
-
!(switch =~ /^--no-(.*)/ && switches.member?("--\[no-\]#{$1}"))
|
39
|
-
end
|
40
|
-
|
41
|
-
def read_method
|
42
|
-
if flag?
|
43
|
-
super + "?"
|
44
|
-
else
|
45
|
-
super
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def extract_value(switch, arguments)
|
50
|
-
if flag?
|
51
|
-
flag_value(switch)
|
52
|
-
else
|
53
|
-
arguments.shift
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def help_lhs
|
58
|
-
lhs = switches.join(", ")
|
59
|
-
lhs += " " + type unless flag?
|
60
|
-
lhs
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def recognised_switches
|
66
|
-
switches.map do |switch|
|
67
|
-
if switch =~ /^--\[no-\](.*)/
|
68
|
-
["--#{$1}", "--no-#{$1}"]
|
69
|
-
else
|
70
|
-
switch
|
71
|
-
end
|
72
|
-
end.flatten
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'clamp/attribute_declaration'
|
2
|
-
require 'clamp/parameter'
|
3
|
-
|
4
|
-
module Clamp
|
5
|
-
class Parameter
|
6
|
-
|
7
|
-
module Declaration
|
8
|
-
|
9
|
-
include Clamp::AttributeDeclaration
|
10
|
-
|
11
|
-
def parameters
|
12
|
-
@parameters ||= []
|
13
|
-
end
|
14
|
-
|
15
|
-
def has_parameters?
|
16
|
-
!parameters.empty?
|
17
|
-
end
|
18
|
-
|
19
|
-
def parameter(name, description, options = {}, &block)
|
20
|
-
parameter = Parameter.new(name, description, options)
|
21
|
-
parameters << parameter
|
22
|
-
define_accessors_for(parameter, &block)
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
class Parameter
|
3
|
-
|
4
|
-
module Parsing
|
5
|
-
|
6
|
-
protected
|
7
|
-
|
8
|
-
def parse_parameters
|
9
|
-
|
10
|
-
self.class.parameters.each do |parameter|
|
11
|
-
begin
|
12
|
-
value = parameter.consume(remaining_arguments)
|
13
|
-
send("#{parameter.attribute_name}=", value) unless value.nil?
|
14
|
-
rescue ArgumentError => e
|
15
|
-
signal_usage_error "parameter '#{parameter.name}': #{e.message}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
unless remaining_arguments.empty?
|
20
|
-
signal_usage_error "too many arguments"
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|
data/lib/wpb/clamp/parameter.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'clamp/attribute'
|
2
|
-
|
3
|
-
module Clamp
|
4
|
-
|
5
|
-
class Parameter < Attribute
|
6
|
-
|
7
|
-
def initialize(name, description, options = {})
|
8
|
-
@name = name
|
9
|
-
@description = description
|
10
|
-
infer_attribute_name_and_multiplicity
|
11
|
-
if options.has_key?(:attribute_name)
|
12
|
-
@attribute_name = options[:attribute_name].to_s
|
13
|
-
end
|
14
|
-
if options.has_key?(:default)
|
15
|
-
@default_value = options[:default]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
attr_reader :name, :attribute_name
|
20
|
-
|
21
|
-
def help_lhs
|
22
|
-
name
|
23
|
-
end
|
24
|
-
|
25
|
-
def consume(arguments)
|
26
|
-
if required? && arguments.empty?
|
27
|
-
raise ArgumentError, "no value provided"
|
28
|
-
end
|
29
|
-
if multivalued?
|
30
|
-
arguments.shift(arguments.length)
|
31
|
-
else
|
32
|
-
arguments.shift
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
NAME_PATTERN = "([A-Za-z0-9_-]+)"
|
39
|
-
|
40
|
-
def infer_attribute_name_and_multiplicity
|
41
|
-
case @name
|
42
|
-
when /^\[#{NAME_PATTERN}\]$/
|
43
|
-
@attribute_name = $1
|
44
|
-
when /^\[#{NAME_PATTERN}\] ...$/
|
45
|
-
@attribute_name = "#{$1}_list"
|
46
|
-
@multivalued = true
|
47
|
-
when /^#{NAME_PATTERN} ...$/
|
48
|
-
@attribute_name = "#{$1}_list"
|
49
|
-
@multivalued = true
|
50
|
-
@required = true
|
51
|
-
when /^#{NAME_PATTERN}$/
|
52
|
-
@attribute_name = @name
|
53
|
-
@required = true
|
54
|
-
else
|
55
|
-
raise "invalid parameter name: '#{name}'"
|
56
|
-
end
|
57
|
-
@attribute_name = @attribute_name.downcase.tr('-', '_')
|
58
|
-
end
|
59
|
-
|
60
|
-
def multivalued?
|
61
|
-
@multivalued
|
62
|
-
end
|
63
|
-
|
64
|
-
def required?
|
65
|
-
@required
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'clamp/subcommand'
|
2
|
-
|
3
|
-
module Clamp
|
4
|
-
class Subcommand
|
5
|
-
|
6
|
-
module Declaration
|
7
|
-
|
8
|
-
def recognised_subcommands
|
9
|
-
@recognised_subcommands ||= []
|
10
|
-
end
|
11
|
-
|
12
|
-
def subcommand(name, description, subcommand_class = self, &block)
|
13
|
-
has_subcommands!
|
14
|
-
if block
|
15
|
-
# generate a anonymous sub-class
|
16
|
-
subcommand_class = Class.new(subcommand_class, &block)
|
17
|
-
end
|
18
|
-
recognised_subcommands << Subcommand.new(name, description, subcommand_class)
|
19
|
-
end
|
20
|
-
|
21
|
-
def has_subcommands?
|
22
|
-
!recognised_subcommands.empty?
|
23
|
-
end
|
24
|
-
|
25
|
-
def find_subcommand(name)
|
26
|
-
recognised_subcommands.find { |sc| sc.is_called?(name) }
|
27
|
-
end
|
28
|
-
|
29
|
-
def has_subcommands!
|
30
|
-
unless @has_subcommands
|
31
|
-
parameter "[SUBCOMMAND]", "subcommand name", :attribute_name => :subcommand_name
|
32
|
-
parameter "[ARGS] ...", "subcommand arguments", :attribute_name => :subcommand_arguments
|
33
|
-
@has_subcommands = true
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
class Subcommand
|
3
|
-
|
4
|
-
module Execution
|
5
|
-
|
6
|
-
protected
|
7
|
-
|
8
|
-
def execute_subcommand
|
9
|
-
if subcommand_name
|
10
|
-
subcommand_class = find_subcommand_class(subcommand_name)
|
11
|
-
subcommand = subcommand_class.new("#{invocation_path} #{subcommand_name}", context)
|
12
|
-
self.class.recognised_options.each do |option|
|
13
|
-
option_set = instance_variable_defined?(option.ivar_name)
|
14
|
-
if option_set && subcommand.respond_to?(option.write_method)
|
15
|
-
subcommand.send(option.write_method, self.send(option.read_method))
|
16
|
-
end
|
17
|
-
end
|
18
|
-
subcommand.run(subcommand_arguments)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def find_subcommand(name)
|
25
|
-
self.class.find_subcommand(name) ||
|
26
|
-
signal_usage_error("No such sub-command '#{name}'")
|
27
|
-
end
|
28
|
-
|
29
|
-
def find_subcommand_class(name)
|
30
|
-
subcommand = find_subcommand(name)
|
31
|
-
subcommand.subcommand_class if subcommand
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
data/lib/wpb/clamp/subcommand.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Clamp
|
2
|
-
|
3
|
-
class Subcommand < Struct.new(:name, :description, :subcommand_class)
|
4
|
-
|
5
|
-
def initialize(names, description, subcommand_class)
|
6
|
-
@names = Array(names)
|
7
|
-
@description = description
|
8
|
-
@subcommand_class = subcommand_class
|
9
|
-
end
|
10
|
-
|
11
|
-
attr_reader :names, :description, :subcommand_class
|
12
|
-
|
13
|
-
def is_called?(name)
|
14
|
-
names.member?(name)
|
15
|
-
end
|
16
|
-
|
17
|
-
def help
|
18
|
-
[names.join(", "), description]
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
data/lib/wpb/clamp/version.rb
DELETED