bee 0.6.1 → 0.7.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.
data/README CHANGED
@@ -25,4 +25,4 @@ or go to URL http://www.apache.org/licenses/LICENSE-2.0).
25
25
 
26
26
  = Copyright
27
27
 
28
- bee version 0.6.1 (C) Michel Casabianca & Contributors - 2006-2010
28
+ bee version 0.7.0 (C) Michel Casabianca & Contributors - 2006-2010
@@ -0,0 +1,55 @@
1
+ - build: package
2
+ default: all
3
+ description: "Generate a Sinatra project"
4
+
5
+ - properties:
6
+ - name: sinatra
7
+ - description: |
8
+ This script will create a Sinatra project. Generated build file has a
9
+ target 'run' to run the server, 'zip' to generate a distribution archive
10
+ and 'clean' to delete generated files.
11
+
12
+ - target: welcome
13
+ description: "Print information message"
14
+ script:
15
+ - print: :description
16
+
17
+ - target: prompt
18
+ depends: welcome
19
+ description: "Prompt for project information"
20
+ script:
21
+ - print: "Please answer following questions to generate the project:"
22
+ - prompt:
23
+ message: "What is the project's name?"
24
+ default: :name
25
+ property: name
26
+
27
+ - target: generate
28
+ depends: prompt
29
+ description: "Generate project"
30
+ script:
31
+ - print: "Generating project..."
32
+ - rb: |
33
+ error "A directory named '#{name}' already exists, aborting" if
34
+ File.exists?("#{here}/#{name}")
35
+ - mkdir: "#{here}/#{name}"
36
+ - erb:
37
+ src: "#{base}/sinatra/build.yml"
38
+ dest: "#{here}/#{name}/build.yml"
39
+ - cp:
40
+ src: "#{base}/sinatra/server.rb"
41
+ dest: "#{here}/#{name}/server.rb"
42
+
43
+ - target: customization
44
+ depends: generate
45
+ description: "Print information about project customization"
46
+ script:
47
+ - print: |
48
+ Project has been generated in directory '#{name}'. Type 'bee -b' to print
49
+ information about generated build file. To start server, type 'b run'. To
50
+ send a request, call URL 'http://localhost:4567/hello/world', typing
51
+ 'b call' for instance (which requires curl).
52
+ Enjoy!
53
+
54
+ - target: all
55
+ depends: [welcome, prompt, generate, customization]
@@ -0,0 +1,45 @@
1
+ - build: <%= name %>
2
+ description: Project <%= name %>
3
+ default: all
4
+
5
+ - properties:
6
+ - name: "<%= name %>"
7
+ - version: "0.0.0"
8
+ - build: "build"
9
+ - zip_prefix: "#{name}-#{version}"
10
+ - zip_file: "#{build}/#{zip_prefix}.zip"
11
+ - url: "http://localhost:4567/hello"
12
+ - clean_dirs: [:build]
13
+ - clean_files: ["**/*~", "**/.#*", "**/.DS_Store"]
14
+
15
+ - target: run
16
+ description: Run server
17
+ script:
18
+ - "./server.rb"
19
+
20
+ - target: call
21
+ description: Call server
22
+ script:
23
+ - get:
24
+ url: "#{url}/World"
25
+ prop: response
26
+ - print: :response
27
+
28
+ - target: zip
29
+ description: Generate a ZIP archive
30
+ script:
31
+ - mkdir: :build
32
+ - zip:
33
+ includes: "server.rb"
34
+ prefix: :zip_prefix
35
+ dest: :zip_file
36
+
37
+ - target: clean
38
+ description: Clean generated files
39
+ script:
40
+ - rmdir: :clean_dirs
41
+ - rm: :clean_files
42
+
43
+ - target: all
44
+ depends: [clean, zip]
45
+ description: Generate the whole project
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Sample Sinatra server. You can get sinatra typing: 'gem install sinatra'.
4
+
5
+ require 'rubygems'
6
+ require 'sinatra'
7
+
8
+ get '/hello/:name' do
9
+ "Hello #{ params[:name]}!"
10
+ end
data/lib/bee.rb CHANGED
@@ -629,6 +629,9 @@ module Bee
629
629
  # for construct
630
630
  elsif construct.keys.include?('for')
631
631
  construct_for(construct, dry)
632
+ # try construct
633
+ elsif construct.keys.include?('try')
634
+ construct_try(construct, dry)
632
635
  else
633
636
  error "Unknown construct '#{construct.keys.join('-')}'"
