peony 0.1.6 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 16e0e1fcade7821bc142d98e215ccb6d43c9eed9
4
- data.tar.gz: 785136aaae5e9f7d0171b2a28e80c38efa0fb60d
3
+ metadata.gz: 86659b2347d22d0bab806ea9121a25483b23234c
4
+ data.tar.gz: e00f2bb4bcaf222ea29a555214f0ce8e9750eab3
5
5
  SHA512:
6
- metadata.gz: 6e635b053ed9a7690aee9a2d1cec7abdac7170cad29064901e4bf5692dec2405db38a0a6308d0f2defeee1cc9d4e2cc86e81ce31bb1f9dc57028a6a6563e7db2
7
- data.tar.gz: f5aa7e55ee1d3c7497c5845446e654f8d15f6fffe08a4a801b83d7f6554ec155e92eabdfe01f1c912305452b6955fe27b832b668d193d6aaeb85bb9fe6f803fb
6
+ metadata.gz: ad1dc485f76cba8e7ab763a0b207dab4fa175feef772719ac3a9dd9d5e8b0b6517b2551bbab1a0bf90b3c3d9b202a7155f336907f5291391e50bbb10cd45bd02
7
+ data.tar.gz: 4174ea8aa81806539ef11b7192bfcfe218b2cc73f913acb98feedad1f0651c443ab5422d9957c56ed463e6d35433a673c039f602f20234bc81b878924105792d
data/README.md CHANGED
@@ -77,13 +77,31 @@ you can just add the following code to your Rakefile
77
77
  load f
78
78
  end
79
79
 
80
+
80
81
 
82
+ ## Directory Convension
81
83
 
84
+ ### template and recipes
85
+ <pre>
86
+ |--peony_root
87
+ |--Rakefile
88
+ |--recipes
89
+ |--nginx.rake
90
+ |--pgsql.rake
91
+ |--...
92
+ |--templates
93
+ |--nginx.conf.erb
94
+ |--pgsql.conf.erb
95
+ |--...
96
+ </pre>
82
97
 
98
+ if you want to run peony command in any directory, you can add peony_root to your environment.
83
99
 
100
+ export peony_root=/u/bin
101
+
102
+
84
103
 
85
-
86
- ## Directory Convension
104
+ ### generated directory convension
87
105
  <pre>
88
106
 
89
107
  |--u
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
data/bin/peony CHANGED
@@ -20,20 +20,24 @@ if ARGV.delete('--simulate') || ARGV.delete('-S')
20
20
  ENV['simulate'] = '1'
21
21
  end
22
22
 
23
+ if ARGV.delete('--dry-run') || ARGV.delete('-D')
24
+ ENV['dry-run'] = '1'
25
+ end
26
+
23
27
  Rake.application.instance_eval do
24
28
  standard_exception_handling do
25
29
 
26
30
  init 'peony'
27
31
 
