auser-skelerl 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +24 -1
- data/README.txt +4 -0
- data/Rakefile +6 -4
- data/app_generators/appfile/USAGE +5 -0
- data/app_generators/appfile/appfile_generator.rb +61 -0
- data/app_generators/appfile/templates/appfile.app +19 -0
- data/app_generators/gen_server/USAGE +7 -0
- data/app_generators/gen_server/gen_server_generator.rb +51 -0
- data/app_generators/gen_server/templates/gen_server.erl +0 -0
- data/bin/appfile +17 -0
- data/bin/erl_runner +26 -0
- data/bin/gen_server +17 -0
- data/config/requirements.rb +3 -3
- data/examples/example_runner.rb +24 -0
- data/lib/skelerl.rb +15 -3
- data/lib/skelerl/core/object.rb +27 -0
- data/lib/skelerl/erlpers/core/array.rb +10 -0
- data/lib/skelerl/erlpers/core/object.rb +34 -0
- data/lib/skelerl/erlpers/erl_mapper.rb +66 -0
- data/lib/skelerl/erlpers/mappers/command.rb +13 -0
- data/lib/skelerl/erlpers/mappers/context.rb +39 -0
- data/lib/skelerl/erlpers/mappers/namespace.rb +8 -0
- data/lib/skelerl/init.rb +3 -0
- data/script/generate +14 -0
- data/skelerl.gemspec +11 -10
- data/tasks/{skelerl.rake → build.rake} +41 -20
- data/tasks/deployment.rake +1 -1
- data/tasks/generate.rake +5 -0
- data/test/erlpers/erl_mapper_spec.rb +113 -0
- data/test/erlpers/object_spec.rb +26 -0
- data/test/helper.rb +10 -0
- metadata +31 -5
data/Manifest.txt
CHANGED
@@ -2,16 +2,39 @@ History.txt
|
|
2
2
|
Manifest.txt
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
|
+
app_generators/appfile/USAGE
|
6
|
+
app_generators/appfile/appfile_generator.rb
|
7
|
+
app_generators/appfile/templates/appfile.app
|
8
|
+
app_generators/gen_server/USAGE
|
9
|
+
app_generators/gen_server/gen_server_generator.rb
|
10
|
+
app_generators/gen_server/templates/gen_server.erl
|
11
|
+
bin/appfile
|
5
12
|
bin/build-app
|
13
|
+
bin/erl_runner
|
14
|
+
bin/gen_server
|
6
15
|
config/hoe.rb
|
7
16
|
config/requirements.rb
|
8
17
|
ebin/packager.app
|
18
|
+
examples/example_runner.rb
|
9
19
|
include/empty
|
10
20
|
lib/skelerl.rb
|
21
|
+
lib/skelerl/core/object.rb
|
22
|
+
lib/skelerl/erlpers/core/array.rb
|
23
|
+
lib/skelerl/erlpers/core/object.rb
|
24
|
+
lib/skelerl/erlpers/erl_mapper.rb
|
25
|
+
lib/skelerl/erlpers/mappers/command.rb
|
26
|
+
lib/skelerl/erlpers/mappers/context.rb
|
27
|
+
lib/skelerl/erlpers/mappers/namespace.rb
|
28
|
+
lib/skelerl/init.rb
|
29
|
+
script/generate
|
11
30
|
setup.rb
|
12
31
|
skelerl.gemspec
|
13
32
|
src/packager.erl
|
33
|
+
tasks/build.rake
|
14
34
|
tasks/deployment.rake
|
15
35
|
tasks/environment.rake
|
16
|
-
tasks/
|
36
|
+
tasks/generate.rake
|
17
37
|
tasks/website.rake
|
38
|
+
test/erlpers/erl_mapper_spec.rb
|
39
|
+
test/erlpers/object_spec.rb
|
40
|
+
test/helper.rb
|
data/README.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
require 'config/
|
3
|
-
|
4
|
-
|
1
|
+
begin
|
2
|
+
require 'config/requirements'
|
3
|
+
require 'config/hoe' # setup Hoe + all gem configuration
|
4
|
+
rescue Exception => e
|
5
|
+
end
|
5
6
|
|
7
|
+
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class AppfileGenerator < RubiGen::Base
|
2
|
+
|
3
|
+
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
4
|
+
Config::CONFIG['ruby_install_name'])
|
5
|
+
|
6
|
+
default_options :author => nil
|
7
|
+
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
def initialize(runtime_args, runtime_options = {})
|
11
|
+
super
|
12
|
+
usage if args.empty?
|
13
|
+
@app_name = args.shift
|
14
|
+
@destination_root = File.expand_path(".")
|
15
|
+
@name = base_name
|
16
|
+
extract_options
|
17
|
+
end
|
18
|
+
|
19
|
+
def manifest
|
20
|
+
record do |m|
|
21
|
+
m.template "appfile.app", "ebin/#{@app_name}.app"
|
22
|
+
|
23
|
+
# m.dependency "install_rubigen_scripts", [destination_root, 'appfile'], :shebang => options[:shebang], :collision => :force
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def banner
|
29
|
+
<<-EOS
|
30
|
+
Creates a basic .app file
|
31
|
+
|
32
|
+
USAGE: #{spec.name} name
|
33
|
+
EOS
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_options!(opts)
|
37
|
+
opts.separator ''
|
38
|
+
opts.separator 'Options:'
|
39
|
+
# For each option below, place the default
|
40
|
+
# at the top of the file next to "default_options"
|
41
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
42
|
+
# "Some comment about this option",
|
43
|
+
# "Default: none") { |options[:author]| }
|
44
|
+
opts.on("-n", "--name", "Name the app") { |options[:app_name]| }
|
45
|
+
opts.on("-d", "--desc", "Description of the app") { |options[:description]| }
|
46
|
+
opts.on("-m", "--modules", "Modules used in the application") { |options[:modules]| }
|
47
|
+
opts.on("-r", "--registered", "Modules registered in the application") { |options[:registered]| }
|
48
|
+
opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
49
|
+
end
|
50
|
+
|
51
|
+
def extract_options
|
52
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
53
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
54
|
+
# raw instance variable value.
|
55
|
+
# @author = options[:author]
|
56
|
+
@description = options[:desc] || "Description of your project"
|
57
|
+
@version = options[:version] || "0.1"
|
58
|
+
@modules = options[:modules] || "#{@name}_app"
|
59
|
+
@registered = options[:registered] || ""
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
{application, APPNAME,
|
2
|
+
[
|
3
|
+
% Quick description of the server
|
4
|
+
{description, "Description of the application"},
|
5
|
+
% Version
|
6
|
+
{vsn, "0.0.1"},
|
7
|
+
% All modules used by the application.
|
8
|
+
{modules, []},
|
9
|
+
% All the registered names in the application
|
10
|
+
{registered, []},
|
11
|
+
% These must be started for application to run
|
12
|
+
{applications, [kernel, stdlib]},
|
13
|
+
% Environment vars
|
14
|
+
{env, []},
|
15
|
+
% Module and Args used to start
|
16
|
+
{mod, {[]}},
|
17
|
+
{start_phases, []}
|
18
|
+
]
|
19
|
+
}.
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class GenServerGenerator < RubiGen::Base
|
2
|
+
|
3
|
+
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
4
|
+
Config::CONFIG['ruby_install_name'])
|
5
|
+
|
6
|
+
default_options :author => nil
|
7
|
+
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
def initialize(runtime_args, runtime_options = {})
|
11
|
+
super
|
12
|
+
usage if args.empty?
|
13
|
+
@app_name = args.shift
|
14
|
+
@destination_root = File.expand_path(".")
|
15
|
+
@name = base_name
|
16
|
+
extract_options
|
17
|
+
end
|
18
|
+
|
19
|
+
def manifest
|
20
|
+
record do |m|
|
21
|
+
m.file "gen_server.erl"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
def banner
|
27
|
+
<<-EOS
|
28
|
+
Creates a skeleton gen_server
|
29
|
+
|
30
|
+
USAGE: #{spec.name} name
|
31
|
+
EOS
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_options!(opts)
|
35
|
+
opts.separator ''
|
36
|
+
opts.separator 'Options:'
|
37
|
+
# For each option below, place the default
|
38
|
+
# at the top of the file next to "default_options"
|
39
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
40
|
+
# "Some comment about this option",
|
41
|
+
# "Default: none") { |options[:author]| }
|
42
|
+
opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
43
|
+
end
|
44
|
+
|
45
|
+
def extract_options
|
46
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
47
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
48
|
+
# raw instance variable value.
|
49
|
+
# @author = options[:author]
|
50
|
+
end
|
51
|
+
end
|
File without changes
|
data/bin/appfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rubigen'
|
5
|
+
|
6
|
+
if %w(-v --version).include? ARGV.first
|
7
|
+
require 'appfile/version'
|
8
|
+
puts "#{File.basename($0)} #{Appfile::VERSION::STRING}"
|
9
|
+
exit(0)
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rubigen/scripts/generate'
|
13
|
+
source = RubiGen::PathSource.new(:application,
|
14
|
+
File.join(File.dirname(__FILE__), "../app_generators"))
|
15
|
+
RubiGen::Base.reset_sources
|
16
|
+
RubiGen::Base.append_sources source
|
17
|
+
RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'appfile')
|
data/bin/erl_runner
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "#{::File.dirname(__FILE__)}/../lib/skelerl"
|
3
|
+
require 'rubygems'
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
@opts = OptionParser.new
|
7
|
+
progname = File.basename(__FILE__, File.extname(__FILE__))
|
8
|
+
|
9
|
+
|
10
|
+
@opts.on('-v', '--verbose', 'Be verbose') { @verbose = true }
|
11
|
+
@opts.on('-t', '--test', 'Put in test mode') { @testing = true }
|
12
|
+
|
13
|
+
@opts.on_tail("-h", "--help", "Show this message") do
|
14
|
+
puts <<-EOP
|
15
|
+
Usage: #{progname} <filename> [options]
|
16
|
+
EOP
|
17
|
+
exit
|
18
|
+
end
|
19
|
+
|
20
|
+
@opts.parse(ARGV.dup)
|
21
|
+
|
22
|
+
instance_eval open(ARGV.pop).read
|
23
|
+
|
24
|
+
mappers.each do |mapper|
|
25
|
+
@testing ? puts(mapper.realize(@testing)) : mapper.realize(@testing)
|
26
|
+
end
|
data/bin/gen_server
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'rubigen'
|
5
|
+
|
6
|
+
if %w(-v --version).include? ARGV.first
|
7
|
+
require 'gen_server/version'
|
8
|
+
puts "#{File.basename($0)} #{GenServer::VERSION::STRING}"
|
9
|
+
exit(0)
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rubigen/scripts/generate'
|
13
|
+
source = RubiGen::PathSource.new(:application,
|
14
|
+
File.join(File.dirname(__FILE__), "../app_generators"))
|
15
|
+
RubiGen::Base.reset_sources
|
16
|
+
RubiGen::Base.append_sources source
|
17
|
+
RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'gen_server')
|
data/config/requirements.rb
CHANGED
@@ -6,9 +6,9 @@ require 'rubygems'
|
|
6
6
|
begin
|
7
7
|
require req_gem
|
8
8
|
rescue LoadError
|
9
|
-
puts "This Rakefile requires the '#{req_gem}' RubyGem."
|
10
|
-
puts "Installation: gem install #{req_gem} -y"
|
11
|
-
exit
|
9
|
+
# puts "This Rakefile requires the '#{req_gem}' RubyGem."
|
10
|
+
# puts "Installation: gem install #{req_gem} -y"
|
11
|
+
# exit
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)+"/../lib")
|
2
|
+
require "rubygems"
|
3
|
+
require "skelerl"
|
4
|
+
|
5
|
+
erlang do
|
6
|
+
testing true
|
7
|
+
|
8
|
+
options :path => "./ebin", :cookie => "chordjerl"
|
9
|
+
|
10
|
+
with_node(:node0, :stop => false) do
|
11
|
+
start
|
12
|
+
end
|
13
|
+
|
14
|
+
with_node(:node2) do
|
15
|
+
erlang_module.go
|
16
|
+
end
|
17
|
+
|
18
|
+
with_node(:node1) do
|
19
|
+
namespace :erlang_module do
|
20
|
+
start
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/skelerl.rb
CHANGED
@@ -1,10 +1,22 @@
|
|
1
|
-
|
2
|
-
$:.
|
1
|
+
[File.expand_path(File.dirname(__FILE__))].each do |dir|
|
2
|
+
$:.unshift(dir) unless $:.include?(dir)
|
3
|
+
end
|
4
|
+
|
5
|
+
require "rubygems"
|
6
|
+
%w(dslify rubigen).each do |gem|
|
7
|
+
begin;require "#{gem}";rescue Exception => e;puts "Error: #{e}";end
|
8
|
+
end
|
9
|
+
|
10
|
+
require "skelerl/init"
|
11
|
+
|
12
|
+
%w(build).each do |rake|
|
13
|
+
load "#{File.dirname(__FILE__)}/../tasks/#{rake}.rake"
|
14
|
+
end
|
3
15
|
|
4
16
|
module Skelerl
|
5
17
|
|
6
18
|
module VERSION
|
7
|
-
STRING = "0.0.
|
19
|
+
STRING = "0.0.2"
|
8
20
|
end
|
9
21
|
|
10
22
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Object
|
2
|
+
# The hidden singleton lurks behind everyone
|
3
|
+
def metaclass; class << self; self; end; end
|
4
|
+
def meta_eval &blk; metaclass.instance_eval &blk; end
|
5
|
+
|
6
|
+
# Adds methods to a metaclass
|
7
|
+
def meta_def name, &blk
|
8
|
+
meta_eval { define_method name, &blk }
|
9
|
+
end
|
10
|
+
|
11
|
+
def meta_undef name
|
12
|
+
meta_eval { remove_method name }
|
13
|
+
end
|
14
|
+
|
15
|
+
# Defines an instance method within a class
|
16
|
+
def class_def name, &blk
|
17
|
+
class_eval { define_method name, &blk }
|
18
|
+
end
|
19
|
+
|
20
|
+
def run_in_context(context=self, &block)
|
21
|
+
name="temp_#{self.class}_#{respond_to?(:parent) ? parent.to_s : Time.now.to_i}".to_sym
|
22
|
+
meta_def name, &block
|
23
|
+
self.send name, context
|
24
|
+
# self.instance_eval &block if block
|
25
|
+
meta_undef name rescue ""
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Object
|
2
|
+
# Erlang block where you can register map erlang directives
|
3
|
+
# Usage:
|
4
|
+
# erlang do
|
5
|
+
# with_node(:node0) do
|
6
|
+
# start
|
7
|
+
# end
|
8
|
+
# end
|
9
|
+
def erlang parent=self, &block
|
10
|
+
context_stack.push parent
|
11
|
+
mapper = block ? ErlMapper.new(&block) : nil
|
12
|
+
mappers << mapper
|
13
|
+
context_stack.pop
|
14
|
+
|
15
|
+
testing ? puts(mapper.realize(true)) : mapper.realize(false)
|
16
|
+
end
|
17
|
+
|
18
|
+
def testing bool=false
|
19
|
+
$testing ||= bool
|
20
|
+
end
|
21
|
+
|
22
|
+
def mappers
|
23
|
+
$mappers ||= []
|
24
|
+
end
|
25
|
+
|
26
|
+
# Context stack so we can keep track of the context
|
27
|
+
def context_stack
|
28
|
+
@@context_stack ||= []
|
29
|
+
end
|
30
|
+
|
31
|
+
def parent
|
32
|
+
@@context_stack.first
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
Dir["#{File.dirname(__FILE__)}/core/*.rb"].each {|f| require f if ::File.file? f}
|
2
|
+
|
3
|
+
class ErlMapper
|
4
|
+
include Dslify
|
5
|
+
|
6
|
+
def initialize(opts={}, &block)
|
7
|
+
@opts = opts
|
8
|
+
instance_eval &block if block
|
9
|
+
end
|
10
|
+
|
11
|
+
default_options({
|
12
|
+
:path => "./ebin",
|
13
|
+
:sname => "node0",
|
14
|
+
:cookie => nil,
|
15
|
+
:stop => true
|
16
|
+
})
|
17
|
+
|
18
|
+
def opts;@opts ||= {};end
|
19
|
+
|
20
|
+
def self.erl_methods(hash={})
|
21
|
+
hash.each {|k,v| define_method "erl_#{k}" do;"#{v}";end}
|
22
|
+
end
|
23
|
+
|
24
|
+
erl_methods(:path => "pa", :cookie => "setcookie")
|
25
|
+
|
26
|
+
def options(opts={}, &block)
|
27
|
+
set_vars_from_options opts
|
28
|
+
instance_eval &block if block
|
29
|
+
end
|
30
|
+
|
31
|
+
def contexts
|
32
|
+
@contexts ||= []
|
33
|
+
end
|
34
|
+
|
35
|
+
def namespace name, &block
|
36
|
+
Namespace.new(name, @opts, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def with_node(name="node0", opts={}, &block)
|
40
|
+
returning MappingContext.new(name, __options.merge(opts), &block) do |mc|
|
41
|
+
contexts << mc
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def realize(force_testing=false)
|
46
|
+
contexts.collect {|mc| (force_testing || testing) ? mc.string : daemonize(mc.string) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def daemonize(cmd, &block)
|
50
|
+
pid = fork do
|
51
|
+
Signal.trap('HUP', 'IGNORE') # Don't die upon logout
|
52
|
+
File.open("/dev/null", "r+") do |devnull|
|
53
|
+
$stdout.reopen(devnull)
|
54
|
+
$stderr.reopen(devnull)
|
55
|
+
$stdin.reopen(devnull) unless @use_stdin
|
56
|
+
end
|
57
|
+
Kernel.system cmd
|
58
|
+
block.call if block
|
59
|
+
end
|
60
|
+
Process.detach(pid)
|
61
|
+
pid
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
Dir["#{File.dirname(__FILE__)}/mappers/*.rb"].each {|f| require f if ::File.file? f}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Command < Array
|
2
|
+
def initialize(name=nil, *args)
|
3
|
+
self << name.to_s
|
4
|
+
self << args unless args.empty?
|
5
|
+
end
|
6
|
+
def method_missing(m, *args, &block)
|
7
|
+
m = m.to_s
|
8
|
+
self << (args.empty? ? [m] : [m, args]).flatten
|
9
|
+
end
|
10
|
+
def to_s
|
11
|
+
self.flatten.join(" ")
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class MappingContext < ErlMapper
|
2
|
+
attr_accessor :sname, :parent
|
3
|
+
|
4
|
+
def initialize(name, opts={}, &block)
|
5
|
+
@__name = name
|
6
|
+
@opts = opts
|
7
|
+
instance_eval &block if block
|
8
|
+
@sname ||= @__name
|
9
|
+
end
|
10
|
+
|
11
|
+
def string
|
12
|
+
returning Array.new do |arr|
|
13
|
+
%w(build_string start_commands final_commands).each {|meth| arr << self.send(meth).strip }
|
14
|
+
end.join(" ").strip
|
15
|
+
end
|
16
|
+
|
17
|
+
def final_commands
|
18
|
+
returning Array.new do |arr|
|
19
|
+
arr << "-s init stop" if (opts.has_key?(:stop) && opts[:stop])
|
20
|
+
end.join(" ")
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_string
|
24
|
+
@build_string ||=
|
25
|
+
"erl #{opts.map {|k,v| "-#{get_opt_name(k)} #{v}" if v && v.is_a?(String)}.join(" ")}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_opt_name(k);methods.include?("erl_#{k}") ? self.send("erl_#{k}".to_sym) : "#{k}";end
|
29
|
+
|
30
|
+
def start_commands;commands.map {|c| "-s #{c}"}.join(" ");end
|
31
|
+
def commands;@commands ||= [];end
|
32
|
+
def parent_string; parent ? parent.__name : nil; end
|
33
|
+
|
34
|
+
def method_missing(m, *args, &block)
|
35
|
+
command = Command.new(m, args).flatten
|
36
|
+
commands.include?(command) ? super : commands.push(command)
|
37
|
+
command
|
38
|
+
end
|
39
|
+
end
|
data/lib/skelerl/init.rb
ADDED
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:appfile, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/skelerl.gemspec
CHANGED
@@ -1,35 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
1
3
|
Gem::Specification.new do |s|
|
2
4
|
s.name = %q{skelerl}
|
3
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.2"
|
4
6
|
|
5
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
8
|
s.authors = ["Ari Lerner"]
|
7
|
-
s.date = %q{2009-
|
8
|
-
s.default_executable = %q{build-app}
|
9
|
+
s.date = %q{2009-02-04}
|
9
10
|
s.description = %q{This skeleton app takes care of everything you'd need in an erlang application, but don't want to do yourself... hopefully.}
|
10
11
|
s.email = ["arilerner@mac.com"]
|
11
|
-
s.executables = ["build-app"]
|
12
|
+
s.executables = ["appfile", "build-app", "erl_runner", "gen_server"]
|
12
13
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
|
13
|
-
s.files = ["History.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/build-app", "config/hoe.rb", "config/requirements.rb", "ebin/packager.app", "include/empty", "lib/skelerl.rb", "setup.rb", "skelerl.gemspec", "src/packager.erl", "tasks/deployment.rake", "tasks/environment.rake", "tasks/
|
14
|
+
s.files = ["History.txt", "Manifest.txt", "README.txt", "Rakefile", "app_generators/appfile/USAGE", "app_generators/appfile/appfile_generator.rb", "app_generators/appfile/templates/appfile.app", "app_generators/gen_server/USAGE", "app_generators/gen_server/gen_server_generator.rb", "app_generators/gen_server/templates/gen_server.erl", "bin/appfile", "bin/build-app", "bin/erl_runner", "bin/gen_server", "config/hoe.rb", "config/requirements.rb", "ebin/packager.app", "examples/example_runner.rb", "include/empty", "lib/skelerl.rb", "lib/skelerl/core/object.rb", "lib/skelerl/erlpers/core/array.rb", "lib/skelerl/erlpers/core/object.rb", "lib/skelerl/erlpers/erl_mapper.rb", "lib/skelerl/erlpers/mappers/command.rb", "lib/skelerl/erlpers/mappers/context.rb", "lib/skelerl/erlpers/mappers/namespace.rb", "lib/skelerl/init.rb", "script/generate", "setup.rb", "skelerl.gemspec", "src/packager.erl", "tasks/build.rake", "tasks/deployment.rake", "tasks/environment.rake", "tasks/generate.rake", "tasks/website.rake", "test/erlpers/erl_mapper_spec.rb", "test/erlpers/object_spec.rb", "test/helper.rb"]
|
14
15
|
s.has_rdoc = true
|
15
16
|
s.homepage = %q{http://skelerl.rubyforge.org}
|
16
17
|
s.post_install_message = %q{}
|
17
18
|
s.rdoc_options = ["--main", "README.txt"]
|
18
19
|
s.require_paths = ["lib"]
|
19
20
|
s.rubyforge_project = %q{skelerl}
|
20
|
-
s.rubygems_version = %q{1.
|
21
|
+
s.rubygems_version = %q{1.3.1}
|
21
22
|
s.summary = %q{This skeleton app takes care of everything you'd need in an erlang application, but don't want to do yourself... hopefully.}
|
22
23
|
|
23
24
|
if s.respond_to? :specification_version then
|
24
25
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
26
|
s.specification_version = 2
|
26
27
|
|
27
|
-
if
|
28
|
-
s.add_development_dependency(%q<hoe>, [">= 1.8.
|
28
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
29
|
+
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
29
30
|
else
|
30
|
-
s.add_dependency(%q<hoe>, [">= 1.8.
|
31
|
+
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
31
32
|
end
|
32
33
|
else
|
33
|
-
s.add_dependency(%q<hoe>, [">= 1.8.
|
34
|
+
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
34
35
|
end
|
35
36
|
end
|
@@ -1,32 +1,62 @@
|
|
1
|
+
# modified from http://21ccw.blogspot.com/2008/04/using-rake-for-erlang-unit-testing.html
|
1
2
|
require 'rake/clean'
|
3
|
+
require 'pp'
|
2
4
|
|
3
|
-
INCLUDE
|
5
|
+
INCLUDE = File.dirname(__FILE__) + "/include"
|
4
6
|
ERLC_FLAGS = "-I#{INCLUDE} +warn_unused_vars +warn_unused_import"
|
5
7
|
|
6
|
-
SRC
|
7
|
-
|
8
|
-
|
8
|
+
SRC = FileList['src/*.erl']
|
9
|
+
SRC_OBJ = SRC.pathmap("%{src,ebin}X.beam")
|
10
|
+
|
11
|
+
TEST = FileList['test/src/*.erl']
|
12
|
+
TEST_OBJ = TEST.pathmap("%{src,ebin}X.beam")
|
13
|
+
|
14
|
+
CLEAN.include("ebin/*.beam", "test/ebin/*.beam")
|
9
15
|
|
10
16
|
directory 'ebin'
|
17
|
+
directory 'test/ebin'
|
18
|
+
|
19
|
+
rule( ".beam" => ["%{ebin,src}X.erl"] ) do |t|
|
20
|
+
testing = t.source =~ /test\// ? true : false
|
21
|
+
eunit = testing ? "-D EUNIT " : ""
|
22
|
+
ebin_dir = testing ? "test/ebin" : "ebin"
|
23
|
+
cmd = "erlc #{eunit}-pa ebin -W #{ERLC_FLAGS} -o #{ebin_dir} #{t.source}"
|
24
|
+
puts cmd
|
25
|
+
sh cmd
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Compile everything"
|
29
|
+
task :compile => ["src:compile", "test:compile"]
|
30
|
+
task :recompile => ["clean", "src:compile", "test:compile"]
|
11
31
|
|
12
|
-
|
13
|
-
|
32
|
+
namespace :src do
|
33
|
+
desc "Compile src"
|
34
|
+
task :compile => ['ebin'] + SRC_OBJ
|
14
35
|
end
|
15
36
|
|
16
|
-
|
37
|
+
namespace :test do
|
38
|
+
desc "Compile tests"
|
39
|
+
task :compile => ['test/ebin'] + TEST_OBJ
|
40
|
+
end
|
17
41
|
|
18
|
-
desc "Run
|
19
|
-
task :run_tests =>
|
20
|
-
|
42
|
+
desc "Run all tests"
|
43
|
+
task :run_tests => :compile do
|
44
|
+
puts "Modules under test:"
|
45
|
+
TEST_OBJ.each do |obj|
|
21
46
|
obj[%r{.*/(.*).beam}]
|
22
47
|
mod = $1
|
23
|
-
|
48
|
+
test_cmd = "erl -pa ebin -pa test/ebin -run #{mod} test -run init stop"
|
49
|
+
test_output = `#{test_cmd}`
|
50
|
+
|
51
|
+
puts test_output if Rake.application.options.trace
|
24
52
|
|
25
53
|
if /\*failed\*/ =~ test_output
|
26
54
|
test_output[/(Failed.*Aborted.*Skipped.*Succeeded.*$)/]
|
27
55
|
else
|
28
56
|
test_output[/1>\s*(.*)\n/]
|
29
57
|
end
|
58
|
+
|
59
|
+
puts "#{mod}: #{$1}"
|
30
60
|
end
|
31
61
|
end
|
32
62
|
|
@@ -39,9 +69,6 @@ end
|
|
39
69
|
desc "Recompile the sources"
|
40
70
|
task :recompile => [:clean, :compile]
|
41
71
|
|
42
|
-
desc "Compile all the sources"
|
43
|
-
task :compile => ['ebin'] + OBJ
|
44
|
-
|
45
72
|
desc "Compile with the DEBUG flag set to true"
|
46
73
|
task :compile_debug do
|
47
74
|
Dir["#{::File.dirname(__FILE__)}/src/*.erl"].each do |t|
|
@@ -65,10 +92,4 @@ desc "Rebuild and repackage"
|
|
65
92
|
task :repackage => [:build_boot_scripts] do
|
66
93
|
cmd = "erl -pa ./ebin -s packager start -s init stop"
|
67
94
|
Kernel.system cmd
|
68
|
-
end
|
69
|
-
|
70
|
-
desc "Install messenger"
|
71
|
-
task :install_messenger do
|
72
|
-
cmd = "erl -pa ./ebin/ -run packager install_messenger #{@version} -run init stop -noshell"
|
73
|
-
Kernel.system cmd
|
74
95
|
end
|
data/tasks/deployment.rake
CHANGED
@@ -34,7 +34,7 @@ namespace :manifest do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
desc "Generate gemspec"
|
37
|
-
task :gemspec => [:"manifest:refresh"
|
37
|
+
task :gemspec => [:"manifest:refresh"] do |t|
|
38
38
|
res = %x[rake debug_gem]
|
39
39
|
res = res.split("\n")[1..-1].join("\n")
|
40
40
|
::File.open("#{GEM_NAME.downcase}.gemspec", "w+") do |f|
|
data/tasks/generate.rake
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../helper"
|
2
|
+
|
3
|
+
class ErlMapperTest < Test::Unit::TestCase
|
4
|
+
context "ErlMapper" do
|
5
|
+
context "methods" do
|
6
|
+
|
7
|
+
context "options" do
|
8
|
+
|
9
|
+
setup do;@mapper = ErlMapper.new do;a "a";b = nil;end;end
|
10
|
+
describe "passed in with a hash" do
|
11
|
+
it "should set the option on the ErlMapper" do;@mapper.a.should == "a";end
|
12
|
+
it "should not set the option when passed a nil value" do;@mapper.b.should == nil;end
|
13
|
+
end
|
14
|
+
describe "passed in on the block" do
|
15
|
+
it "should set the option on the ErlMapper" do;@mapper.a.should == "a";end
|
16
|
+
it "should not set the option when passed a nil value" do;@mapper.b.should == nil;end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "with_node" do
|
21
|
+
setup do;@mapper = ErlMapper.new do;with_node(:node0) do; "hi";end;end;end
|
22
|
+
describe "on call" do
|
23
|
+
it "should create a MappingContext" do
|
24
|
+
assert_equal @mapper.with_node(:node0).class, MappingContext
|
25
|
+
end
|
26
|
+
it "should store the MappingContext's name" do
|
27
|
+
assert_equal @mapper.with_node(:node0).sname, :node0
|
28
|
+
end
|
29
|
+
it "should append the name to the MappingContext's string" do
|
30
|
+
assert_equal @mapper.with_node(:node0).build_string.strip, "erl -sname node0 -pa ./ebin"
|
31
|
+
end
|
32
|
+
|
33
|
+
context "context" do
|
34
|
+
setup do;@context = @mapper.with_node(:node0) do;start;end;end
|
35
|
+
|
36
|
+
describe "with start_commands" do
|
37
|
+
it "should have the start_commands on the MappingContext" do
|
38
|
+
assert_equal @context.commands.flatten, ["start"]
|
39
|
+
end
|
40
|
+
it "should have multiple when multiple are called" do
|
41
|
+
@context.instance_eval do
|
42
|
+
chordjerl_srv.start_link
|
43
|
+
end
|
44
|
+
assert_equal ["start","chordjerl_srv","start_link"], @context.commands.flatten
|
45
|
+
end
|
46
|
+
it "should include arguments" do
|
47
|
+
@context = @mapper.with_node(:node0) do
|
48
|
+
dark.and_stormy "night"
|
49
|
+
end
|
50
|
+
assert_equal [["dark",["and_stormy","night"]]], @context.commands
|
51
|
+
end
|
52
|
+
it "should build the commands with 1 -s" do
|
53
|
+
@context = @mapper.with_node(:node0, :stop => false) do
|
54
|
+
everything.but_the "sink"
|
55
|
+
end
|
56
|
+
assert_equal "erl -sname node0 -pa ./ebin -s everything but_the sink", @context.string
|
57
|
+
end
|
58
|
+
it "should build the commands without an argument" do
|
59
|
+
@context = @mapper.with_node(:node0, :stop => false) do
|
60
|
+
once.in_a_lifetime
|
61
|
+
end
|
62
|
+
assert_equal "erl -sname node0 -pa ./ebin -s once in_a_lifetime", @context.string
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "with final_commands" do
|
67
|
+
it "should have the default final_commands as -s init stop" do
|
68
|
+
assert_equal @context.final_commands, "-s init stop"
|
69
|
+
end
|
70
|
+
it "should not have the final_commands with stop if stop is false" do
|
71
|
+
cont = MappingContext.new :node1, {:stop => false} do
|
72
|
+
end
|
73
|
+
assert_equal cont.final_commands, ""
|
74
|
+
end
|
75
|
+
it "with stop if stop is true" do
|
76
|
+
cont = MappingContext.new :node2, {:stop => true} do
|
77
|
+
end
|
78
|
+
assert_equal cont.final_commands, "-s init stop"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "Namespace" do
|
89
|
+
setup do
|
90
|
+
@namespace = Namespace.new("chordjerl_srv") do
|
91
|
+
start
|
92
|
+
end
|
93
|
+
end
|
94
|
+
it "should keep the namespace on the command" do
|
95
|
+
assert_equal "erl -s chordjerl_srv:start", @namespace.string
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "Called from an object" do
|
100
|
+
setup do
|
101
|
+
@o = Object.new
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should not fail" do
|
105
|
+
blk = Proc.new {}
|
106
|
+
lambda {@o.erlang(&blk)}.should_not raise_error
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../helper"
|
2
|
+
|
3
|
+
class ObjectTest < Test::Unit::TestCase
|
4
|
+
context "Object" do
|
5
|
+
setup do
|
6
|
+
@o = Object.new
|
7
|
+
end
|
8
|
+
|
9
|
+
context "for method erlang" do
|
10
|
+
should "respond to :erlang" do
|
11
|
+
assert_respond_to @o, :erlang
|
12
|
+
end
|
13
|
+
|
14
|
+
should "create a new ErlMapper" do
|
15
|
+
blk = Proc.new {}
|
16
|
+
assert_equal ErlMapper, @o.erlang(&blk).class
|
17
|
+
end
|
18
|
+
|
19
|
+
should "not create a new ErlMapper if there is no block passed" do
|
20
|
+
assert_equal @o.erlang, nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/test/helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: auser-skelerl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Lerner
|
@@ -9,8 +9,8 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
13
|
-
default_executable:
|
12
|
+
date: 2009-02-04 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hoe
|
@@ -19,13 +19,16 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.8.
|
22
|
+
version: 1.8.0
|
23
23
|
version:
|
24
24
|
description: This skeleton app takes care of everything you'd need in an erlang application, but don't want to do yourself... hopefully.
|
25
25
|
email:
|
26
26
|
- arilerner@mac.com
|
27
27
|
executables:
|
28
|
+
- appfile
|
28
29
|
- build-app
|
30
|
+
- erl_runner
|
31
|
+
- gen_server
|
29
32
|
extensions: []
|
30
33
|
|
31
34
|
extra_rdoc_files:
|
@@ -37,19 +40,42 @@ files:
|
|
37
40
|
- Manifest.txt
|
38
41
|
- README.txt
|
39
42
|
- Rakefile
|
43
|
+
- app_generators/appfile/USAGE
|
44
|
+
- app_generators/appfile/appfile_generator.rb
|
45
|
+
- app_generators/appfile/templates/appfile.app
|
46
|
+
- app_generators/gen_server/USAGE
|
47
|
+
- app_generators/gen_server/gen_server_generator.rb
|
48
|
+
- app_generators/gen_server/templates/gen_server.erl
|
49
|
+
- bin/appfile
|
40
50
|
- bin/build-app
|
51
|
+
- bin/erl_runner
|
52
|
+
- bin/gen_server
|
41
53
|
- config/hoe.rb
|
42
54
|
- config/requirements.rb
|
43
55
|
- ebin/packager.app
|
56
|
+
- examples/example_runner.rb
|
44
57
|
- include/empty
|
45
58
|
- lib/skelerl.rb
|
59
|
+
- lib/skelerl/core/object.rb
|
60
|
+
- lib/skelerl/erlpers/core/array.rb
|
61
|
+
- lib/skelerl/erlpers/core/object.rb
|
62
|
+
- lib/skelerl/erlpers/erl_mapper.rb
|
63
|
+
- lib/skelerl/erlpers/mappers/command.rb
|
64
|
+
- lib/skelerl/erlpers/mappers/context.rb
|
65
|
+
- lib/skelerl/erlpers/mappers/namespace.rb
|
66
|
+
- lib/skelerl/init.rb
|
67
|
+
- script/generate
|
46
68
|
- setup.rb
|
47
69
|
- skelerl.gemspec
|
48
70
|
- src/packager.erl
|
71
|
+
- tasks/build.rake
|
49
72
|
- tasks/deployment.rake
|
50
73
|
- tasks/environment.rake
|
51
|
-
- tasks/
|
74
|
+
- tasks/generate.rake
|
52
75
|
- tasks/website.rake
|
76
|
+
- test/erlpers/erl_mapper_spec.rb
|
77
|
+
- test/erlpers/object_spec.rb
|
78
|
+
- test/helper.rb
|
53
79
|
has_rdoc: true
|
54
80
|
homepage: http://skelerl.rubyforge.org
|
55
81
|
post_install_message: ""
|