634
637
  end
@@ -711,6 +714,29 @@ module Bee
711
714
  end
712
715
  end
713
716
 
717
+ # Run try-catch construct.
718
+ # - task: the construct as a hash.
719
+ # - dry: tells if we run in dry mode.
720
+ def construct_try(task, dry)
721
+ # test entries
722
+ error "Try-catch construct must include 'catch' entry" if
723
+ not task.keys.include?('catch')
724
+ unknown_keys = task.keys - ['try', 'catch']
725
+ error "Try-catch construct may only include 'try' and 'catch' entries" if
726
+ unknown_keys.length > 0
727
+ error "Try entry in try-catch construct must be a list" if
728
+ not task['try'].kind_of?(Array)
729
+ error "Catch entry in try-catch construct must be a list" if
730
+ not task['catch'].kind_of?(Array)
731
+ # try and catch errors
732
+ begin
733
+ run_block(task['try'], dry)
734
+ rescue
735
+ @targets.build.listener.recover if @targets.build.listener
736
+ run_block(task['catch'], dry)
737
+ end
738
+ end
739
+
714
740
  # Run a block, that is a list of tasks.
715
741
  # - block: the block to run as a list of tasks.
716
742
  # - dry: tells if we run in dry mode.
@@ -776,7 +802,7 @@ module Bee
776
802
 
777
803
  # Return list of properties (as local variables of binding).
778
804
  def properties
779
- return eval('local_variables', @context_binding)
805
+ return eval('local_variables', @context_binding).map{ |var| var.to_s }
780
806
  end
781
807
 
782
808
  # Evaluate a script in context.
@@ -60,7 +60,7 @@ targets Targets to run (default target if omitted).'
60
60
  | |__ ___ ___
61
61
  ____ | '_ \ / _ \/ _ \ _____ _____ _____ _____ _____ _____ _____ _____ _____
62
62
  |____| | |_) | __/ __/ |_____|_____|_____|_____|_____|_____|_____|_____|_____|
63
- |_.__/ \___|\___| 0.6.1 http://bee.rubyforge.org
63
+ |_.__/ \___|\___| 0.7.0 http://bee.rubyforge.org
64
64
 
65
65
  EOF
66
66
 
@@ -621,6 +621,11 @@ EOF
621
621
  raise Bee::Util::BuildError.new(message)
622
622
  end
623
623
 
624
+ # Recover from a previous error (catching it for instance).
625
+ def recover
626
+ @success = true
627
+ end
628
+
624
629
  # Print text on the console.
625
630
  # - text: text to print.
626
631
  def print(text)
@@ -73,6 +73,7 @@ module Bee
73
73
  when :string_or_array
74
74
  error "#{task} '#{param}' parameter must be a string or an array" unless
75
75
  params[param.to_s].kind_of?(String) or params[param.to_s].kind_of?(Array)
76
+ params[param.to_s] = Array(params[param.to_s])
76
77
  when :string_or_integer
77
78
  error "#{task} '#{param}' parameter must be a string or an integer" unless
78
79
  params[param.to_s].kind_of?(String) or params[param.to_s].kind_of?(Integer)
@@ -119,6 +120,7 @@ module Bee
119
120
  Dir.chdir(root) if root
120
121
  included = []
121
122
  includes = '**/*' if not includes
123
+ includes = Array(includes)
122
124
  for include in includes
123
125
  error "includes must be a glob or a list of globs" unless
124
126
  include.kind_of?(String)
@@ -18,6 +18,7 @@ require 'bee_task'
18
18
  require 'bee_util'
19
19
  require 'erb'
20
20
  require 'fileutils'
21
+ require 'net/smtp'
21
22
 
22
23
  module Bee
23
24
 
@@ -130,6 +131,21 @@ module Bee
130
131
  @build.context.set_property(property, value)
131
132
  end
132
133
 
134
+ # Trow a build error with a given message.
135
+ #
136
+ # - message: the error message. Will be printed on the console as the
137
+ # build failure reason.
138
+ #
139
+ # Example
140
+ #
141
+ # - if: "not File.exists?('/etc/config')"
142
+ # then:
143
+ # - throw: "No /etc/config file found!"
144
+ def throw(message)
145
+ error "throw parameter must be a string" if not message.kind_of?(String)
146
+ error message
147
+ end
148
+
133
149
  # Get a given URL and store its content in a given file. Parameters
134
150
  # is a Hash with following entries:
135
151
  #
