ycn 0.0.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008 FIXME full name
1
+ Copyright (c) 2008 Andrew Koster
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -7,13 +7,22 @@ Rakefile
7
7
  bin/ycn-gen
8
8
  config/hoe.rb
9
9
  config/requirements.rb
10
- lib/ycn.rb
11
- lib/ycn/version.rb
12
- lib/ycn/ycn.rb
10
+ lib/ycn.rb
13
11
  lib/ycn/header.rb
14
- lib/ycn/java_klass.rb
12
+ lib/ycn/java/java_klass.rb
13
+ lib/ycn/java/java_method.rb
14
+ lib/ycn/java/java_property.rb
15
+ lib/ycn/java/java_class.erb
16
+ lib/ycn/ruby/ruby_klass.rb
17
+ lib/ycn/ruby/ruby_method.rb
18
+ lib/ycn/ruby/ruby_property.rb
19
+ lib/ycn/ruby/ruby_class.erb
15
20
  lib/ycn/klass.rb
16
- lib/ycn/string_manip.rb
21
+ lib/ycn/method.rb
22
+ lib/ycn/property.rb
23
+ lib/ycn/string_manip.rb
24
+ lib/ycn/version.rb
25
+ lib/ycn/ycn.rb
17
26
  lib/ycn/ycn_functions.rb
18
27
  script/console
19
28
  script/console.cmd
@@ -1,7 +1,5 @@
1
-
2
- For more information on ycn, see http://ycn.rubyforge.org
3
-
4
- NOTE: Change this information in PostInstall.txt
5
- You can also delete it if you don't want it.
6
-
7
-
1
+ For more information on ycn, see :
2
+
3
+ - http://ycn.rubyforge.org
4
+ - http://naturalcode.wordpress.com
5
+ - http://github.com/naturalcode/ycn/tree
data/README.txt CHANGED
@@ -1,32 +1,127 @@
1
1
  = ycn
2
2
 
3
- * FIX (url)
3
+ http://rubyforge.org/projects/ycn/
4
+ https://github.com/naturalcode/ycn/tree
4
5
 
5
6
  == DESCRIPTION:
6
7
 
7
- FIX (describe your package)
8
+ Yaml Class Notation is a compact, concise way of defining object
9
+ classes in a beautiful and language-neutral way.
10
+
11
+ Generate valid, executable code for any language you're forced use
12
+ from YCN files.
13
+
14
+ No semicolons, curly braces, or verbose keywords.
8
15
 
9
16
  == FEATURES/PROBLEMS:
10
17
 
11
- * FIX (list of features or problems)
12
-
13
- == SYNOPSIS:
14
-
15
- FIX (code sample of usage)
18
+ Features
19
+ - Reads a class definition from a YAML file
20
+ - Transforms a YAML class definition into well-formatted code
21
+ - Currently supports Java as the output language
22
+
23
+ Problems
24
+ - Currently supports only Java as the output language
25
+ - Not all unusual cases (ex: a class without properties) have necessarily been tested
26
+ - Needs more hooks for custom behavior and plugins
27
+ - Needs easy support for different languages
16
28
 
17
29
  == REQUIREMENTS:
18
30
 
19
- * FIX (list of requirements)
31
+ - configatron 1.2.1
20
32
 
21
33
  == INSTALL:
22
34
 
23
- * FIX (sudo gem install, anything else)
35
+ gem install ycn
36
+
37
+ == SYNOPSIS:
38
+
39
+ # ycn_example.rb
40
+ # Generates Java classes from a YCN Yaml file.
41
+
42
+ require 'ycn'
43
+
44
+ project = {
45
+ :name => "JavaExprat4AK - Le polymorphisme, les classes " +
46
+ "abstraites et les interfaces.",
47
+ :desc => "G�re une collection de cowboys, indiens, brigands " +
48
+ "et dames en d�tresse, ainsi que leurs boissons.",
49
+ :author => "Andrew Koster",
50
+
51
+ :package => 'cowboys et indiens'
52
+ }
53
+
54
+ Ycn.generate project, :java
55
+
56
+ # pcg/cowboys_et_indiens.yml
57
+
58
+ humain:
59
+ new:
60
+ - nom, texte_parole
61
+ properties:
62
+ String:
63
+ - nom
64
+ - boisson_favorite = "de l'eau"
65
+ StringBuilder:
66
+ - texte_parole
67
+ methods:
68
+ void:
69
+ parler(string): |
70
+ getTexteParole().append(
71
+ "(" + getNom() + ") - " + psParoles + "\n")
72
+ commenter(string): |
73
+ getTexteParole().append(psCommentaire + "\n")
74
+ se_presenter: |
75
+ parler("Bonjour, je suis " + getNom() +
76
+ " et j'aime " + getBoissonFavorite() + ".")
77
+ boire: |
78
+ parler("Ah! Un bon verre avec " +
79
+ getBoissonFavorite() + "! GLOUPS!")
80
+
81
+ indien < humain:
82
+ new:
83
+ - nom, texte_parole
84
+ - nom, texte_parole, plumes
85
+ properties:
86
+ int:
87
+ - plumes = 0
88
+ String:
89
+ - totem = "Coyote"
90
+ - boisson_favorite = "du jus de racine"
91
+ methods:
92
+ void:
93
+ se_presenter: |
94
+ super.sePresenter()
95
+ parler("Mon totem est le " + getTotem() +
96
+ " et j'ai " + getPlumes() + " plume(s).")
97
+ scalper(cowboy): |
98
+ pvVisagePale.seFaireScalper(this)
99
+ setPlumes(getPlumes() + 1)
100
+
101
+ cowboy < humain:
102
+ new:
103
+ - nom, texte_parole
104
+ - nom, texte_parole, popularite
105
+ properties:
106
+ int:
107
+ - popularite = 0
108
+ String:
109
+ - adjectif = "vaillant"
110
+ methods:
111
+ void:
112
+ se_presenter: |
113
+ super.sePresenter()
114
+ parler("Je suis " + getAdjectif() + " et je suis" +
115
+ " populaire pour la lib�ration de " +
116
+ getPopularite() + " dame(s).")
117
+ se_faire_scalper(indien): |
118
+ parler("A�e! Ma t�te, " + piIndien.getNom() + " !")
24
119
 
