peto 0.1.3 → 0.2.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.rdoc CHANGED
@@ -2,11 +2,10 @@
2
2
 
3
3
  == Usage
4
4
 
5
- installing
6
- gem install peto
7
-
8
- contract file (foo.yml)
5
+ installing:
6
+ % gem install peto
9
7
 
8
+ contract file (foo.yml):
10
9
  name: foo
11
10
 
12
11
  types:
@@ -17,12 +16,13 @@ contract file (foo.yml)
17
16
  set_user:
18
17
  args: [user:user]
19
18
 
20
- invoke command
21
- peto foo.yml > generated.rb
22
-
23
- use generated.rb
19
+ invoke command:
20
+ % peto foo.yml
24
21
 
25
- require "generated"
22
+ use foo.rb:
23
+ require "foo"
24
+ require "animal"
25
+ require "user"
26
26
 
27
27
  cat = Peto::Animal.new(:name => "cat")
28
28
  dog = Peto::Animal.new(:name => "dog")
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
data/bin/peto CHANGED
@@ -4,7 +4,22 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
4
  $LOAD_PATH.unshift(File.dirname(__FILE__))
5
5
  require "peto"
6
6
 
7
+ require "optparse"
8
+ options = {}
9
+ OptionParser.new do |opt|
10
+ opt.on("-o output directory") {|value| options[:output] = value }
11
+ opt.parse!(ARGV)
12
+ end
13
+ input = ARGV.pop
14
+
15
+ if input.nil?
16
+ puts "usage:\n % peto contract.yml"
17
+ exit
18
+ end
19
+
20
+ options[:output] = File.dirname(input) if options[:output].nil?
21
+
7
22
  peto = Peto::Master.new
8
- peto.load(ARGV.first)
9
- puts peto.generate
23
+ peto.load(input)
24
+ peto.generate
10
25
 
@@ -23,12 +23,18 @@ module Peto
23
23
  def initialize(contract)
24
24
  @contract = contract
25
25
  end
26
+ attr_reader :contract
26
27
 
27
- def generate(template_filename)
28
+ def generate_procedure(template_filename)
28
29
  erb = ERB.new(IO.read(template_filename), nil, "-")
29
- erb.result(binding)
30
+ { "#{@contract["name"]}" => erb.result(binding) }
30
31
  end
31
32
 
33
+ def generate_class(template_filename, type)
34
+ erb = ERB.new(IO.read(template_filename), nil, "-")
35
+ @target = {:name => type.first, :args => args(type.second)}
36
+ { "#{@target[:name]}" => erb.result(binding) }
37
+ end
32
38
 
33
39
  def class_name
34
40
  @contract["name"].to_class_type
data/lib/peto/master.rb CHANGED
@@ -3,15 +3,45 @@ require "yaml"
3
3
  require "peto/generator"
4
4
 
5
5
  module Peto
6
- TEMPLATE_DIR = File::dirname( File::expand_path( __FILE__ ) ) + "/../templates"
6
+ TEMPLATE_DIR = File::dirname(File::expand_path( __FILE__ )) + "/../templates"
7
7
  class Master
8
8
  def load(filename)
9
+ @work_dir = File::dirname(filename)
9
10
  @contract = YAML.load(IO.read(Pathname(filename)))
10
11
  end
11
12
  attr_reader :contract
12
13
 
14
+ def parse
15
+ (@contract["types"]||{}).inject({}) {|result, type|
16
+ result.merge!(Generator.new(@contract).generate_class(TEMPLATE_DIR + "/rb_classes.erb", type))
17
+ }.merge!(Generator.new(@contract).generate_procedure(TEMPLATE_DIR + "/rb_procedures.erb"))
18
+ end
19
+
13
20
  def generate
14
- Generator.new(@contract).generate(TEMPLATE_DIR + "/rb_procedures.erb")
21
+ parse.each do |name, content|
22
+ filepath = File.join(@work_dir, "#{name}.rb")
23
+ write(filepath, content)
24
+ end
25
+ end
26
+
27
+ def write(filepath, content)
28
+ print " "
29
+ if File.exist?(filepath)
30
+ if File.read(filepath) == content
31
+ print "identical"
32
+ else
33
+ print "update "
34
+ end
35
+ else
36
+ print "create "
37
+ end
38
+ print " "
39
+
40
+ open(filepath, "w") do |file|
41
+ file.write(content)
42
+ end
43
+
44
+ puts filepath
15
45
  end
16
46
  end
17
47
  end
