RuCodeGen 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # Copyright (c) 2005-2006, Yauheni Akhotnikau
2
+ # Copyright (c) 2005-2007, Yauheni Akhotnikau
3
3
  # All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
data/NEWS CHANGED
@@ -1,3 +1,6 @@
1
+ 2006.11.23, 2007.05.30 * ������ 0.3.0 *
2
+ ������ ��������� adhoc �������������.
3
+
1
4
  2006.05.12 * ������ 0.2.0 *
2
5
  ����������� ��������� ���������� RuCodeGen �������� (�.�. ��������,
3
6
  ������� ��������� ������ ������� �����, ��������, ������ C++ �����).
data/README CHANGED
@@ -6,7 +6,13 @@ RuCodeGen
6
6
  ������ � ���������� ���������� ��� ��������� ���������������, � ���������� ������� ���������������.
7
7
 
8
8
  ��������� ��. {docs/Principle}[link://files/docs/Principle.html] �
9
- {docs/EmbeddedRuCodeGen}[link://files/docs/EmbeddedRuCodeGen.html].
9
+ {docs/EmbeddedRuCodeGen}[link://files/docs/EmbeddedRuCodeGen.html]. � ������
10
+ 0.3.0 ��� ������������ DSL ��������� ����������� ����������� � �������
11
+ ���������� ��������� ������, ��.
12
+ {docs/CmdLineHandler}[link://files/docs/CmdLineHandler.html].
13
+
14
+ ������� � ������ 0.3.0 RuCodeGen ������������ ��� �� adhoc-���������, ��.
15
+ {docs/AdHoc}[link://files/docs/AdHoc.html].
10
16
 
11
17
  == ������� ��������������
12
18
 
data/Rakefile CHANGED
@@ -3,8 +3,10 @@ Gem::manage_gems
3
3
 
4
4
  require 'rake/gempackagetask'
5
5
 
6
+ require 'lib/rucodegen/version'
7
+
6
8
  PKG_NAME =
7
- PKG_VERSION = '0.2.2'
9
+ PKG_VERSION = RuCodeGen::VERSION
8
10
 
9
11
  spec = Gem::Specification.new do |s|
10
12
  s.name = "RuCodeGen"
@@ -16,6 +18,7 @@ spec = Gem::Specification.new do |s|
16
18
  s.summary = "Simple code generation tool"
17
19
  s.files = FileList[ "{bin,tests,lib,docs,examples}/**/*" ].
18
20
  exclude( "rdoc" ).to_a
21
+ s.executables = 'rcgtool'
19
22
  s.require_path = "lib"
20
23
  s.autorequire = "rucodegen"
21
24
  s.test_file = "tests/ts_rucodegen.rb"
@@ -0,0 +1,138 @@
1
+ # ������, ������� �������� �� ������ ad-hoc ����������� �� �����
2
+ # ���������������� �������.
3
+
4
+ require 'optparse'
5
+ require 'ostruct'
6
+
7
+ module RuCodeGenAdHoc
8
+
9
+ module Impl
10
+
11
+ # ����������� ��� ����������������� ������� � �������.
12
+ STD_CODEGEN_SCRIPT_NAME = 'g.rb'
13
+
14
+ # ������ ���������� ��������� ������.
15
+ #
16
+ # ���������� ������ �� ���������� ��������.
17
+ # template_name:: ��� ���������� ��� ������������� �������.
18
+ # list:: �������� true, ���� ������ ������������ ������ ��������� ��������.
19
+ # include_paths:: �������� ������ �������������� ����� ��� ������ ��������.
20
+ #
21
+ # ��������� ������ �������, ���� ��� ����� �������� --help.
22
+ #
23
+ def Impl.parse_args
24
+ result = OpenStruct.new(
25
+ :template_name => nil,
26
+ :list => false,
27
+ :include_paths => [] )
28
+
29
+ parser = OptionParser.new
30
+
31
+ parser.banner = <<BANNER
32
+ RuCodeGen Ad-Hoc generation runner
33
+
34
+ Usage:
35
+
36
+ rcgtool [<options>] template-name [<template-options>]
37
+
38
+ BANNER
39
+
40
+ parser.on_head( '-l', '--list', 'Show list of available templates' ) do
41
+ result.list = true
42
+ end
43
+
44
+ parser.on_head( '-I', '--include-path PATH',
45
+ 'Additional path to looking for templates' ) do |p|
46
+ result.include_paths << p
47
+ end
48
+
49
+ parser.on_head( '-h', '--help', 'Show this message' ) do
50
+ puts parser
51
+ exit( 1 )
52
+ end
53
+
54
+ parser.order!( ARGV ) do |nonarg|
55
+ # ������ �� ����� � ����� ������ �������.
56
+ result.template_name = nonarg
57
+ parser.terminate
58
+ end
59
+
60
+ if !result.template_name && !result.list
61
+ $stderr.puts "template_name must be specified"
62
+ exit( 2 )
63
+ end
64
+
65
+ result
66
+ end
67
+
68
+ # ����� ������ ��������� ��������.
69
+ def Impl.show_templates_list( include_paths )
70
+ include_paths.each do |path|
71
+ templates_found = []
72
+ Dir.glob( File.join( path, '*' ), File::FNM_PATHNAME ) do |dir|
73
+ probe_name = File.join( dir, STD_CODEGEN_SCRIPT_NAME )
74
+ if File.readable?( probe_name )
75
+ templates_found << File.basename( dir )
76
+ end
77
+ end
78
+
79
+ templates_found.sort.each do |template|
80
+ puts template + " (#{path})"
81
+ end
82
+ end
83
+ end
84
+
85
+ # ����� ������� ���� � ������� �� ����� �������.
86
+ #
87
+ # ���� ����� ���������� ��������, �� ������������ nil.
88
+ #
89
+ def Impl.find_full_template_path( template_name, include_paths )
90
+ include_paths.each do |path|
91
+ probe_name = File.join( path, template_name, STD_CODEGEN_SCRIPT_NAME )
92
+ if File.readable?( probe_name )
93
+ return probe_name
94
+ end
95
+ end
96
+
97
+ nil
98
+ end
99
+
100
+ # ����� � ���������� ���������� ������� � ��������� ������� �����.
101
+ def Impl.find_and_run_template( template_name, include_paths )
102
+ full_path = find_full_template_path( template_name, include_paths )
103
+ if full_path
104
+ require full_path
105
+ else
106
+ $stderr.puts "#{template_name}: template not found in:\n\t" +
107
+ include_paths.join( "\n\t" )
108
+ exit( 3 )
109
+ end
110
+ end
111
+
112
+ end # Impl
113
+
114
+ # ���������� �������� ������.
115
+ def RuCodeGenAdHoc.run_ad_hoc_generation
116
+ options = Impl.parse_args
117
+
118
+ # � ������ ������ �������� ����� �������� �����������
119
+ # ���� � ��������� ������ ������.
120
+ options.include_paths << File.join(
121
+ File.dirname( __FILE__ ),
122
+ '../lib/rucodegen/adhoc/templates' )
123
+
124
+ if options.list
125
+ Impl.show_templates_list( options.include_paths )
126
+ else
127
+ Impl.find_and_run_template(
128
+ options.template_name,
129
+ options.include_paths )
130
+ end
131
+ end
132
+
133
+ end # RuCodeGenAdHoc
134
+
135
+ RuCodeGenAdHoc.run_ad_hoc_generation
136
+
137
+ # vim:ft=ruby:
138
+
@@ -0,0 +1,154 @@
1
+ = AdHoc ���������
2
+
3
+ == ��������
4
+
5
+ �������������� ����� ������ RuCodeGen, ����� �� Ruby ��������� DSL-������,
6
+ ������� ����������� ��� ��������� �������, � ������� � ���������� ����������
7
+ ���� ��� ��������� ������, ��������� �� ������ �������. � ���������, ���
8
+ ��������� ��������, � ������� ��������� ��������� DSL-������ � ���������
9
+ Ruby-����� �� ������:
10
+ * ��������� ��������� ��� ����� ������. ��������, ������ �������� �������,
11
+ ������� � ������ ������ ����� ��������� � ������ � ������� ������� �/���
12
+ ������������ �����������;
13
+ * ��������� ���������� ���� (���������� ����������) ��� ������� � ���������
14
+ ��������.
15
+
16
+ ��������, ���� �� ������ ���������� ���-������ ������ ��� ����� C++ ������
17
+ ����������� ������� ����� ���� ��������� ��������� (��� ��������� ���-��
18
+ �������) � �������� ������� C++ ����. ��������, �������� ���-������ �����:
19
+ rcgtool cpp-new-file -o my/project/header.hpp
20
+ �������� ���� <tt>my/project/header.hpp</tt> ����:
21
+ /*
22
+ * Copyright (C) 2007 ...
23
+ * ...
24
+ */
25
+ /*!
26
+ * \since v.3.4.6
27
+ * \file my/project/header.hpp
28
+ * \brief <DESCRIBE YOUR FILE HERE!>
29
+ */
30
+ #if !defined( MY_PROJECT_HEADER_HPP )
31
+ #define MY_PROJECT_HEADER_HPP
32
+
33
+ #endif
34
+
35
+ ��� �� ������� ��������� � ������������� � �����-������ ��������� ���. �
36
+ ���������, � ��������� {VIM}[http://www.vim.org], ������� ��������� ���������� �� ���� �������
37
+ ������� ���������� �������� ������, � ����� �������� ���� �������� �� ���������
38
+ ������ �������. �����, ��������, ����� �������� � VIM ������:
39
+ namespace my::project::details
40
+ �������� ��, ������ �������:
41
+ :'<,'>!rcgtool cpp-open-ns
42
+ ����� ���� ���������� ������ ����� �������� ��:
43
+ namespace my {
44
+
45
+ namespace project {
46
+
47
+ namespace details {
48
+
49
+ } /* namespace details */
50
+
51
+ } /* namespace project */
52
+
53
+ } /* namespace my */
54
+
55
+ �.�. ����� ���������� ������� ������������� RuCodeGen 0.1.0 � 0.2.0 �����
56
+ �������, ��� ���������� ������������ "�����������", ��� ��� �� ������� ��������
57
+ ad-hoc, ����������. ������ ���� ��������� ���� ������� � ������ RuCodeGen
58
+ 0.3.0.
59
+
60
+ == ������� ������
61
+
62
+ ������� ������ ad-hoc ���������� ������� � ���, ��� RuCodeGen �������� � ����
63
+ ��������� ������� rcgtool, ������� �������� ��� ������������� ������� � �����
64
+ ���������� ��� ����� �������. ������� rcgtool ���� ������ ����� ��������� ��
65
+ ��������� �, ���� ������ ������, ��������� ��� �� ���������� ��� ���������
66
+ ruby-������. ��� ���� ������� ������� ���������� �������� ������������� �����
67
+ ����������.
68
+
69
+ ����� �������, ������ ad-hoc ������ ������������ �� ���� ����������
70
+ ruby-���������, � rcgtool �������� ����� ���� ������������ ����� ��������.
71
+
72
+ ��������� ������ �������� ��������������� ����������, �� ����� ��������� �����
73
+ ��������:
74
+ * ������������� ��������� ��������� ������;
75
+ * ������������� ���������� ���������;
76
+ * ��������� ���������� ����� �����;
77
+ * ��������� ���������� �������� ��� ������-���� ������������ ��������;
78
+ * ����� ������ � �������������
79
+ * � �.�. � �.�. � ����� ����������.
80
+
81
+ ��������������, ad-hoc ������ ����� �������� ���������� ����� ������ �:
82
+ * �����-���� ���� (� ������� ������������ ��� �������� ������������� ������);
83
+ * �� ����������� ����� ������ (��������� ��� ��������� � VIM-�);
84
+ * ����-���� ���.
85
+
86
+ == ������ ������� rcgtool
87
+
88
+ ������:
89
+ RuCodeGen Ad-Hoc generation runner
90
+
91
+ Usage:
92
+
93
+ rcgtool [<options>] template-name [<template-options>]
94
+
95
+ -h, --help Show this message
96
+ -I, --include-path PATH Additional path to looking for templates
97
+ -l, --list Show list of available templates
98
+
99
+ ��� ������������ ���������:
100
+ [<i>-I, --include-path</i>] �������������� ���� ��� ������ ad-hoc ��������.
101
+ [<i>-l, --list</i>] ��������� rcgtool ���������� ������ �������� ��������.
102
+
103
+ �� ��������� rcgtool ���� ������� � ��������
104
+ <tt>../lib/rucodegen/adhoc/templates</tt> ������������ ���� ��������, � �������
105
+ ��������� �������� ���� <tt>rcgtool</tt> �� ������� RuCodeGen. �.�., ��
106
+ ���������, rcgtool ���� ������� � ������� ����������� RuCodeGen. ��������
107
+ <i>-I</i> ��������� ��������� ������ ��������� ��� ������ ��������.
108
+
109
+ �������� <i>template-name</i> ������ ��������� ��� ad-hoc �������. ���������
110
+ ����� <i>template-name</i> �������������� ��������� <i>template-options</i>
111
+ �������� rcgtool �� �������������� � ���������� � ad-hoc ������.
112
+
113
+ == ������� ad-hoc �������
114
+
115
+ ���� ��������� ad-hoc �������� ��������� � ����� ��������� ���������. ������� � ������ 0.3.0 �������� ������ ���� ������:
116
+
117
+ [cpp-open-ns] �� ����� C++ ������������ ���� ���������� �������� ���� �
118
+ ��������� � ��������� ����� ������������ ����.
119
+
120
+ ��������:
121
+ rcgtool cpp-open-ns -n my::project
122
+ �������� � ������ �� ����������� ����� ������:
123
+ namespace my {
124
+
125
+ namespace project {
126
+
127
+ } /* namespace project */
128
+
129
+ } /* namespace my */
130
+
131
+ ��� �� cpp-open-ns ����� �������� ��� ������������ ���� �� ������������ �����:
132
+ echo "my::project" | rcgtool cpp-open-ns
133
+ ���
134
+ echo "namespace my::project" | rcgtool cpp-open-ns
135
+ ��� �������� � ������ �� ����������.
136
+
137
+ ����������� ��������� ������ �� ������������ ����� ��������� ������������ cpp-open-ns �� ��������� VIM � ������� ������� <tt>:!<cmd></tt>.
138
+
139
+ == ��� �� ���� ������������ ad-hoc �������
140
+
141
+ Ad-hoc ������ -- ��� ruby-���� � ������ <tt>g.rb</tt>, ������� ������������� �
142
+ ����������� � ������ �������. ��������, ������ cpp-open-ns, ���������� � ����
143
+ ����� <tt>cpp-open-ns/g.rb</tt>.
144
+
145
+ ���������� ����� g.rb ����������� � ruby-�������������, ����������� ������
146
+ rcgtool, � ������� ��������� require. ��������������, g.rb ������ ���� �������
147
+ ���, ����� �� �������������� �������� ���� ������. ������� �������� ������� ���
148
+ ����� �����. �.�. g.rb ������ ���� ��������������� ����������, ������� �����
149
+ ��������� �� ���������� � ��� rcgtool.
150
+
151
+ ���� ������� g.rb ���������� ��������� ��������� ������, �� �� �����
152
+ ������������ ARGV, �.�. rcgtool � ����� ������� ������� �� ARGV ��� �����������
153
+ ���������.
154
+
@@ -0,0 +1,186 @@
1
+ = ��������
2
+
3
+ ���������� �������������, ��� ��� ����������� ��� ������������� ��������� �����
4
+ ���������� � DSL-��������. ������� RuCodeGen ��� ���� �� ���� ������ ����������
5
+ ��������� ������. �� �� �������� ���������� ��������, ����� ��������� ������
6
+ ���������� ���� ����� �������� �� �������������� �������. ��������, ����� ����
7
+ ������������� C++ ��� � ����������� �������� ��� ��� ���. ��������� ������
8
+ ���������� � DSL-�������� �� ����� ������. ������� ������� ��������� ��������
9
+ ������� � ��������� ������. �� ��� ����� ����������� ���� ����� �����
10
+ ����������� ����������� � ������ � ����������� ��������� ������.
11
+
12
+ ����� ����������� ���� ��������� � ������ 0.3.0 � ������� ������
13
+ RuCodeGen::OptionHandler � ������� RuCodeGen::RunMode::add_option_handler �
14
+ RuCodeGen::RunMode::options.
15
+
16
+ = ������� ������
17
+
18
+ ����������� ������������� DSL ����������� ������� �������. � ����� ������ DSL
19
+ ����������� ��� RuCodeGen, ������� ��������� ��������� ��������� ������. �����
20
+ ���� RuCodeGen ��������� ��� ������������������ DSL-�������� ����������.
21
+
22
+ �� ����� ����� ������ DSL-������ ����� ���������������� � RuCodeGen �����
23
+ ����������� ��������, ���������� �� ��������� ����������� �����������
24
+ ���������� ��������� ������. ������ ����� ������ ������ ������������� ���������
25
+ RuCodeGen::OptionHandler.
26
+
27
+ ����� RuCodeGen ���������� � ������� ���������� ��������� ������, �� �������
28
+ ������ OptionParser ��� ������ � ��������� ������� � ������ OpenStruct ���
29
+ ���������� ����������� �������. ������� ������� OptionHandler ������
30
+ ����������� ���������������� � OptionParser ����������� ��� ��������� �
31
+ ��������� � OpenStruct �������� �� ���������. ����� ���� RuCodeGen ���������
32
+ ������ ��������� ������. ����� ������� ������� OptionHandler ���������������
33
+ ����������� ��������� ������������ ���������� �������� � ������� OpenStruct.
34
+
35
+ ����� �����, ���� �� ��������� �����-���� ������, �������������� ������
36
+ OpenStruct ���������� �������� ����������� � ������� ������
37
+ RuCodeGen::RunMode::options.
38
+
39
+ = �������� ������������ OptionHandler
40
+
41
+ ��� �������� ������������ OptionHandler ���������� �������������� �� ������
42
+ RuCodeGen::OptionHandler � �������������� ����� OptionHandler#setup.
43
+
44
+ ��������, ����� ���������� ������������ �������������� ���������
45
+ <tt>--debug-logs</tt> � <tt>--skip-comments</tt>. ��� ����� ��������� ���������
46
+ OptionHandler:
47
+ module ComplexGenerator
48
+ class OptionHandler < RuCodeGen::OptionHandler
49
+ def setup( parser, result )
50
+ # �� ��������� �� ����� ��������� ���������� ������.
51
+ result.complexgen_debug_logs = false
52
+ # �� ��������� �� ����� ������� �����������.
53
+ result.complexgen_skip_comments = false
54
+
55
+ parser.on( '--debug-logs', 'generate gebug output' ) do
56
+ result.complexgen_debug_logs = true
57
+ end
58
+
59
+ parser.on( '--skip-comments', 'skip comments in the result code' ) do
60
+ result.complexgen_skip_comments = true
61
+ end
62
+ end
63
+ end
64
+ end
65
+ RuCodeGen::RunMode.add_option_handler( ComplexGenerator.OptionHandler.new )
66
+
67
+ ������ ������� OptionHandler ��� ����������. ��� ������� DSL-������� � ������
68
+ <tt>--help</tt> ����� ������ �������� �������������� ����������
69
+ <tt>--debug-logs</tt> � <tt>--skip-comments</tt>.
70
+
71
+ ���� �� �� ����� <tt>--help</tt> ������� �������� ������������ ��������������
72
+ ����������, �� � OptionHandler ���������� �������������� ����� banner:
73
+ module ComplexGenerator
74
+ class OptionHandler < RuCodeGen::OptionHandler
75
+ def banner
76
+ "Complex generator.\n" +
77
+ "Copyright (C) 2007 ...\n" +
78
+ "For addition information please visit http://...\n"
79
+ end
80
+ ...
81
+ end
82
+ end
83
+ RuCodeGen::RunMode.add_option_handler( ComplexGenerator.OptionHandler.new )
84
+ RuCodeGen ������������ ��� ������ �� ���� ������������������ ��������
85
+ OptionHandler � ���������� ����� ���� ����� ����� ����� ������� ���������� �
86
+ ��������� ���������� ��������� ������.
87
+
88
+ ���� ��������� ��������� � �������������� ��������, �� ����������
89
+ �������������� ����� check. ��������, ����� ���� ���������
90
+ <tt>--gen-high-speed-code</tt> � <tt>--debug-logs</tt>, ������� ������
91
+ ������������ ���������. ��������������� ����� �������� � �������� ���������
92
+ ����� ��������� �������:
93
+ module ComplexGenerator
94
+ class OptionHandler < RuCodeGen::OptionHandler
95
+ def setup( parser, result )
96
+ # �� ��������� ������������ ������� ���.
97
+ result.complexgen_gen_high_speed_code = false
98
+ # �� ��������� �� ����� ��������� ���������� ������.
99
+ result.complexgen_debug_logs = false
100
+ ...
101
+
102
+ parser.on( '--gen-high-speed-code',
103
+ 'generate processor dependent, high speed code' ) do
104
+ result.complexgen_gen_high_speed_code = true
105
+ end
106
+ parser.on( '--debug-logs', 'generate gebug output' ) do
107
+ result.complexgen_debug_logs = true
108
+ end
109
+ ...
110
+ end
111
+
112
+ def check( result )
113
+ fail '--gen-high-speed-code and --debug-logs cannot ' +
114
+ 'be used together' if result.complexgen_gen_high_speed_code &&
115
+ result.complexgen_debug_logs
116
+ end
117
+ end
118
+ end
119
+ RuCodeGen::RunMode.add_option_handler( ComplexGenerator.OptionHandler.new )
120
+
121
+ = ����������� ������������ OptionHandler
122
+
123
+ ����������� OptionHandler ������ ���� ��������������� �� ����, ��� RuCodeGen
124
+ ������� ����������. ������� ����� ����� ������ ��� ����� ����� ����������� ����
125
+ ������������� ��� ��������� ������� � ��������:
126
+ module ComplexGenerator
127
+ class OptionHandler < RuCodeGen::OptionHandler
128
+ ...
129
+ end
130
+ class Description
131
+ ...
132
+ end
133
+ class Generator
134
+ ...
135
+ end
136
+ end
137
+ RuCodeGen::RunMode.add_option_handler( ComplexGenerator.OptionHandler.new )
138
+
139
+ ����� �������, ComplexGenerator::OptionHandler ����� ��������������� �
140
+ RuCodeGen ����� ��, ��� ������ � DSL-������� ����� ��������� �������� ������
141
+ ComplexGenerator.
142
+
143
+ = ��������� ������� � ����������� ���������� ��������� ������
144
+
145
+ ��������� ������� � ����������� ���������� ��������� ������ �������� �����
146
+ ����� RuCodeGen::RunMode.options. �� ����� ���� ���� ������ �����������: ����
147
+ ����� ����� ��������� ����������, ���� �� ���������� �� ����, ��� RuCodeGen
148
+ ������ ��������� ��������� ��������� ������. �.�. ������ ���������� �
149
+ RuCodeGen::RunMode.options �� ����� ������ DSL-�������.
150
+
151
+ ��� ��������, ��� � ����� ������ DSL-�������, ����� ������������ �������� �
152
+ ����������� � RuCodeGen �����������, ����� ��������� ������ ����������.
153
+ �������������, ����������� ���� ��� �������� <b>�� �����</b>:
154
+ def complexgen_dsl( &blk )
155
+ data = ComplexGenerator::Description.new
156
+ blk[ data ]
157
+
158
+ RuCodeGen::Generators.add(
159
+ RuCodeGen::FilenameProducer.produce( $0, data.get_file ),
160
+ # ������!!! ����� ��������� ������ ��� ����������.
161
+ ComplexGenerator.Generator.new(
162
+ data,
163
+ RuCodeGen::RunMode.options.complexgen_gen_high_speed_code,
164
+ RuCodeGen::RunMode.options.complexgen_debug_logs,
165
+ RuCodeGen::RunMode.options.complexgen_skip_comments ) )
166
+ end
167
+ ������ ����� ������ � ���������� ��������� ������ ����� ������������ ������
168
+ ������ generate:
169
+ module ComplexGenerator
170
+ ...
171
+ class Generator
172
+ def generate( to )
173
+ if RuCodeGen::RunMode::options.complexgen_gen_high_speed_code
174
+ ...
175
+ elsif RuCodeGen::RuCodeGen::options.complexgen_debug_logs
176
+ ...
177
+ end
178
+ end
179
+ end
180
+ end
181
+
182
+ = ������
183
+
184
+ ������ ����������� � ������������� ������������ OptionHandler ����� ������� �
185
+ �����
186
+ {cmd_line_handler/generator}[link://files/docs/examples/cmd_line_handler/generator.html]
@@ -0,0 +1,3 @@
1
+ = ������ ������������� ������������ OptionHandler
2
+
3
+ :include: examples/cmd_line_handler/generator.rb
@@ -0,0 +1,74 @@
1
+ #
2
+ # ������, ������� ������������� ������������� ������������
3
+ # OptionHandler.
4
+ #
5
+
6
+ require 'rubygems'
7
+
8
+ require 'RuCodeGen'
9
+
10
+ class LinesGenerator
11
+ def initialize
12
+ @file = nil
13
+ @lines = []
14
+ end
15
+
16
+ attr_reader :lines
17
+
18
+ def get_file; @file; end
19
+ def file( v ); @file = v; end
20
+
21
+ def line( length ); @lines << length; end
22
+
23
+ class OptionHandler < RuCodeGen::OptionHandler
24
+ def banner
25
+ "Just a test of OptionHandler usage\n"
26
+ end
27
+
28
+ def setup( parser, result )
29
+ result.lines_segment = '-'
30
+
31
+ parser.on( "-l", "--line TYPE", [ "single", "double" ],
32
+ { 'single' => '-', 'double' => '=' },
33
+ "type of line (single or double)" ) do |type|
34
+ result.lines_segment = type
35
+ end
36
+ end
37
+ end
38
+
39
+ class Generator
40
+ def initialize( lines )
41
+ @lines = lines
42
+ end
43
+
44
+ def generate( to )
45
+ segment_type = RuCodeGen::RunMode.options.lines_segment
46
+ @lines.each do |length|
47
+ to << segment_type * length << "\n"
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ RuCodeGen::RunMode.add_option_handler( LinesGenerator::OptionHandler.new )
54
+
55
+ def lines( &blk )
56
+ data = LinesGenerator.new
57
+ blk[ data ]
58
+
59
+ RuCodeGen::Generators.add(
60
+ RuCodeGen::FilenameProducer.produce( $0, data.get_file ),
61
+ LinesGenerator::Generator.new( data.lines ) )
62
+ end
63
+
64
+ if __FILE__ == $0
65
+
66
+ lines { |d|
67
+ d.file :script_relative => 'lines.txt'
68
+
69
+ d.line 3
70
+ d.line 5
71
+ d.line 8
72
+ }
73
+
74
+ end
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
- require_gem 'RuCodeGen'
2
+ require 'RuCodeGen'
3
3
 
4
4
  module Submit_Deliver
5
5
 
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
- require_gem 'RuCodeGen'
2
+ require 'RuCodeGen'
3
3
 
4
4
  cpp_value_incapsulator :cfg_t do |c|
5
5
  c.decl_file :script_relative => "cfg.decl.hpp"
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
- require_gem 'RuCodeGen'
2
+ require 'RuCodeGen'
3
3
 
4
4
  cpp_value_incapsulator :host_config_t do |c|
5
5
  c.decl_file :script_relative => "host_config.impl.hpp"
@@ -0,0 +1,136 @@
1
+ =begin
2
+ ��������� C++ ���� �� ��������� ������������ ����.
3
+
4
+ ��������, ��� ����� ������������ ���� some::long::name ����������:
5
+ namespace some {
6
+ namespace long {
7
+ namespace name {
8
+
9
+ } /* namespace name */
10
+ } /* namespace long */
11
+ } /* namespace some */
12
+
13
+ ���� ����� �� ������ � ��������� ������ � ���������� --name, �� ���
14
+ ����������� �� ������������ �����. ��� ���� �������������� ������
15
+ ������ ����:
16
+ name
17
+ namespace name
18
+
19
+ =end
20
+
21
+ require 'optparse'
22
+
23
+ module RuCodeGen
24
+
25
+ module AdHoc
26
+
27
+ module CppOpenNamespace
28
+
29
+ module Impl
30
+
31
+ # ������ ���������� ������� ����������.
32
+ #
33
+ # names:: ������ ���� ����������� ���� ��� ���������.
34
+ #
35
+ Options = Struct.new( :names )
36
+
37
+ # ������ ����� ��������� ������.
38
+ #
39
+ # ������������ ������ Options
40
+ #
41
+ # ���� � ��������� ������ ������ ����� '--help', �� ������ ����������
42
+ # �������� �������, � ������ �� �����������.
43
+ #
44
+ def Impl.parse_options( args )
45
+ res = Options.new( [] )
46
+
47
+ parser = OptionParser.new
48
+ parser.banner = <<BANNER
49
+ Generate C++ code for implementing namespace(s) with given name(s)
50
+
51
+ Usage:
52
+
53
+ rcgtool cpp-open-ns [<options>]
54
+
55
+ For example:
56
+
57
+ rcgtool cpp-open-ns -n some::long::name
58
+
59
+ will generate:
60
+
61
+ namespace some {
62
+ namespace long {
63
+ namespace name {
64
+ } /* namespace name */
65
+ } /* namespace long */
66
+ } /* namespace some */
67
+
68
+ BANNER
69
+
70
+ parser.on( '-h', '--help', 'Shows this message' ) do
71
+ puts parser
72
+ exit 1
73
+ end
74
+
75
+ parser.on( '-n', '--name NS', 'Name of namespace for processing' ) do |n|
76
+ res.names << n
77
+ end
78
+
79
+ parser.parse!( args )
80
+
81
+ res
82
+ end
83
+
84
+ # ��������� ���� ��� ������ �������� ������������ ����.
85
+ def Impl.generate_one( name, options )
86
+ splitted = name.split( /\s*::\s*/ )
87
+ splitted.each do |part|
88
+ puts "namespace #{part} {\n\n"
89
+ end
90
+ splitted.reverse.each do |part|
91
+ puts "} /* namespace #{part} */\n\n"
92
+ end
93
+ end
94
+
95
+ # ���������� ���������, ������� ��������� ������, �������
96
+ # ����� ��������� �������� ����������� ����.
97
+ LINE_WITH_NAMESPACE_NAME_REGEX = /^\s*(namespace\s+)?([[:graph:]]+)\s*$/
98
+
99
+ # ������ ����� �� ������������ ����� �� ��� ��� ���� ���
100
+ # ������������� ����������� ��������� LINE_WITH_NAMESPACE_NAME_REGEX
101
+ # � �������� �������� ����������� ���� �� ���.
102
+ def Impl.read_stdin
103
+ result = []
104
+ while line = ARGF.gets
105
+ if ( m = LINE_WITH_NAMESPACE_NAME_REGEX.match( line ) )
106
+ result << m[ 2 ]
107
+ end
108
+ end
109
+ result
110
+ end
111
+
112
+ end # module Impl
113
+
114
+ # ��������� ���� �� ����������� ����� ������.
115
+ def CppOpenNamespace.generate( args )
116
+ options = Impl.parse_options( args )
117
+ names = options.names
118
+ names = Impl.read_stdin if 0 == names.size
119
+
120
+ names.each do |name|
121
+ Impl.generate_one( name, options )
122
+ end
123
+ end
124
+
125
+ end # CppOpenNamespace
126
+
127
+ end # AdHoc
128
+
129
+ end # RuCodeGen
130
+
131
+ begin
132
+ RuCodeGen::AdHoc::CppOpenNamespace.generate( ARGV )
133
+ rescue => x
134
+ $stderr.puts x
135
+ end
136
+
@@ -0,0 +1,169 @@
1
+ #
2
+ # �������� ��� ������� ���������� ��������� ������.
3
+ #
4
+
5
+ require 'ostruct'
6
+ require 'optparse'
7
+
8
+ require 'rucodegen/version'
9
+
10
+ module RuCodeGen
11
+
12
+ # ������� ����� ��� �������� ������������� ��� ������-���� ����������
13
+ # ����� ��������� ������.
14
+ #
15
+ # ������ �������� � �������������:
16
+ # class MyOptionHandler < RuCodeGen::OptionHandler
17
+ # def banner
18
+ # "My super cool generator v.1.0.23-beta3"
19
+ # end
20
+ #
21
+ # def setup( parser, result )
22
+ # parser.on( "-C", "--cool OPTION", "cool generator option" ) do |p|
23
+ # result.cool_option = p
24
+ # end
25
+ # end
26
+ #
27
+ # def check( result )
28
+ # fail "Cool generator must be activated by --cool" unless result.cool_option
29
+ # end
30
+ # end
31
+ #
32
+ # <i>����������.</i> ������ OptionHandler#banner � OptionHandler#check
33
+ # �������� ��������������� � ����� ���������� �� ���������. �������������
34
+ # �� ����� ������ � ������ �������������.
35
+ #
36
+ class OptionHandler
37
+ # �������������� ������, ������� ����� ������������ ��� ������
38
+ # ������� � ��������� ������ ��������� ������.
39
+ #
40
+ # ������ ���������� nil, ���� ������ �� ���������.
41
+ #
42
+ def banner
43
+ nil
44
+ end
45
+
46
+ # ��������� ������� ����� ��������� ������ �� ������������� ���
47
+ # ���������� �����.
48
+ #
49
+ # [_parser_] ������ ���� OptionParser, ����������� ������ ��������� ������.
50
+ # [_result_] ������ ���� OpenStruct, � ������� ������ ���������� ����������
51
+ # ������� ���������� ��������� ������.
52
+ #
53
+ def setup( parser, result )
54
+ fail "OptionHandler#setup must be defined in derived class"
55
+ end
56
+
57
+ # �������� ������������ �������� ����������� �����, ������������� ���
58
+ # ����������� ����������.
59
+ #
60
+ # ���� �������������� �������� �� �����, �� ������ ����� ����� ��
61
+ # ����������������.
62
+ #
63
+ # [_result_] ������ ���� OpenStruct, � ������� ���������� ����������
64
+ # ������� ���������� ��������� ������.
65
+ #
66
+ def check( result )
67
+ end
68
+
69
+ end
70
+
71
+ # �����, ���������� �� ������ ����������� ����� RuCodeGen.
72
+ #
73
+ class RuCodeGenOptionHandler < OptionHandler
74
+ # ���������� ����� �������������.
75
+ BUILD = :build
76
+ # ����� �������������� �������������.
77
+ REBUILD = :rebuild
78
+ # ����� ������� ����������� �������������.
79
+ CLEAN = :clean
80
+ # ����� �������� �������������.
81
+ DRY_RUN = :dry_run
82
+
83
+ # ������� ����, ��� ������� ����� ��� �� ���������.
84
+ UNKNOWN = :unknown
85
+
86
+ def setup( parser, result )
87
+ # ���� �������� -m �� ������, �� �� ��������� �����������
88
+ # ����� build.
89
+ result.rucodegen_mode = BUILD
90
+
91
+ all_modes = %w[ build rebuild clean dry-run ]
92
+ all_modes_aliases = {
93
+ "build" => BUILD,
94
+ "rebuild" => REBUILD,
95
+ "clean" => CLEAN,
96
+ "dry_run" => DRY_RUN
97
+ }
98
+
99
+ parser.on( "-m", "--mode MODE", all_modes, all_modes_aliases,
100
+ "run mode", "(#{all_modes.join(', ')})" ) do |run_mode|
101
+ result.rucodegen_mode = run_mode
102
+ end
103
+ end
104
+ end
105
+
106
+ # �����, ���������� �� �������� ���� ������������� ��� �����������
107
+ # OptionHandler � �� ������ ��������� ������.
108
+ #
109
+ class CmdLineHandler
110
+ def initialize
111
+ # �������� ����� ���������� ������ ����� ���������
112
+ # ���������� ������ parse.
113
+ @options = nil
114
+
115
+ # � ������ ������������ ����� �� ����������� ������� ����������.
116
+ @handlers = [ RuCodeGenOptionHandler.new ]
117
+ end
118
+
119
+ # ��������� ���������� �������������� �����������.
120
+ def add_option_handler( handler )
121
+ @handlers << handler
122
+ end
123
+
124
+ # ������ � ����������� ������.
125
+ #
126
+ # ����������� ����������, ���� ��������� ������� ��� �� ����.
127
+ #
128
+ def options
129
+ fail "Options are not parsed yet" unless @options
130
+ @options
131
+ end
132
+
133
+ # ���������� ������� ��������� ������.
134
+ #
135
+ def parse( args )
136
+ result = OpenStruct.new
137
+ parser = OptionParser.new
138
+
139
+ parser.banner = make_banner
140
+
141
+ @handlers.each do |h| h.setup( parser, result ) end
142
+
143
+ parser.on_tail( "-h", "--help", "show this screen" ) do
144
+ puts parser
145
+ exit
146
+ end
147
+
148
+ parser.parse!( args )
149
+
150
+ @handlers.each do |h| h.check( result ) end
151
+
152
+ @options = result
153
+ end
154
+
155
+ private
156
+ # ������������ ������ �������.
157
+ #
158
+ def make_banner
159
+ banner = "RuCodeGen #{VERSION}. (C) 2005-2007 Yauheni Akhotnikau\n"
160
+ @handlers.each do |h|
161
+ b = h.banner
162
+ banner += "\n" + b if b
163
+ end
164
+ banner + "\n"
165
+ end
166
+ end
167
+
168
+ end # module RuCodeGen
169
+
@@ -4,6 +4,8 @@
4
4
 
5
5
  require 'optparse'
6
6
 
7
+ require 'rucodegen/cmd_line_handler.rb'
8
+
7
9
  module RuCodeGen
8
10
 
9
11
  # �����, �������� ������� �������� �������� ����������� ������ ������
@@ -23,56 +25,28 @@ module RuCodeGen
23
25
  class RunMode
24
26
 
25
27
  # ���������� ����� �������������.
26
- BUILD = 1
28
+ BUILD = RuCodeGenOptionHandler::BUILD
27
29
  # ����� �������������� �������������.
28
- REBUILD = 2
30
+ REBUILD = RuCodeGenOptionHandler::REBUILD
29
31
  # ����� ������� ����������� �������������.
30
- CLEAN = 3
32
+ CLEAN = RuCodeGenOptionHandler::CLEAN
31
33
  # ����� �������� �������������.
32
- DRY_RUN = 4
34
+ DRY_RUN = RuCodeGenOptionHandler::DRY_RUN
33
35
 
34
36
  # ������� ����, ��� ������� ����� ��� �� ���������.
35
- UNKNOWN = 0
36
- # ������� ����, ��� ������ ������� � ������ help.
37
- HELP = 5
37
+ UNKNOWN = RuCodeGenOptionHandler::UNKNOWN
38
38
 
39
39
  # ������� ����� ������.
40
40
  @@mode = UNKNOWN
41
41
 
42
+ # ���������� ���������� ��������� ������.
43
+ @@cmd_line_handler = CmdLineHandler.new
44
+
42
45
  # ����������� ������ ������ ����������� �������� ����������
43
46
  # ��������� ������.
44
47
  def RunMode.detect
45
- mode = UNKNOWN
46
-
47
- options = OptionParser.new do |opts|
48
- all_modes = %w[ build rebuild clean dry-run ]
49
- all_modes_aliases = {
50
- "build" => BUILD,
51
- "rebuild" => REBUILD,
52
- "clean" => CLEAN,
53
- "dry_run" => DRY_RUN
54
- }
55
-
56
- opts.on( "-m", "--mode MODE", all_modes, all_modes_aliases,
57
- "run mode", "(#{all_modes.join(', ')})" ) do |run_mode|
58
- mode = run_mode
59
- end
60
-
61
- opts.on( "-h", "--help", "show this screen" ) do
62
- puts opts
63
- mode = HELP
64
- end
65
- end
66
-
67
- if 0 != ARGV.size
68
- options.parse!
69
- fail "run mode must be specified" if UNKNOWN == mode
70
- else
71
- # ������ ��� ���������� �������� ����� ���������� �������������.
72
- mode = BUILD
73
- end
74
-
75
- @@mode = mode
48
+ @@cmd_line_handler.parse( ARGV )
49
+ @@mode = options.rucodegen_mode
76
50
  end
77
51
 
78
52
  # ��������� �������� ������ ������.
@@ -83,6 +57,23 @@ class RunMode
83
57
  @@mode
84
58
  end
85
59
 
60
+ # ���������� ��� ������ ����������� ���������� ��������� ������.
61
+ #
62
+ # [_handler_] ������, ����������� ��������� OptionHandler.
63
+ #
64
+ def RunMode.add_option_handler( handler )
65
+ @@cmd_line_handler.add_option_handler( handler )
66
+ end
67
+
68
+ # ��������� ������ ����� ��������� ������.
69
+ #
70
+ # ��������� ���������� ��� ������� ��������� � ����� �� ����,
71
+ # ��� ����� ��������� ������ ����� ���������.
72
+ #
73
+ def RunMode.options
74
+ @@cmd_line_handler.options
75
+ end
76
+
86
77
  end # class RunMode
87
78
 
88
79
  end # module RuCodeGen
@@ -0,0 +1,10 @@
1
+ #
2
+ # ������ RuCodeGen
3
+ #
4
+
5
+ module RuCodeGen
6
+
7
+ VERSION = '0.3.0'
8
+
9
+ end
10
+
@@ -0,0 +1,64 @@
1
+ $:.unshift( File.dirname( __FILE__ ) + "/../lib" )
2
+
3
+ require 'test/unit'
4
+
5
+ require 'rucodegen/cmd_line_handler.rb'
6
+
7
+ class TC_CmdLineHandler < Test::Unit::TestCase
8
+ class MyHandler < RuCodeGen::OptionHandler
9
+ class ValueNotSpecifiedError < RuntimeError
10
+ end
11
+
12
+ def banner
13
+ "Just a test\n"
14
+ end
15
+
16
+ def setup( parser, result )
17
+ result.cool_mode = false
18
+ parser.on( "--cool", "just a cool option" ) do
19
+ result.cool_mode = true
20
+ end
21
+
22
+ parser.on( "--value VAL", "mandatory option" ) do |v|
23
+ result.value = v
24
+ end
25
+ end
26
+
27
+ def check( result )
28
+ fail ValueNotSpecifiedError.new( "--value missed" ) unless result.value
29
+ end
30
+ end
31
+
32
+ def setup
33
+ @cmd_line_handler = RuCodeGen::CmdLineHandler.new
34
+ @cmd_line_handler.add_option_handler( MyHandler.new )
35
+ end
36
+
37
+ def test_access_option_without_parsing
38
+ assert_raise( RuntimeError ) do
39
+ @cmd_line_handler.options
40
+ end
41
+ end
42
+
43
+ def test_no_value_option
44
+ assert_raise( MyHandler::ValueNotSpecifiedError ) do
45
+ @cmd_line_handler.parse( [] )
46
+ end
47
+ end
48
+
49
+ def test_value
50
+ @cmd_line_handler.parse( [ "--value", "TEST" ] )
51
+ assert_equal( "TEST", @cmd_line_handler.options.value )
52
+ end
53
+
54
+ def test_cool_mode_off
55
+ @cmd_line_handler.parse( [ "--value", "TEST" ] )
56
+ assert_equal( false, @cmd_line_handler.options.cool_mode )
57
+ end
58
+
59
+ def test_cool_mode_on
60
+ @cmd_line_handler.parse( [ "--value", "TEST", "--cool" ] )
61
+ assert_equal( true, @cmd_line_handler.options.cool_mode )
62
+ end
63
+ end
64
+
@@ -26,16 +26,6 @@ class TC_RunMode < Test::Unit::TestCase
26
26
  assert_equal RUNMODE::BUILD, RUNMODE.mode
27
27
  end
28
28
 
29
- def test_help_mode_short
30
- ARGV << "-h"
31
- assert_equal RUNMODE::HELP, RUNMODE.mode
32
- end
33
-
34
- def test_help_mode_long
35
- ARGV << "--help"
36
- assert_equal RUNMODE::HELP, RUNMODE.mode
37
- end
38
-
39
29
  def test_modes_short
40
30
  modes = {
41
31
  "build" => RUNMODE::BUILD,
@@ -4,6 +4,7 @@ require 'test/unit'
4
4
 
5
5
  require 'tc_generators'
6
6
  require 'tc_filename_producer'
7
+ require 'tc_cmd_line_handler'
7
8
  require 'tc_run_mode'
8
9
  require 'tc_codegen_initiator'
9
10
  require 'tc_class_attribute'
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: RuCodeGen
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.2
7
- date: 2007-03-15 00:00:00 +03:00
6
+ version: 0.3.0
7
+ date: 2007-06-04 00:00:00 +04:00
8
8
  summary: Simple code generation tool
9
9
  require_paths:
10
10
  - lib
@@ -29,6 +29,7 @@ post_install_message:
29
29
  authors:
30
30
  - Yauheni Akhotnikau
31
31
  files:
32
+ - bin/rcgtool
32
33
  - tests/embedded_data
33
34
  - tests/embedded_data/host_config
34
35
  - tests/embedded_data/host_config/embedded.txt
@@ -45,6 +46,7 @@ files:
45
46
  - tests/embedded_data/in_no_fragments.txt
46
47
  - tests/generators_test_extension.rb
47
48
  - tests/tc_class_attribute.rb
49
+ - tests/tc_cmd_line_handler.rb
48
50
  - tests/tc_codegen_initiator.rb
49
51
  - tests/tc_embedded_extract_fragments.rb
50
52
  - tests/tc_embedded_run_rucodegen.rb
@@ -55,7 +57,12 @@ files:
55
57
  - tests/tc_value_incapsulator_gen.rb
56
58
  - tests/ts_rucodegen.rb
57
59
  - lib/rucodegen
60
+ - lib/rucodegen/adhoc
61
+ - lib/rucodegen/adhoc/templates
62
+ - lib/rucodegen/adhoc/templates/cpp-open-ns
63
+ - lib/rucodegen/adhoc/templates/cpp-open-ns/g.rb
58
64
  - lib/rucodegen/begin_end.rb
65
+ - lib/rucodegen/cmd_line_handler.rb
59
66
  - lib/rucodegen/codegen.rb
60
67
  - lib/rucodegen/embedded.rb
61
68
  - lib/rucodegen/filename_producer.rb
@@ -63,9 +70,14 @@ files:
63
70
  - lib/rucodegen/generators.rb
64
71
  - lib/rucodegen/run_mode.rb
65
72
  - lib/rucodegen/value_incapsulator.rb
73
+ - lib/rucodegen/version.rb
66
74
  - lib/rucodegen.rb
75
+ - docs/AdHoc
76
+ - docs/CmdLineHandler
67
77
  - docs/EmbeddedRuCodeGen
68
78
  - docs/examples
79
+ - docs/examples/cmd_line_handler
80
+ - docs/examples/cmd_line_handler/generator
69
81
  - docs/examples/cpp
70
82
  - docs/examples/cpp/custom
71
83
  - docs/examples/cpp/custom/submit_deliver
@@ -75,6 +87,8 @@ files:
75
87
  - docs/examples/cpp/value_incapsulator/host_config
76
88
  - docs/Principle
77
89
  - docs/ValueIncapsulator
90
+ - examples/cmd_line_handler
91
+ - examples/cmd_line_handler/generator.rb
78
92
  - examples/cpp
79
93
  - examples/cpp/custom
80
94
  - examples/cpp/custom/submit_deliver
@@ -103,8 +117,12 @@ extra_rdoc_files:
103
117
  - Rakefile
104
118
  - LICENSE
105
119
  - NEWS
120
+ - docs/AdHoc
121
+ - docs/CmdLineHandler
106
122
  - docs/EmbeddedRuCodeGen
107
123
  - docs/examples
124
+ - docs/examples/cmd_line_handler
125
+ - docs/examples/cmd_line_handler/generator
108
126
  - docs/examples/cpp
109
127
  - docs/examples/cpp/custom
110
128
  - docs/examples/cpp/custom/submit_deliver
@@ -114,8 +132,8 @@ extra_rdoc_files:
114
132
  - docs/examples/cpp/value_incapsulator/host_config
115
133
  - docs/Principle
116
134
  - docs/ValueIncapsulator
117
- executables: []
118
-
135
+ executables:
136
+ - rcgtool
119
137
  extensions: []
120
138
 
121
139
  requirements: []