25
120
  == LICENSE:
26
121
 
27
122
  (The MIT License)
28
123
 
29
- Copyright (c) 2008 FIXME full name
124
+ Copyright (c) 2008 Andrew Koster
30
125
 
31
126
  Permission is hereby granted, free of charge, to any person obtaining
32
127
  a copy of this software and associated documentation files (the
@@ -10,17 +10,17 @@ Dir.mkdir(PCG_DIR)
10
10
  example_file_content = <<TEXT
11
11
  require 'ycn'
12
12
 
13
- project = {
13
+ Ycn::generate( :java, {
14
14
  :name => "JavaExprat4AK - Le polymorphisme, les classes " +
15
15
  "abstraites et les interfaces.",
16
16
  :desc => "Gère une collection de cowboys, indiens, brigands " +
17
17
  "et dames en détresse, ainsi que leurs boissons.",
18
18
  :author => "Andrew Koster",
19
19
 
20
- :package => 'cowboys et indiens'
21
- }
22
-
23
- Ycn.generate project, :java
20
+ :package => 'cowboys et indiens',
21
+
22
+ :getters => true, :setters => false
23
+ })
24
24
  TEXT
25
25
 
26
26
  example_package_content = <<TEXT
@@ -2,7 +2,7 @@ require 'fileutils'
2
2
  include FileUtils
3
3
 
4
4
  require 'rubygems'
5
- %w[rake hoe newgem rubigen].each do |req_gem|
5
+ %w[rake hoe newgem rubigen configatron].each do |req_gem|
6
6
  begin
7
7
  require req_gem
8
8
  rescue LoadError
data/lib/ycn.rb CHANGED
@@ -2,15 +2,27 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  require 'yaml'
5
+ require 'configatron'
6
+ require 'erb'
7
+ require 'pp'
5
8
 
6
- require File.join(File.dirname(__FILE__), 'ycn', 'ycn')
7
- require File.join(File.dirname(__FILE__), 'ycn', 'header')
8
- require File.join(File.dirname(__FILE__), 'ycn', 'java_klass')
9
- require File.join(File.dirname(__FILE__), 'ycn', 'klass')
10
- require File.join(File.dirname(__FILE__), 'ycn', 'string_manip')
11
- require File.join(File.dirname(__FILE__), 'ycn', 'ycn_functions')
9
+ y = 'ycn'
10
+
11
+ require File.join(File.dirname(__FILE__), y, 'java/java_method')
12
+ require File.join(File.dirname(__FILE__), y, 'java/java_property')
13
+ require File.join(File.dirname(__FILE__), y, 'java/java_klass')
14
+ require File.join(File.dirname(__FILE__), y, 'ruby/ruby_method')
15
+ require File.join(File.dirname(__FILE__), y, 'ruby/ruby_property')
16
+ require File.join(File.dirname(__FILE__), y, 'ruby/ruby_klass')
17
+ require File.join(File.dirname(__FILE__), y, 'method')
18
+ require File.join(File.dirname(__FILE__), y, 'property')
19
+ require File.join(File.dirname(__FILE__), y, 'klass')
20
+ require File.join(File.dirname(__FILE__), y, 'ycn')
21
+ require File.join(File.dirname(__FILE__), y, 'header')
22
+ require File.join(File.dirname(__FILE__), y, 'string_manip')
23
+ require File.join(File.dirname(__FILE__), y, 'ycn_functions')
24
+
25
+ include StringManip
12
26
 
13
27
  module Ycn
14
- end
15
-
16
- puts "BEHOLD!"
28
+ end
@@ -0,0 +1,17 @@
1
+ <%= klass.java_header %><%=
2
+ klass.java_package
3
+ %>
4
+ <%= klass.java_imports
5
+ %>
6
+ <%= klass.java_class_declaration %>
7
+ {
8
+ <% for p in klass.properties do
9
+ %><%= p.java_property %>
10
+ <% end %><%=
11
+ klass.java_constructors %><%
12
+ klass.methods.each do |m| %>
13
+ <%= m.java_signature %>
14
+ {
15
+ <%= m.java_show_content %>
16
+ }
17
+ <% end %><%= klass.java_accessors %>}
@@ -0,0 +1,97 @@
1
+ #coding: utf-8
2
+
3
+ module JavaKlass
4
+ def java_header
5
+ text = <<HEAD
6
+ Programme : #{configatron.program_name}
7
+ Auteur(s) : #{configatron.author_name}
8
+ Date : #{Time.now.day}/#{Time.now.month}/#{Time.now.year}
9
+ Description : #{configatron.description}
10
+ HEAD
11
+
12
+ '/*' + text.split("\n").map{ |l|
13
+ "\n * #{l}"
14
+ }.join + "\n */\n"
15
+ end
16
+
17
+ def java_package
18
+ @package ? "\npackage pcg#{camelize @package};" : ''
19
+ end
20
+
21
+ def java_imports
22
+ text = properties.map{ |property|
23
+ import = case property.type
24
+ when 'Date'
25
+ "import java.util.Date;"
26
+ when 'Time'
27
+ "import java.util.Time;"
28
+ else
29
+ nil
30
+ end
31
+ import
32
+ }.compact
33
+
34
+ if text.size > 0
35
+ text = "\n" + text.join("\n") + "\n"
36
+ end
37
+ end
38
+
39
+ def java_class_declaration
40
+ "public class #{name}#{" extends #{parent.name}" if parent}"
41
+ end
42
+
43
+ def java_constructors
44
+ @construct_params.map { |parameter_set|
45
+ "\n public #{@name}(" +
46
+
47
+ parameter_set.map { |parameter|
48
+ type = find_var( parameter ).type
49
+ "#{type} #{styled_var :riki, parameter, :p, type}"
50
+
51
+ }.join(', ') + ")\n {\n " +
52
+
53
+ parameter_set.map { |parameter|
54
+ type = find_var( parameter ).type
55
+ "set#{camelize parameter}(#{styled_var :riki, parameter, :p, type});"
56
+ }.join("\n ") +
57
+
58
+ java_prop_default_overrides
59
+ }.join("\n }\n") + "\n }\n"
60
+ end
61
+
62
+ def java_prop_default_overrides
63
+ prop_default_overrides.map { |property|
64
+ property = find_var( property )
65
+ "\n super.set#{camelize property.name}(#{property.default_value});"
66
+ }.join("\n")
67
+ end
68
+
69
+ def java_accessors; java_g_s_etters; end
70
+
71
+ def java_g_s_etters
72
+ text = properties.map { |property|
73
+ unless prop_default_overrides.include? property.name
74
+ type = property.type
75
+ name = property.name
76
+ result = ''
77
+ if configatron.getters; result += <<TEXT
78
+ public #{type} get#{camelize name}()
79
+ {
80
+ return #{styled_var :riki, name, :g, type };
81
+ }
82
+ TEXT
83
+ end
84
+
85
+ if configatron.setters; result += <<TEXT
86
+ public void set#{camelize name}(#{type} #{styled_var :riki, name, :p, type})
87
+ {
88
+ #{styled_var :riki, name, :g, type } = #{styled_var :riki, name, :p, type};
89
+ }
90
+ TEXT
91
+ end
92
+ result
93
+ end
94
+ }.join
95
+ text
96
+ end
97
+ end
@@ -0,0 +1,19 @@
1
+ module JavaMethod
2
+ def java_signature
3
+ params = @parameters.map{ |p|
4
+ "#{camelize p} p#{p[0].chr.downcase}#{camelize p}"
5
+ }.join(', ')
6
+
7
+ "public #{@type} #{low_camelize @name}(#{params})"
8
+ end
9
+
10
+ def java_show_content
11
+ @content.split("\n").map { |line|
12
+ unless line =~ /[\+\(]\s*$/
13
+ line += ';'
14
+ end
15
+
16
+ line
17
+ }.join("\n")
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ module JavaProperty
2
+ def java_property
3
+ t = "#{@type} "
4
+ t+= styled_var :riki, @name, :g, @type
5
+ if @default_value && !@klass.prop_default_overrides.include?( @name )
6
+ t += " = #{@default_value}"
7
+ end
8
+ t += ';'
9
+ end
10
+ end
@@ -1,95 +1,98 @@
1
- require "ycn/java_klass"
2
- require "ycn/string_manip"
3
-
4
1
  class Klass
5
2
  attr_accessor :name, :parent, :properties, :methods,
6
- :method_params, :construct_params, :prop_defaults,
7
- :prop_default_overrides
8
-
9
- include JavaKlass
10
- include StringManip
3
+ :construct_params, :prop_default_overrides
11
4
 
12
5
  def initialize name, parent, properties, methods,
13
6
  construct_params=nil, package=nil
14
7
 
15
- @name = camelize(name)
16
- @parent = parent ? camelize(parent) : nil
17
- @properties = properties
18
- @methods = methods
19
- _extract_method_params
20
- @construct_params = _organize_constructor_params(construct_params)
8
+ extend JavaKlass if configatron.lang == :java
9
+ extend RubyKlass if configatron.lang == :ruby
10
+
11
+ @name = camelize( name )
12
+ @parent = parent ? camelize( parent ) : nil
13
+ @properties = parse_properties( properties )
14
+ @methods = parse_methods( methods )
15
+ @construct_params = organize_constructor_params( construct_params )
21
16
  @package = package
22
17
  end
23
18
 
24
- def _extract_method_params
25
- return nil unless @methods
26
- @method_params = {}
27
-
28
- @methods.each_pair do |type, meths|
29
- meths.each_key do |m|
30
- if m =~ /\(.+\)/
31
- m_parameters =
32
- /\(.*\)/.match(m).
33
- to_s[1..-2].split(/ |, /)
34
-
35
- m_name_only = m.dup.sub!(/\(.*\)/, '')
36
-
37
- meths.store(m_name_only, meths[m])
38
- meths.delete(m)
39
- @method_params.store(m_name_only, m_parameters)
40
- end
41
- end
42
- end
19
+ def print_to template
20
+ klass = self
21
+ ERB.new( template ).result( binding )
43
22
  end
44
23
 
45
- def _organize_constructor_params params_array
46
- return nil unless params_array
47
- params_array.map{ |params| params.split(/ |, /) }
24
+ def parse_properties properties_hash
25
+ properties_hash.keys.map { |type|
26
+ properties_hash[type].map do |property|
27
+ p = extract_default_values({
28
+ :name=>property, :type=>type
29
+ })
30
+
31
+ Property.new self, p[:name], p[:type], p[:default_value]
32
+ end
33
+ }.flatten
48
34
  end
49
35
 
50
- def extract_default_values
51
- @prop_defaults = {}
52
- return nil unless @properties
53
-
54
- @properties.each_pair do |type, props|
55
- props.map! do |p|
56
- if /[^(\s*=\s*)]+\s*=\s*/.match(p)
57
- default_value = p.sub(/[^(\s*=\s*)]+\s*=\s*/, '')
58
- p.sub!(/\s*=\s*.*/, '')
59
- @prop_defaults.store(p, default_value)
60
- end
61
- p
36
+ def parse_methods methods_hash
37
+ methods_hash.keys.map { |type|
38
+ methods_hash[type].keys.map do |method|
39
+ content = methods_hash[type][method].split("\n").join("\n ")
40
+
41
+ m = extract_method_params({
42
+ :name=>method, :type=>type,
43
+ :content=>content
44
+ })
45
+
46
+ Methodd.new( m[:name], m[:type], m[:params], m[:content] )
62
47
  end
63
- end
64
- end
48
+ }.flatten
49
+ end
65
50
 
66
- def fix_default_overrides
67
- @prop_default_overrides = {}
68
- return nil unless @parent && @prop_defaults
69
-
70
- @prop_defaults.each_pair do |property, value|
71
- type = find_type(property)
51
+ def extract_method_params method
52
+ if method[:name] =~ /\(.+\)/
53
+ m_parameters =
54
+ /\(.*\)/.match(method[:name]).
55
+ to_s[1..-2].split(/ |, /)
72
56
 
73
- if @parent.properties && @parent.properties[type]
74
- if @parent.properties[type].include? property
75
- @prop_default_overrides[property] =
76
- @prop_defaults.delete property
77
- end
78
- end
57
+ m_name_only = method[:name].dup.sub!(/\(.*\)/, '')
58
+ method[:name] = m_name_only
59
+ method[:params] = m_parameters
79
60
  end
61
+
62
+ method
80
63
  end
81
64
 
82
- def find_type property_name
83
- prop_hash = {}
84
- return nil unless @properties
85
-
86
- @properties.each_pair do |type, props|
87
- props.each { |p| prop_hash.store(p, type) }
65
+ def extract_default_values property
66
+ if property[:name] =~ /([^(\s*=\s*)]+)\s*=\s*(.+)/
67
+ property[:name] = $1
68
+ property[:default_value] = $2
88
69
  end
89
70
 
90
- type = prop_hash[property_name]
71
+ property
72
+ end
73
+
74
+ def organize_constructor_params params_array
75
+ return [] unless params_array
76
+ params_array.map{ |params| params.split(/ |, /) }
77
+ end
78
+
79
+ def fix_default_overrides
80
+ @prop_default_overrides = []
81
+ return nil unless @parent
91
82
 
92
- (!type && parent) ?
93
- parent.find_type(property_name) : type
83
+ @prop_default_overrides = @properties.select { |p|
84
+ p.default_value && @parent.find_var( p.name )
85
+ }.map { |p| p.name }
86
+ end
87
+
88
+ def find_var var_name
89
+ result = nil
90
+ if @parent
91
+ result = @parent.find_var var_name
92
+ end
93
+ @properties.each do |property|
94
+ result = property if property.name == var_name
95
+ end
96
+ result
94
97
  end
95
98
  end
@@ -0,0 +1,12 @@
1
+ class Methodd
2
+ attr_accessor :name, :type, :parameters, :content
3
+
4
+ def initialize name, type, parameters, content
5
+ eval("extend #{camelize configatron.lang}Method")
6
+
7
+ @name = name
8
+ @type = type
9
+ @parameters = parameters || []
10
+ @content = content
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ class Property
2
+ attr_accessor :klass, :name, :type, :default_value
3
+
4
+ def initialize klass, name, type, default_value
5
+ eval("extend #{camelize configatron.lang}Property")
6
+
7
+ @klass = klass
8
+ @name = name
9
+ @type = type
10
+ @default_value = default_value
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ <%= klass.ruby_header %><%= klass.ruby_imports %>
2
+ <%= klass.ruby_class_declaration %>
3
+ <%= klass.ruby_accessors %>
4
+ <%= klass.ruby_constructors %><% for p in klass.properties do %>
5
+ <%= p.ruby_property %><% end %>
6
+ end
7
+ <% klass.methods.each do |m| %>
8
+ <%= m.ruby_signature %>
9
+ <%= m.ruby_show_content %>
10
+ end
11
+ <% end %>end
@@ -0,0 +1,71 @@
1
+ #coding: utf-8
2
+
3
+ module RubyKlass
4
+ def ruby_header
5
+ text = <<HEAD
6
+ Programme : #{configatron.program_name}
7
+ Auteur(s) : #{configatron.author_name}
8
+ Date : #{Time.now.day}/#{Time.now.month}/#{Time.now.year}
9
+ Description : #{configatron.description}
10
+ HEAD
11
+
12
+ text.split("\n").map{ |l|
13
+ "# #{l}\n"
14
+ }.join
15
+ end
16
+
17
+ def ruby_imports
18
+ #~ text = properties.map{ |property|
19
+ #~ import = case property.type
20
+ #~ when 'Date'
21
+ #~ "import java.util.Date;"
22
+ #~ when 'Time'
23
+ #~ "import java.util.Time;"
24
+ #~ else
25
+ #~ nil
26
+ #~ end
27
+ #~ import
28
+ #~ }.compact
29
+
30
+ #~ if text.size > 0
31
+ #~ text = "\n" + text.join("\n") + "\n"
32
+ #~ end
33
+ end
34
+
35
+ def ruby_class_declaration
36
+ "class #{name}#{" < #{parent.name}" if parent}"
37
+ end
38
+
39
+ def ruby_constructors
40
+ #~ @construct_params.map { |parameter_set|
41
+ #~ "\n public #{@name}(" +
42
+
43
+ #~ parameter_set.map { |parameter|
44
+ #~ type = find_var( parameter ).type
45
+ #~ "#{type} #{styled_var :riki, parameter, :p, type}"
46
+
47
+ #~ }.join(', ') + ")\n {\n " +
48
+
49
+ #~ parameter_set.map { |parameter|
50
+ #~ type = find_var( parameter ).type
51
+ #~ "set#{camelize parameter}(#{styled_var :riki, parameter, :p, type});"
52
+ #~ }.join("\n ") +
53
+
54
+ #~ java_prop_default_overrides
55
+ #~ }.join("\n }\n") + "\n }\n"
56
+ "def initialize " + @construct_params.last.join(', ')
57
+ end
58
+
59
+ #~ def java_prop_default_overrides
60
+ #~ prop_default_overrides.map { |property|
61
+ #~ property = find_var( property )
62
+ #~ "\n super.set#{camelize property.name}(#{property.default_value});"
63
+ #~ }.join("\n")
64
+ #~ end
65
+
66
+ def ruby_accessors; ruby_g_s_etters; end
67
+
68
+ def ruby_g_s_etters
69
+ "attr_accessor #{@properties.map{|p| ":#{p.name}"}.join(', ')}\n"
70
+ end
71
+ end
@@ -0,0 +1,20 @@
1
+ module RubyMethod
2
+ def ruby_signature
3
+ params = @parameters.map{ |p|
4
+ "#{p} p#{p[0].chr.downcase}_#{p}"
5
+ }.join(', ')
6
+
7
+ "def #{@name} #{params}"
8
+ end
9
+
10
+ def ruby_show_content
11
+ #~ @content.split("\n").map { |line|
12
+ #~ unless line =~ /[\+\(]\s*$/
13
+ #~ line += ';'
14
+ #~ end
15
+
16
+ #~ line
17
+ #~ }.join("\n")
18
+ @content
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module RubyProperty
2
+ def ruby_property
3
+ t = " @#{@name} ="
4
+ if @default_value
5
+ t += " #{@default_value}"
6
+ end
7
+ t
8
+ end
9
+ end
@@ -10,11 +10,15 @@ module StringManip
10
10
  end
11
11
 
12
12
  def camelize string
13
- string.gsub('_', ' ').split(' ').map { |word|
13
+ string.to_s.gsub('_', ' ').split(' ').map { |word|
14
14
  word.capitalize
15
15
  }.join
16
16
  end
17
17
 
18
+ def camel_case string
19
+ camelize string
20
+ end
21
+
18
22
  def low_camelize string
19
23
  w = 0
20
24
  string.gsub('_', ' ').split(' ').map { |word|
@@ -22,10 +26,4 @@ module StringManip
22
26
  w == 1 ? word.downcase : word.capitalize
23
27
  }.join
24
28
  end
25
-
26
- def self.camelize string
27
- string.gsub('_', ' ').split(' ').map { |word|
28
- word.capitalize
29
- }.join
30
- end
31
29
  end
@@ -1,7 +1,7 @@
1
1
  module Ycn
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 0
4
+ MINOR = 2
5
5
  TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -1,23 +1,27 @@
1
+ #coding: utf-8
2
+
1
3
  module Ycn
2
- def self.generate project_hash, language
3
- puts 'moo'
4
+ def self.generate language, config
4
5
  $base_dir = Dir.pwd
5
6
 
6
- require 'yaml'
7
- require 'configatron'
8
- require 'ycn/klass'
9
- require 'ycn/ycn_functions'
10
- require 'ycn/header'
11
- require 'ycn/string_manip'
7
+ Header.configure_from config
8
+ config[:package] =
9
+ config[:package].to_s.gsub(' ', '_')
10
+
11
+ config[:getters] = true unless config.has_key? :getters
12
+ config[:setters] = true unless config.has_key? :setters
13
+ config[:constructors] = true unless config.has_key? :constructors
14
+
15
+ configatron { |c|
16
+ c.package = config[:package]
17
+ c.getters = config[:getters]
18
+ c.setters = config[:setters]
19
+ c.lang = language
20
+ }
12
21
 
13
- Header.configure_from project_hash
14
- project_hash[:package] =
15
- project_hash[:package].to_s.gsub(' ', '_')
16
- configatron { |c| c.package = project_hash[:package] }
17
-
18
22
  classes_yaml = YAML::load(
19
23
  correct_for_blank_last_method( open(
20
- "#{$base_dir}/pcg/#{project_hash[:package]}.yml", 'r')))
24
+ "#{$base_dir}/pcg/#{config[:package]}.yml")))
21
25
 