@@ -137,6 +153,8 @@ module Bee
137
153
  # - dest: destination file. Optional, defaults to retrieved file name
138
154
  # in current directory. If destination is a directory, file is saved
139
155
  # in destination directory with the name of the retrieved file.
156
+ # - prop: Property to set with content of the response body. Optional
157
+ # defaults to output in a file.
140
158
  # - limit: the redirections limit. Optional, defaults to 10.
141
159
  #
142
160
  # Example
@@ -145,19 +163,23 @@ module Bee
145
163
  # url: http://rubyforge.org/frs/download.php/22185/bee-0.4.0.zip
146
164
  def get(parameters)
147
165
  params_desc = {
148
- :url => { :mandatory => true, :type => :string },
149
- :dest => { :mandatory => false, :type => :string },
150
- :limit => { :mandatory => false, :type => :integer, :default => 10 }
166
+ :url => { :mandatory => true, :type => :string },
167
+ :dest => { :mandatory => false, :type => :string },
168
+ :prop => { :mandatory => false, :type => :string },
169
+ :limit => { :mandatory => false, :type => :integer, :default => 10 }
151
170
  }
152
171
  check_parameters(parameters, params_desc)
153
172
  url = parameters[:url]
154
173
  dest = parameters[:dest]
155
- if not dest
174
+ prop = parameters[:prop]
175
+ if not dest and not prop
156
176
  destination = File.basename(url)
157
- elsif File.directory?(dest)
177
+ elsif dest and File.directory?(dest)
158
178
  destination = File.join(dest, File.basename(url))
159
- else
179
+ elsif dest
160
180
  destination = dest
181
+ else
182
+ destination = nil
161
183
  end
162
184
  limit = parameters[:limit]
163
185
  puts "Getting URL '#{url}'..."
@@ -166,12 +188,65 @@ module Bee
166
188
  rescue Exception
167
189
  error "Error getting URL: #{$!}"
168
190
  end
169
- todir = File.dirname(destination)
191
+ if destination
192
+ todir = File.dirname(destination)
193
+ begin
194
+ FileUtils.makedirs(todir) if not File.exists?(todir)
195
+ File.open(destination, 'w') { |file| file.write(content) }
196
+ rescue Exception
197
+ error "Error saving file: #{$!}"
198
+ end
199
+ end
200
+ if prop
201
+ @build.context.set_property(prop, content)
202
+ end
203
+ end
204
+
205
+
206
+ # Send an email using SMTP.
207
+ #
208
+ # - from: The sender of the email.
209
+ # - to: Recipient of the email. This may be a list of recipients.
210
+ # - subject: The subject of the email.
211
+ # - message: The body of the email.
212
+ # - smtp: The address of the SMTP server.
213
+ #
214
+ # Example
215
+ #
216
+ # - mail:
217
+ # from: "foo@bee.com"
218
+ # to: "bar@bee.com"
219
+ # subject: "Bee Release 0.6.2"
220
+ # message: "Hi! There is a new Bee release!"
221
+ # smtp: "smtp.bee.com"
222
+ def mail(parameters)
223
+ params_desc = {
224
+ :from => { :mandatory => true, :type => :string },
225
+ :to => { :mandatory => true, :type => :string_or_array },
226
+ :subject => { :mandatory => true, :type => :string },
227
+ :message => { :mandatory => true, :type => :string },
228
+ :smtp => { :mandatory => true, :type => :string },
229
+ }
230
+ check_parameters(parameters, params_desc)
231
+ from = parameters[:from]
232
+ to = Array(parameters[:to])
233
+ subject = parameters[:subject]
234
+ message = parameters[:message]
235
+ smtp = parameters[:smtp]
236
+ body = <<EOF
237
+ From: #{from}
238
+ To: #{to.join(', ')}
239
+ Subject: #{subject}
240
+
241
+ #{message}
242
+ EOF
243
+ puts "Sending email about '#{subject}'..."
170
244
  begin
171
- FileUtils.makedirs(todir) if not File.exists?(todir)
172
- File.open(destination, 'w') { |file| file.write(content) }
245
+ Net::SMTP.start(smtp) do |smtp_server|
246
+ smtp_server.send_message(body, from, to)
247
+ end
173
248
  rescue Exception
174
- error "Error saving file: #{$!}"
249
+ error "Error sending email: #{$!}"
175
250
  end
176
251
  end
177
252
 
@@ -364,6 +439,7 @@ module Bee
364
439
  def mkdir(dirs)