@@ -0,0 +1,37 @@
1
+ require "peto/mixin/peto_class"
2
+
3
+ <%- name = @target[:name].camelize -%>
4
+ <%- args = @target[:args] -%>
5
+ module Peto
6
+ class <%= name %>
7
+ include PetoClass
8
+ def initialize(args={})
9
+ <%- args.each do |arg| -%>
10
+ <%- if arg[:array_type] -%>
11
+ @<%= arg[:name] %> = [] # for <%= arg[:array_type] %>
12
+ <%- else -%>
13
+ @<%= arg[:name] %> = nil
14
+ <%- end -%>
15
+ <%- end -%>
16
+
17
+ set_by_hash(args)
18
+ raise_errors unless valid?
19
+ end
20
+
21
+ <%- args.each do |arg| -%>
22
+ attr_reader :<%= arg[:name] %>
23
+ <%- end -%>
24
+
25
+ def members
26
+ [<%= args.map{|arg| ":#{arg[:name]}"}.join(",") %>]
27
+ end
28
+
29
+ def types
30
+ {<%= args.map{|arg| ":#{arg[:name]} => #{arg[:type]}"}.join(",") %>}
31
+ end
32
+
33
+ def arrays
34
+ {<%= args.select{|arg|arg[:array_type]}.map{|arg| ":#{arg[:name]} => #{arg[:array_type]}"}.join(",") %>}
35
+ end
36
+ end
37
+ end
@@ -1,42 +1,5 @@
1
- require "peto/mixin/peto_class"
2
1
  require "peto/mixin/peto_errorable"
3
2
 
4
- module Peto
5
- <%- each_types do |name, args| -%>
6
- class <%= name %>
7
- include PetoClass
8
- def initialize(args={})
9
- <%- args.each do |arg| -%>
10
- <%- if arg[:array_type] -%>
11
- @<%= arg[:name] %> = [] # for <%= arg[:array_type] %>
12
- <%- else -%>
13
- @<%= arg[:name] %> = nil
14
- <%- end -%>
15
- <%- end -%>
16
-
17
- set_by_hash(args)
18
- raise_errors unless valid?
19
- end
20
-
21
- <%- args.each do |arg| -%>
22
- attr_reader :<%= arg[:name] %>
23
- <%- end -%>
24
-
25
- def members
26
- [<%= args.map{|arg| ":#{arg[:name]}"}.join(",") %>]
27
- end
28
-
29
- def types
30
- {<%= args.map{|arg| ":#{arg[:name]} => #{arg[:type]}"}.join(",") %>}
31
- end
32
-
33
- def arrays
34
- {<%= args.select{|arg|arg[:array_type]}.map{|arg| ":#{arg[:name]} => #{arg[:array_type]}"}.join(",") %>}
35
- end
36
- end
37
- <%- end -%>
38
- end
39
-
40
3
  module Peto
41
4
  class <%= class_name %>
42
5
  extend PetoErrorable
data/test/test_peto.rb CHANGED
@@ -9,21 +9,27 @@ class TestPeto < Test::Unit::TestCase
9
9
  @peto = Peto::Master.new
10
10
  end
11
11
 
12
- context "load contract yaml file" do
12
+ context "loads contract yaml file" do
13
13
  setup do
14
14
  @peto.load("test/contracts/loading.yml")
15
15
  end
16
- should ".contract returns loaded contract" do
17
- assert_equal({ "name" => "loading" }, @peto.contract)
16
+ context ".contract" do
17
+ should "return loaded contract" do
18
+ assert_equal({ "name" => "loading" }, @peto.contract)
19
+ end
18
20
  end
19
21
  end
20
22
 
21
- context "generate procedures" do
23
+ context "parse procedures" do
22
24
  setup do
23
25
  @peto.load("test/contracts/generating.yml")
24
26
  end
25
27
  should "returns string by loaded contract" do
26
- assert_equal String, @peto.generate.class
28
+ assert_equal Hash, @peto.parse.class
29
+ @peto.parse.each do |name, content|
30
+ assert_equal String, name.class
31
+ assert_equal String, content.class
32
+ end
27
33
  end
28
34
  end
29
35
  end
@@ -32,10 +38,12 @@ class TestPeto < Test::Unit::TestCase
32
38
  setup do
33
39
  @peto = Peto::Master.new
34
40
  @peto.load("test/contracts/generating.yml")
35
- @generated = @peto.generate
41
+ @generated = @peto.parse
36
42
  end
37
- should "is readable as ruby" do
38
- Closed.class_eval(@generated)
43
+ should "be readable as ruby" do
44
+ @generated.each do |filepath, content|
45
+ Closed.class_eval(content)
46
+ end
39
47
  assert_equal({
40
48
  :procedure => "do_a",
41
49
  :args => {
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
8
- - 3
9
- version: 0.1.3
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Toshiyuki Hirooka
@@ -53,6 +53,7 @@ files:
53
53
  - lib/peto/mixin/peto_class.rb
54
54
  - lib/peto/mixin/peto_errorable.rb
55
55
  - lib/peto/rails/helper.rb
56
+ - lib/templates/rb_classes.erb
56
57
  - lib/templates/rb_procedures.erb
57
58
  - test/contracts/generating.yml
58
59
  - test/contracts/loading.yml