22
26
  classes = []
23
27
 
@@ -26,21 +30,23 @@ module Ycn
26
30
  end
27
31
 
28
32
  fix_inheritance_and_overrides classes
29
-
30
- generation_dir = "#{$base_dir}/generated_code"
31
- package_name = "pcg#{StringManip::camelize configatron.package}"
32
- output_dir = "#{generation_dir}/#{package_name}"
33
33
 
34
- Dir.mkdir generation_dir unless File.exists? generation_dir
35
- Dir.mkdir output_dir unless File.exists? output_dir
34
+ package_name = "pcg#{camelize configatron.package}"
35
+ output_dir = "#{$base_dir}/#{package_name}"
36
36
 
37
+ Dir.mkdir output_dir unless File.exists? output_dir
38
+
37
39
  classes.each do |klass|
40
+
41
+ template = open( "#{File.dirname(__FILE__)}/#{language}/#{language}_class.erb" ).read
42
+
38
43
  file_name = "#{klass.name}.#{extension[language]}"
39
44
 
40
45
  File.open( "#{output_dir}/#{file_name}", 'w' ) { |f|
41
- output = eval("klass.to_#{language.to_s.downcase}")
42
- puts output + "\n"
43
- f.print output
46
+ content = klass.print_to( template )
47
+ f.print content
48
+ puts content
49
+ #~ pp klass
44
50
  }