28
- @rakefiles += ['Peonyfile', 'peonyfile']
29
- options.rakelib += ["recipes/**"]
32
+ @rakefiles += %w{Peonyfile peonyfile}
33
+ options.rakelib += %w{recipes/**}
30
34
 
31
35
  # Load the Peony DSL.
32
36
  require 'peony/rake'
33
37
 
34
38
  load_rakefile
35
39
 
36
- Dir.glob(File.expand_path("../recipes/**/*.rake", __dir__)) do|fn|
40
+ Dir.glob(File.expand_path('../recipes/**/*.rake', __dir__)) do|fn|
37
41
  load fn
38
42
  end
39
43
 
@@ -0,0 +1,178 @@
1
+ module Peony
2
+ module Actions
3
+
4
+ def destination_root
5
+ @destination_stack ||= [File.expand_path(Dir.pwd || '')]
6
+ @destination_stack.last
7
+ end
8
+
9
+ # Returns the given path relative to the absolute root (ie, root where
10
+ # the script started).
11
+ #
12
+ def relative_to_original_destination_root(path, remove_dot = true)
13
+ path = path.dup
14
+ if path.gsub!(@destination_stack[0], '.')
15
+ remove_dot ? (path[2..-1] || '') : path
16
+ else
17
+ path
18
+ end
19
+ end
20
+
21
+ def mkdir_p(*dirs)
22
+ dirs.each do|dir|
23
+ say "mkdir #{dir}", :yellow, true
24
+ FileUtils.mkdir_p(dir) if !FileTest.exists?(dir)
25
+ fail "#{dir} must be a directory!" unless FileTest.directory?(dir)
26
+ end
27
+ end
28
+
29
+ def sudo(cmd)
30
+ run "sudo #{cmd}"
31
+ end
32
+
33
+ # ### report_time
34
+ # Report time elapsed in the block.
35
+ # Returns the output of the block.
36
+ #
37
+ # report_time do
38
+ # sleep 2
39
+ # # do other things
40
+ # end
41
+ #
42
+ # # Output:
43
+ # # Elapsed time: 2.00 seconds
44
+ def report_time(&blk)
45
+ time, output = measure &blk
46
+ say 'Elapsed time: %.2f seconds' % [time], :yellow
47
+ output
48
+ end
49
+
50
+ # ### measure
51
+ # Measures the time (in seconds) a block takes.
52
+ # Returns a [time, output] tuple.
53
+ def measure(&blk)
54
+ t = Time.now
55
+ output = yield
56
+ [Time.now - t, output]
57
+ end
58
+
59
+
60
+ # ### invoke
61
+ # Invokes another Rake task.
62
+ #
63
+ # Invokes the task given in `task`. Returns nothing.
64
+ #
65
+ # invoke :'git:clone'
66
+ # invoke :restart
67
+ #
68
+ # Options:
69
+ # reenable (bool) - Execute the task even next time.
70
+ #
71
+ def invoke(task, config = {})
72
+ Rake.application.invoke_task task
73
+ Rake::Task[task].reenable if config[:reenable]
74
+ end
75
+
76
+
77
+ # Do something in the root or on a provided subfolder. If a relative path
78
+ # is given it's referenced from the current root. The full path is yielded
79
+ # to the block you provide. The path is set back to the previous path when
80
+ # the method exits.
81
+ #
82
+ # ==== Parameters
83
+ # dir<String>:: the directory to move to.
84
+ # config<Hash>:: give :verbose => true to log and use padding.
85
+ #
86
+ def inside(dir='', config={}, &block)
87
+ verbose = config.fetch(:verbose, false)
88
+ dry_run = ENV['dry-run']
89
+
90
+ say_status :inside, dir, verbose
91
+ self.padding_up if verbose
92
+ @destination_stack.push File.expand_path(dir, destination_root)
93
+
94
+ # If the directory doesnt exist and we're not pretending
95
+ if !File.exist?(destination_root) && !pretend
96
+ FileUtils.mkdir_p(destination_root)
97
+ end
98
+
99
+ if dry_run
100
+ # In dry_run mode, just yield down to the block
101
+ block.arity == 1 ? yield(destination_root) : yield
102
+ else
103
+ FileUtils.cd(destination_root) { block.arity == 1 ? yield(destination_root) : yield }
104
+ end
105
+
106
+ @destination_stack.pop
107
+ self.padding_down if verbose
108
+ end
109
+
110
+
111
+ # Goes to the root and execute the given block.
112
+ #
113
+ def in_root
114
+ inside(@destination_stack.first) { yield }
115
+ end
116
+
117
+ # Loads an external file and execute it in the instance binding.
118
+ #
119
+ # ==== Parameters
120
+ # path<String>:: The path to the file to execute. Can be a web address or
121
+ # a relative path from the source root.
122
+ #
123
+ # ==== Examples
124
+ #
125
+ # apply "http://gist.github.com/103208"
126
+ #
127
+ # apply "recipes/jquery.rb"
128
+ #
129
+ def apply(path, config={})
130
+ verbose = config.fetch(:verbose, true)
131
+ is_uri = path =~ /^https?\:\/\//
132
+ path = find_recipes(path).first unless is_uri
133
+
134
+ say_status :apply, path, verbose
135
+ self.padding_up if verbose
136
+
137
+ if is_uri
138
+ contents = open(path, 'Accept' => 'application/x-peony-template') {|io| io.read }
139
+ else
140
+ contents = open(path) {|io| io.read }
141
+ end
142
+
143
+ instance_eval(contents, path)
144
+ self.padding_down if verbose
145
+ end
146
+
147
+ # Executes a command returning the contents of the command.
148
+ #
149
+ # ==== Parameters
150
+ # command<String>:: the command to be executed.
151
+ # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
152
+ # to append an executable to command executation.
153
+ #
154
+ # ==== Example
155
+ #
156
+ # inside('vendor') do
157
+ # run('ln -s ~/edge rails')
158
+ # end
159
+ #
160
+ def run(command, config={})
161
+ destination = relative_to_original_destination_root(destination_root, false)
162
+ desc = "#{command} from #{destination.inspect}"
163
+
164
+ if config[:with]
165
+ desc = "#{File.basename(config[:with].to_s)} #{desc}"
166
+ command = "#{config[:with]} #{command}"
167
+ end
168
+
169
+ say_status :run, desc, config.fetch(:verbose, true)
170
+
171
+ unless ENV['dry-run']
172
+ config[:capture] ? `#{command}` : system("#{command}")
173
+ end
174
+ end
175
+
176
+ end
177
+ end
178
+
@@ -1,11 +1,14 @@
1
+ require 'rake'
2
+
1
3
  module Rake
2
4
  class Application
3
5
  alias_method :origin_find_rakefile_location, :find_rakefile_location
6
+
4
7
  def find_rakefile_location
5
8
  ret = origin_find_rakefile_location
6
9
  unless ret
7
- if ENV["peony_root"]
8
- Dir.chdir(ENV["peony_root"])
10
+ if ENV['peony_root']
11
+ Dir.chdir(ENV['peony_root'])
9
12
  if fn = have_rakefile
10
13
  ret = [fn, Dir.pwd]
11
14
  end
data/lib/peony/default.rb CHANGED
@@ -1,21 +1,21 @@
1
- set_default :base_dir, "/u"
2
- set_default :var_dir, ->{"#{base_dir}/var"}
3
- set_default :etc_dir, ->{"#{base_dir}/etc"}
4
- set_default :share_dir, ->{"#{base_dir}/share"}
5
- set_default :run_dir, ->{"#{var_dir}/run"}
6
- set_default :tmp_dir, ->{"#{var_dir}/tmp"}
7
- set_default :log_dir, ->{"#{var_dir}/log"}
8
- set_default :www_dir, ->{"#{var_dir}/www"}
9
- set_default :data_dir, ->{"#{var_dir}/data"}
1
+ set_default :base_dir, "/u"
2
+ set_default :var_dir, ->{ "#{base_dir}/var" }
3
+ set_default :etc_dir, ->{ "#{base_dir}/etc" }
4
+ set_default :share_dir, ->{ "#{base_dir}/share" }
5
+ set_default :run_dir, ->{ "#{var_dir}/run" }
6
+ set_default :tmp_dir, ->{ "#{var_dir}/tmp" }
7
+ set_default :log_dir, ->{ "#{var_dir}/log" }
8
+ set_default :www_dir, ->{ "#{var_dir}/www" }
9
+ set_default :data_dir, ->{ "#{var_dir}/data" }
10
10
 
11
- set_default :user, "James"
12
- set_default :group, "admin"
11
+ set_default :user, 'james'
12
+ set_default :group, 'admin'
13
13
 
14
14
  namespace :settings do
15
- desc "List all the settings."
15
+ desc 'List all the settings.'
16
16
  task :list do
17
17
  settings.each do|k, v|
18
- puts "#{k} = #{settings.send(k)}"
18
+ say "#{k} = #{settings.send(k)}", :green, true
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,35 @@
1
+ module Peony
2
+ module LineEditor
3
+ class Basic
4
+ attr_reader :prompt, :options
5
+
6
+ def self.available?
7
+ true
8
+ end
9
+
10
+ def initialize(prompt, options)
11
+ @prompt = prompt
12
+ @options = options
13
+ end
14
+
15
+ def readline
16
+ $stdout.print(prompt)
17
+ get_input
18
+ end
19
+
20
+ private
21
+
22
+ def get_input
23
+ if echo?
24
+ $stdin.gets
25
+ else
26
+ $stdin.noecho(&:gets)
27
+ end
28
+ end
29
+
30
+ def echo?
31
+ options.fetch(:echo, true)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,88 @@
1
+ begin
2
+ require 'readline'
3
+ rescue LoadError
4
+ end
5
+
6
+ module Peony
7
+ module LineEditor
8
+ class Readline < Basic
9
+ def self.available?
10
+ Object.const_defined?(:Readline)
11
+ end
12
+
13
+ def readline
14
+ if echo?
15
+ ::Readline.completion_append_character = nil
16
+ # Ruby 1.8.7 does not allow Readline.completion_proc= to receive nil.
17
+ if complete = completion_proc
18
+ ::Readline.completion_proc = complete
19
+ end
20
+ ::Readline.readline(prompt, add_to_history?)
21
+ else
22
+ super
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def add_to_history?
29
+ options.fetch(:add_to_history, true)
30
+ end
31
+
32
+ def completion_proc
33
+ if use_path_completion?
34
+ proc { |text| PathCompletion.new(text).matches }
35
+ elsif completion_options.any?
36
+ proc do |text|
37
+ completion_options.select { |option| option.start_with?(text) }
38
+ end
39
+ end
40
+ end
41
+
42
+ def completion_options
43
+ options.fetch(:limited_to, [])
44
+ end
45
+
46
+ def use_path_completion?
47
+ options.fetch(:path, false)
48
+ end
49
+
50
+ class PathCompletion
51
+ attr_reader :text
52
+ private :text
53
+
54
+ def initialize(text)
55
+ @text = text
56
+ end
57
+
58
+ def matches
59
+ relative_matches
60
+ end
61
+
62
+ private
63
+
64
+ def relative_matches
65
+ absolute_matches.map { |path| path.sub(base_path, '') }
66
+ end
67
+
68
+ def absolute_matches
69
+ Dir[glob_pattern].map do |path|
70
+ if File.directory?(path)
71
+ "#{path}/"
72
+ else
73
+ path
74
+ end
75
+ end
76
+ end
77
+
78
+ def glob_pattern
79
+ "#{base_path}#{text}*"
80
+ end
81
+
82
+ def base_path
83
+ "#{Dir.pwd}/"
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,16 @@
1
+ # The following classes's code was copied from Thor, available under MIT-LICENSE
2
+ # Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.
3
+ require 'peony/line_editor/basic'
4
+ require 'peony/line_editor/readline'
5
+
6
+ module Peony
7
+ module LineEditor
8
+ def self.readline(prompt, options = {})
9
+ best_available.new(prompt, options).readline
10
+ end
11
+
12
+ def self.best_available
13
+ [Peony::LineEditor::Readline, Peony::LineEditor::Basic].detect(&:available?)
14
+ end
15
+ end
16
+ end
data/lib/peony/rake.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  extend Peony::Utils
2
+ extend Peony::Shell
3
+ extend Peony::Actions
2
4
 
3
- require "peony/default"
5
+ require 'peony/default'