365
440
  error "mkdir parameter must a String or an array of Strings" unless
366
441
  dirs.kind_of?(String) or dirs.kind_of?(Array)
442
+ dirs = Array(dirs)
367
443
  for dir in dirs
368
444
  error "mkdir parameter must a String or an array of Strings" unless
369
445
  dir.kind_of?(String)
@@ -623,6 +699,7 @@ module Bee
623
699
  def rm(globs)
624
700
  error "rm parameter is a String or Array of Strings" unless
625
701
  globs.kind_of?(String) or globs.kind_of?(Array)
702
+ globs = Array(globs)
626
703
  for glob in globs
627
704
  error "rm parameter is a String or Array of Strings" unless
628
705
  glob.kind_of?(String)
@@ -646,9 +723,9 @@ module Bee
646
723
  #
647
724
  # - rmrf: :build
648
725
  def rmrf(globs)
649
- globs = [globs] if globs.kind_of?(String)
650
726
  error "rmrf parameter is a String or an Array of Strings" unless
651
727
  globs.kind_of?(String) or globs.kind_of?(Array)
728
+ globs = Array(globs)
652
729
  for glob in globs
653
730
  error "rmrf parameter is a String or an Array of Strings" unless
654
731
  glob.kind_of?(String)
@@ -676,9 +753,9 @@ module Bee
676
753
  #
677
754
  # - touch: '#{target}/classes/**/*.class'
678
755
  def touch(globs)
679
- globs = [globs] if globs.kind_of?(String)
680
756
  error "touch parameter is a String or an Array of Strings" unless
681
757
  globs.kind_of?(String) or globs.kind_of?(Array)
758
+ globs = Array(globs)
682
759
  files = []
683
760
  for glob in globs
684
761
  error "touch parameter is a String or an Array of Strings" unless
@@ -864,7 +941,6 @@ module Bee
864
941
  # dir: "test"
865
942
  def test(params)
866
943
  require 'test/unit'
867
- require 'test/unit/testresult'
868
944
  params_desc = {
869
945
  :root => { :mandatory => false, :type => :string },
870
946
  :includes => { :mandatory => true, :type => :string },
@@ -1000,7 +1076,8 @@ module Bee
1000
1076
  :root => { :mandatory => false, :type => :string },
1001
1077
  :includes => { :mandatory => true, :type => :string_or_array },
1002
1078
  :excludes => { :mandatory => false, :type => :string_or_array },
1003
- :dotmatch => { :mandatory => false, :type => :boolean, :default => false },
1079
+ :dotmatch => { :mandatory => false, :type => :boolean,
1080
+ :default => false },
1004
1081
  :dest => { :mandatory => true, :type => :string },
1005
1082
  :options => { :mandatory => false, :type => :string_or_array }
1006
1083
  }
@@ -1013,7 +1090,7 @@ module Bee
1013
1090
  options = params[:options]
1014
1091
  files = filter_files(includes, excludes, root, dotmatch)
1015
1092
  command_line = ['-S', '-o', dest]
1016
- command_line << options if options
1093
+ command_line += options if options
1017
1094
  command_line += files
1018
1095
  begin
1019
1096
  rdoc = RDoc::RDoc.new
@@ -1501,6 +1578,22 @@ module Bee
1501
1578
  def for
1502
1579
  end
1503
1580
 
1581
+ # Try construct will run the block in the 'try' entry and will switch to
1582
+ # block in the 'catch' entry if an error occurs.
1583
+ #
1584
+ # - try: the block to run.
1585
+ # - catch: the block to switch to if an error occurs.
1586
+ #
1587
+ # Example:
1588
+ #
1589
+ # - try:
1590
+ # - print: "In the try block"
1591
+ # - throw: "Something went terribly wrong!"
1592
+ # catch:
1593
+ # - print: "An error occured"
1594
+ def try
1595
+ end
1596
+
1504
1597
  end
1505
1598
 
1506
1599
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Casabianca & Contributors
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-11 00:00:00 +01:00
12
+ date: 2010-02-17 00:00:00 +01:00
13
13
  default_executable: bee
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -64,6 +64,9 @@ files:
64
64
  - egg/package/test_build_listener.rb
65
65
  - egg/package/test_suite.rb
66
66
  - egg/package.yml
67
+ - egg/sinatra/build.yml
68
+ - egg/sinatra/server.rb
69
+ - egg/sinatra.yml
67
70
  - README
68
71
  - LICENSE
69
72
  has_rdoc: true