45
51
  end
46
52
  end
@@ -1,3 +1,5 @@
1
+ #~ require 'property'
2
+
1
3
  def correct_for_blank_last_method file
2
4
  # Without this, a blank mapping on the last line of the file
3
5
  # is incorrectly interpreted as a String.
@@ -17,8 +19,6 @@ end
17
19
  def fix_inheritance_and_overrides classes
18
20
  classes.each { |klass|
19
21
  klass.parent = (classes.find_all{ |c| c.name == klass.parent })[0]
20
- }.each { |klass|
21
- klass.extract_default_values
22
22
  }.each { |klass|
23
23
  klass.fix_default_overrides }
24
24
  end
@@ -1,11 +1,86 @@
1
- <html>
2
- <head>
3
- <meta http-equiv="Content-type" content="text/html; charset=utf-8">
4
- <title>ycn</title>
5
-
6
- </head>
7
- <body id="body">
8
- <p>This page has not yet been created for RubyGem <code>ycn</code></p>
9
- <p>To the developer: To generate it, update website/index.txt and run the rake task <code>website</code> to generate this <code>index.html</code> file.</p>
10
- </body>
11
- </html>
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ ycn
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>ycn</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/ycn"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/ycn" class="numbers">0.0.1</a>
37
+ </div>
38
+ <h1>&amp;#x2192; &#8216;ycn&#8217;</h1>
39
+ <h2>What</h2>
40
+ <h2>Installing</h2>
41
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">ycn</span></pre></p>
42
+ <h2>The basics</h2>
43
+ <h2>Demonstration of usage</h2>
44
+ <h2>Forum</h2>
45
+ <p><a href="http://groups.google.com/group/ycn">http://groups.google.com/group/ycn</a></p>
46
+ <p><span class="caps">TODO</span> &#8211; create Google Group &#8211; ycn</p>
47
+ <h2>How to submit patches</h2>
48
+ <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
49
+ <p><span class="caps">TODO</span> &#8211; pick <span class="caps">SVN</span> or Git instructions</p>
50
+ <p>The trunk repository is <code>svn://rubyforge.org/var/svn/ycn/trunk</code> for anonymous access.</p>
51
+ <p><span class="caps">OOOORRRR</span></p>
52
+ <p>You can fetch the source from either:</p>
53
+ <ul>
54
+ <li>rubyforge: <span class="caps">MISSING</span> IN <span class="caps">ACTION</span></li>
55
+ </ul>
56
+ <p><span class="caps">TODO</span> &#8211; You can not created a RubyForge project, OR have not run <code>rubyforge config</code><br />
57
+ yet to refresh your local rubyforge data with this projects&#8217; id information.</p>
58
+ <p>When you do this, this message will magically disappear!</p>
59
+ <p>Or you can hack website/index.txt and make it all go away!!</p>
60
+ <ul>
61
+ <li>github: <a href="http://github.com/GITHUB_USERNAME/ycn/tree/master">http://github.com/GITHUB_USERNAME/ycn/tree/master</a></li>
62
+ </ul>
63
+ <pre>git clone git://github.com/GITHUB_USERNAME/ycn.git</pre>
64
+ <p><span class="caps">TODO</span> &#8211; add &#8220;github_username: username&#8221; to ~/.rubyforge/user-config.yml and newgem will reuse it for future projects.</p>
65
+ <ul>
66
+ <li>gitorious: <a href="git://gitorious.org/ycn/mainline.git">git://gitorious.org/ycn/mainline.git</a></li>
67
+ </ul>
68
+ <pre>git clone git://gitorious.org/ycn/mainline.git</pre>
69
+ <h3>Build and test instructions</h3>
70
+ <pre>cd ycn
71
+ rake test
72
+ rake install_gem</pre>
73
+ <h2>License</h2>
74
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
75
+ <h2>Contact</h2>
76
+ <p>Comments are welcome. Send an email to <a href="mailto:FIXME"><span class="caps">FIXME</span> full name</a> email via the <a href="http://groups.google.com/group/ycn">forum</a></p>
77
+ <p class="coda">
78
+ <a href="FIXME email">FIXME full name</a>, 22nd September 2008<br>
79
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
80
+ </p>
81
+ </div>
82
+
83
+ <!-- insert site tracking codes here, like Google Urchin -->
84
+
85
+ </body>
86
+ </html>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ycn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Koster
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-22 00:00:00 -04:00
12
+ date: 2008-10-07 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -47,12 +47,21 @@ files:
47
47
  - config/hoe.rb
48
48
  - config/requirements.rb
49
49
  - lib/ycn.rb
50
- - lib/ycn/version.rb
51
- - lib/ycn/ycn.rb
52
50
  - lib/ycn/header.rb
53
- - lib/ycn/java_klass.rb
51
+ - lib/ycn/java/java_klass.rb
52
+ - lib/ycn/java/java_method.rb
53
+ - lib/ycn/java/java_property.rb
54
+ - lib/ycn/java/java_class.erb
55
+ - lib/ycn/ruby/ruby_klass.rb
56
+ - lib/ycn/ruby/ruby_method.rb
57
+ - lib/ycn/ruby/ruby_property.rb
58
+ - lib/ycn/ruby/ruby_class.erb
54
59
  - lib/ycn/klass.rb
60
+ - lib/ycn/method.rb
61
+ - lib/ycn/property.rb
55
62
  - lib/ycn/string_manip.rb
63
+ - lib/ycn/version.rb
64
+ - lib/ycn/ycn.rb
56
65
  - lib/ycn/ycn_functions.rb
57
66
  - script/console
58
67
  - script/console.cmd
@@ -75,14 +84,12 @@ files:
75
84
  - website/template.html.erb
76
85
  has_rdoc: true
77
86
  homepage: http://ycn.rubyforge.org
78
- post_install_message: |+
79
-
80
- For more information on ycn, see http://ycn.rubyforge.org
81
-
82
- NOTE: Change this information in PostInstall.txt
83
- You can also delete it if you don't want it.
84
-
87
+ post_install_message: |-
88
+ For more information on ycn, see :
85
89
 
90
+ - http://ycn.rubyforge.org
91
+ - http://naturalcode.wordpress.com
92
+ - http://github.com/naturalcode/ycn/tree
86
93
  rdoc_options:
87
94
  - --main
88
95
  - README.txt
@@ -1,169 +0,0 @@
1
- module JavaKlass
2
- def java_header
3
- text = <<HEAD
4
- Programme : #{configatron.program_name}
5
- Auteur(s) : #{configatron.author_name}
6
- Date : #{Time.now.day}/#{Time.now.month}/#{Time.now.year}
7
- Description : #{configatron.description}
8
- HEAD
9
-
10
- '/*' + text.split("\n").map{ |l|
11
- "\n * #{l}"
12
- }.join + "\n */\n"
13
- end
14
-
15
- def to_java
16
- java_header+
17
- java_package+
18
- java_imports+
19
- java_class_declaration+
20
- java_properties+
21
- java_constructors+
22
- java_methods+
23
- java_g_s_etters+
24
- java_bottom
25
- end
26
-
27
- def java_package
28
- @package ? "\npackage pcg#{camelize @package};\n" : ''
29
- end
30
-
31
- def java_imports
32
- text = ''
33
- if properties
34
- text += properties.keys.map{ |type|
35
- type == 'Date' ? "\nimport java.util.Date;\n" : nil
36
- }.join
37
- end
38
- text
39
- end
40
-
41
- def java_class_declaration
42
- <<TEXT
43
-
44
- public class #{name}#{" extends #{parent.name}" if parent}
45
- {
46
- TEXT
47
- end
48
-
49
- def java_properties
50
- text = ''
51
-
52
- if properties
53
- properties.each_pair do |type, prop_names|
54
- if prop_names.class == Array
55
- empty_set = true
56
-
57
- text += prop_names.map { |name|
58
- if prop_default_overrides[name]
59
- ''
60
- else
61
- empty_set = false
62
- name_displayed = styled_var :riki, name, :g, type
63
- value_assignment = prop_defaults[name] ? " = #{prop_defaults[name]}" : nil
64
-
65
- " private #{type} #{name_displayed}#{value_assignment};\n"
66
- end
67
- }.join# + (empty_set ? '' : "\n")
68
-
69
- end
70
- end
71
- end
72
-
73
- text = (text == '') ? '' : "\n#{text}"
74
- end
75
-
76
- def java_constructors
77
- text = <<TEXT
78
-
79
- // Constructeur par défaut
80
- public #{name}()
81
- {#{_java_prop_default_overrides}
82
- TEXT
83
- #~ text +=
84
- text += "#{"\n" unless prop_default_overrides.keys.size > 0} }\n"
85
- if construct_params
86
- #~ pp construct_params
87
- text += construct_params.map{ |constructor|
88
- "\n public #{name}(" +
89
- constructor.map { |param|
90
- type = find_type(param)
91
- "#{type} #{styled_var :riki, param, :p, type}"
92
- }.join(', ') + ")\n {\n" +
93
- constructor.map { |param|
94
- type = find_type(param)
95
- " set#{camelize param}(#{styled_var :riki, param, :p, type});"
96
- }.join("\n") +
97
- _java_prop_default_overrides + "\n }\n"
98
- }.join
99
- end
100
- text
101
- end
102
-
103
- def _java_prop_default_overrides
104
- p = prop_default_overrides.keys.map { |property|
105
- "\n super.set#{camelize property}(#{prop_default_overrides[property]});"
106
- }.join("\n")
107
- end
108
-
109
- def java_methods
110
- text = ""
111
- #~ puts "#{pp(methods)}"
112
- if methods.class == Hash
113
- methods.each_pair do |type, meth|
114
- #~ puts 't' + type
115
- if meth.class == Hash
116
- meth.each_pair { |m, contents|
117
-
118
- if method_params[m]
119
- parameters = method_params[m].map{ |item|
120
- "#{camelize item} #{styled_var :riki, item, :p, item}"
121
- }.join(', ')
122
- end
123
-
124
- text += "\n public #{type} #{low_camelize m}(" +
125
- "#{parameters if parameters})\n" +
126
- " {\n#{contents.split("\n").map{ |l| " #{l}#{';' if !(l =~ /(\+|\{|\}|\()\z/)}"}.join("\n") if contents}\n }\n"
127
- }
128
- else
129
- puts "Warning! No method type for #{type}"
130
- end
131
- end
132
-
133
- else
134
-
135
- end
136
- text
137
- end
138
-
139
- def java_g_s_etters
140
- text = ''
141
- if properties
142
- properties.each_pair do |type, prop_names|
143
- text += prop_names.map { |name|
144
- unless prop_default_overrides[name]
145
- <<TEXT
146
-
147
- public #{type} get#{camelize name}()
148
- {
149
- return #{styled_var :riki, name, :g, type };
150
- }
151
-
152
- public void set#{camelize name}(#{type} #{styled_var :riki, name, :p, type})
153
- {
154
- #{styled_var :riki, name, :g, type } = #{styled_var :riki, name, :p, type};
155
- }
156
- TEXT
157
- else
158
- ''
159
- end
160
- }.join
161
- end
162
- end
163
- text
164
- end
165
-
166
- def java_bottom
167
- '}'
168
- end
169
- end