codgen 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.idea/.name +1 -0
  4. data/.idea/.rakeTasks +7 -0
  5. data/.idea/codgen.iml +142 -0
  6. data/.idea/encodings.xml +5 -0
  7. data/.idea/idea/.name +1 -0
  8. data/.idea/idea/codgen.iml +140 -0
  9. data/.idea/idea/encodings.xml +5 -0
  10. data/.idea/idea/misc.xml +5 -0
  11. data/.idea/idea/modules.xml +9 -0
  12. data/.idea/idea/scopes/scope_settings.xml +5 -0
  13. data/.idea/idea/vcs.xml +7 -0
  14. data/.idea/idea/workspace.xml +830 -0
  15. data/.idea/inspectionProfiles/Project_Default.xml +7 -0
  16. data/.idea/inspectionProfiles/profiles_settings.xml +7 -0
  17. data/.idea/misc.xml +5 -0
  18. data/.idea/modules.xml +9 -0
  19. data/.idea/scopes/scope_settings.xml +5 -0
  20. data/.idea/vcs.xml +7 -0
  21. data/.idea/workspace.xml +1213 -0
  22. data/Gemfile +4 -0
  23. data/LICENSE.txt +22 -0
  24. data/README.md +32 -0
  25. data/Rakefile +2 -0
  26. data/bin/codgen.rb +50 -0
  27. data/codgen.gemspec +27 -0
  28. data/lib/codgen/auto_style.rb +111 -0
  29. data/lib/codgen/constants.rb +5 -0
  30. data/lib/codgen/debug_helper.rb +15 -0
  31. data/lib/codgen/flattener.rb +32 -0
  32. data/lib/codgen/logger.rb +8 -0
  33. data/lib/codgen/mapping.rb +40 -0
  34. data/lib/codgen/statement.rb +163 -0
  35. data/lib/codgen/template.rb +40 -0
  36. data/lib/codgen/version.rb +3 -0
  37. data/lib/codgen.rb +59 -0
  38. data/test/behavior/basic_test.rb +10 -0
  39. data/test/behavior/output_spec.rb +36 -0
  40. data/test/behavior/test_utils.rb +16 -0
  41. data/test/data/Input/CreateDatabase.sql +10 -0
  42. data/test/data/Input/DbContextTemplate.cs +18 -0
  43. data/test/data/Input/ModelTemplate.cs +26 -0
  44. data/test/data/Input/example-data.json +75 -0
  45. data/test/data/Input/hello_world.txt.mustache +1 -0
  46. data/test/data/Input/model_template.rb.ctemp +8 -0
  47. data/test/data/Input/test_conditionals +7 -0
  48. data/test/data/Input/test_escapes +6 -0
  49. data/test/data/Map.json +36 -0
  50. data/test/data/Output/CreateMyBlogDatabase.sql +17 -0
  51. data/test/data/Output/MsMvc/MyBlog/DAL/MyBlogContext.cs +17 -0
  52. data/test/data/Output/MsMvc/MyBlog/Models/Comment.cs +14 -0
  53. data/test/data/Output/MsMvc/MyBlog/Models/Post.cs +17 -0
  54. data/test/data/Output/Ruby/my_blog/Models/comment.rb +3 -0
  55. data/test/data/Output/Ruby/my_blog/Models/post.rb +3 -0
  56. data/test/data/config.json +25 -0
  57. data/test/data/expected_output/MsMvc/MyBlog/DAL/MyBlogContext.cs +17 -0
  58. data/test/data/expected_output/MsMvc/MyBlog/Models/Comment.cs +14 -0
  59. data/test/data/expected_output/MsMvc/MyBlog/Models/Post.cs +17 -0
  60. data/test/data/expected_output/Ruby/my_blog/Models/comment.rb +3 -0
  61. data/test/data/expected_output/Ruby/my_blog/Models/post.rb +3 -0
  62. data/test/data/test.mustache +5 -0
  63. data/test/unit/codgen_engine_spec.rb +12 -0
  64. data/test/unit/flattener_spec.rb +51 -0
  65. data/test/unit/template_spec.rb +30 -0
  66. metadata +222 -0
@@ -0,0 +1,10 @@
1
+ Create Database {{ApplicationName}}
2
+ {{#entities}}
3
+
4
+ Create Table {{EntityNames}} (
5
+ {{#fields}}
6
+ {{FieldName}} {{type}}
7
+ , ##:!IsLastTemplateInstance?
8
+ {{/fields}}
9
+ )
10
+ {{/entities}}
@@ -0,0 +1,18 @@
1
+ using {{ApplicationName}}.Models;
2
+ using System.Data.Entity;
3
+ using System.Data.Entity.ModelConfiguration.Conventions;
4
+
5
+ namespace {{ApplicationName}}.DAL
6
+ {
7
+ public class {{ApplicationName}}Context : DbContext
8
+ {
9
+ {{#entities}}
10
+ public DbSet<Blog> {{EntityNames}} { get; set; }
11
+ {{/entities}}
12
+
13
+ protected override void OnModelCreating(DbModelBuilder modelBuilder)
14
+ {
15
+
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,26 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.ComponentModel.DataAnnotations.Schema;
4
+
5
+
6
+ namespace {{ApplicationName}}.Models
7
+ {
8
+ public class {{EntityName}}
9
+ {
10
+ {{#fields}}
11
+ {{#Required}}
12
+ [Required]
13
+ {{/Required}}
14
+ {{#hasMaxLength}}
15
+ [StringLength({{maxLength}})]
16
+ {{/hasMaxLength}}
17
+ public {{cstype}} {{FieldName}} { get; set; }
18
+ {{/fields}}
19
+ {{#hasmany}}
20
+ ICollection<{{EntityName}}> {{EntityNames}} { get; set; }
21
+ {{/hasmany}}
22
+ {{#belongsto}}
23
+ {{EntityName}} {{EntityName}} { get; set; }
24
+ {{/belongsto}}
25
+ }
26
+ }
@@ -0,0 +1,75 @@
1
+ {
2
+ "@application name": "my blog",
3
+ "test_escapes": [
4
+ {
5
+ "codgenVar": "The Rain in Spain stays mainly in the plains"
6
+ }
7
+ ],
8
+ "entities": [
9
+ {
10
+ "@entity name": "post",
11
+ "fields": [
12
+ {
13
+ "@field name": "post id",
14
+ "type": "UniqueIdentifier",
15
+ "read only": true
16
+ },
17
+ {
18
+ "@field name": "post title",
19
+ "type": "varchar(200)",
20
+ "$required": true,
21
+ "hasMaxLength": true,
22
+ "maxLength": "200"
23
+ },
24
+ {
25
+ "@field name": "post text",
26
+ "type": "text"
27
+ }
28
+ ],
29
+ "hasmany": [
30
+ {
31
+ "@entity name": "comment"
32
+ }
33
+ ]
34
+ },
35
+ {
36
+ "@entity name": "comment",
37
+ "fields": [
38
+ {
39
+ "@field name": "comment id",
40
+ "type": "UniqueIdentifier",
41
+ "read only": true
42
+ },
43
+ {
44
+ "@field name": "comment text",
45
+ "type": "text"
46
+ }
47
+ ],
48
+ "belongsto": [
49
+ {
50
+ "@entity name": "post"
51
+ }
52
+ ]
53
+ }
54
+ ],
55
+ "test_conditionals": [
56
+ {
57
+ "name": "if",
58
+ "a": true,
59
+ "b": true,
60
+ "c": true
61
+ },
62
+ {
63
+ "name": "elseif",
64
+ "a": true,
65
+ "b": false,
66
+ "c": false
67
+ },
68
+ {
69
+ "name": "else",
70
+ "a": false,
71
+ "b": false,
72
+ "c": false
73
+ }
74
+ ]
75
+ }
@@ -0,0 +1 @@
1
+ Hello {{name}}
@@ -0,0 +1,8 @@
1
+ class {{EntityName}} < ActiveRecord::Base
2
+ {{#hasmany}}
3
+ has_many {{entity_names}}
4
+ {{/hasmany}}
5
+ {{#belongsto}}
6
+ belongs_to {{entity_names}}
7
+ {{/belongsto}}
8
+ end
@@ -0,0 +1,7 @@
1
+ <<< if a & b | c >>>
2
+ if
3
+ <<< elseif a & !b | c >>>
4
+ elseif
5
+ <<< else >>>
6
+ else
7
+ <<< endif >>>
@@ -0,0 +1,6 @@
1
+ `{`{handleBarsVar`}`}
2
+
3
+ ````
4
+ ``{
5
+ ```{
6
+ ``{{codgenVar}}
@@ -0,0 +1,36 @@
1
+ {
2
+ "caseTo": "lower",
3
+ "type": {
4
+ "cstype": {
5
+ "(?i)bigint": "long",
6
+ "(?i)int": "int",
7
+ "(?i)varchar\\([0-9]*\\)": "string",
8
+ "(?i)nvarchar(\\([0-9]*\\))": "string",
9
+ "(?i)text": "string",
10
+ "(?i)smallint": "short",
11
+ "(?i)uniqueidentifier": "Guid",
12
+ "(?i)DateTime": "DateTime",
13
+ "(?i)Date": "DateTime"
14
+ },
15
+ "rbtype": {
16
+ "(?i)bigint": "Integer",
17
+ "(?i)int": "Integer",
18
+ "(?i)varchar\\([0-9]*\\)": "String",
19
+ "(?i)nvarchar(\\([0-9]*\\))": "String",
20
+ "(?i)text": "String",
21
+ "(?i)smallint": "Integer",
22
+ "(?i)uniqueidentifier": "String",
23
+ "(?i)DateTime": "DateTime",
24
+ "(?i)Date": "Date"
25
+ },
26
+ "jstype": {
27
+ "(?i)bigint": "Number",
28
+ "(?i)int": "Number",
29
+ "(?i)varchar\\([0-9]*\\)": "String",
30
+ "(?i)nvarchar(\\([0-9]*\\))": "String",
31
+ "(?i)text": "String",
32
+ "(?i)smallint": "Number",
33
+ "(?i)uniqueidentifier": "String"
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,17 @@
1
+ Create Database MyBlog
2
+
3
+ Create Table Posts (
4
+ PostId UniqueIdentifier
5
+ , ##:!IsLastTemplateInstance?
6
+ PostTitle varchar(200)
7
+ , ##:!IsLastTemplateInstance?
8
+ PostText text
9
+ , ##:!IsLastTemplateInstance?
10
+ )
11
+
12
+ Create Table Comments (
13
+ CommentId UniqueIdentifier
14
+ , ##:!IsLastTemplateInstance?
15
+ CommentText text
16
+ , ##:!IsLastTemplateInstance?
17
+ )
@@ -0,0 +1,17 @@
1
+ using MyBlog.Models;
2
+ using System.Data.Entity;
3
+ using System.Data.Entity.ModelConfiguration.Conventions;
4
+
5
+ namespace MyBlog.DAL
6
+ {
7
+ public class MyBlogContext : DbContext
8
+ {
9
+ public DbSet<Blog> Posts { get; set; }
10
+ public DbSet<Blog> Comments { get; set; }
11
+
12
+ protected override void OnModelCreating(DbModelBuilder modelBuilder)
13
+ {
14
+
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.ComponentModel.DataAnnotations.Schema;
4
+
5
+
6
+ namespace MyBlog.Models
7
+ {
8
+ public class Comment
9
+ {
10
+ public Guid CommentId { get; set; }
11
+ public string CommentText { get; set; }
12
+ Post Post { get; set; }
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.ComponentModel.DataAnnotations.Schema;
4
+
5
+
6
+ namespace MyBlog.Models
7
+ {
8
+ public class Post
9
+ {
10
+ public Guid PostId { get; set; }
11
+ [Required]
12
+ [StringLength(200)]
13
+ public string PostTitle { get; set; }
14
+ public string PostText { get; set; }
15
+ ICollection<Comment> Comments { get; set; }
16
+ }
17
+ }
@@ -0,0 +1,3 @@
1
+ class Comment < ActiveRecord::Base
2
+ belongs_to posts
3
+ end
@@ -0,0 +1,3 @@
1
+ class Post < ActiveRecord::Base
2
+ has_many comments
3
+ end
@@ -0,0 +1,25 @@
1
+ {
2
+ "map": "Map.json",
3
+ "templates": [
4
+ {
5
+ "in": "Input/model_template.rb.ctemp",
6
+ "source": "entities",
7
+ "out": "Output/Ruby/{{application_name}}/Models/{{entity_name}}.rb"
8
+ },
9
+ {
10
+ "in": "Input/ModelTemplate.cs",
11
+ "source": "entities",
12
+ "out": "Output/MsMvc/{{ApplicationName}}/Models/{{EntityName}}.cs"
13
+ },
14
+ {
15
+ "in": "Input/DbContextTemplate.cs",
16
+ "source": "entities",
17
+ "out": "Output/MsMvc/{{ApplicationName}}/DAL/{{ApplicationName}}Context.cs"
18
+ },
19
+ {
20
+ "in": "Input/CreateDatabase.sql",
21
+ "out": "Output/Create{{ApplicationName}}Database.sql"
22
+ }
23
+ ],
24
+ "data": "Input/example-data.json"
25
+ }
@@ -0,0 +1,17 @@
1
+ using MyBlog.Models;
2
+ using System.Data.Entity;
3
+ using System.Data.Entity.ModelConfiguration.Conventions;
4
+
5
+ namespace MyBlog.DAL
6
+ {
7
+ public class MyBlogContext : DbContext
8
+ {
9
+ public DbSet<Blog> Posts { get; set; }
10
+ public DbSet<Blog> Comments { get; set; }
11
+
12
+ protected override void OnModelCreating(DbModelBuilder modelBuilder)
13
+ {
14
+
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.ComponentModel.DataAnnotations.Schema;
4
+
5
+
6
+ namespace MyBlog.Models
7
+ {
8
+ public class Comment
9
+ {
10
+ public Guid CommentId { get; set; }
11
+ public string CommentText { get; set; }
12
+ Post Post { get; set; }
13
+ }
14
+ }
@@ -0,0 +1,17 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.ComponentModel.DataAnnotations.Schema;
4
+
5
+
6
+ namespace MyBlog.Models
7
+ {
8
+ public class Post
9
+ {
10
+ public Guid PostId { get; set; }
11
+ [Required]
12
+ [StringLength(200)]
13
+ public string PostTitle { get; set; }
14
+ public string PostText { get; set; }
15
+ ICollection<Comment> Comments { get; set; }
16
+ }
17
+ }
@@ -0,0 +1,3 @@
1
+ class Comment < ActiveRecord::Base
2
+ belongs_to posts
3
+ end
@@ -0,0 +1,3 @@
1
+ class Post < ActiveRecord::Base
2
+ has_many comments
3
+ end
@@ -0,0 +1,5 @@
1
+ Hello {{name}}
2
+ You have just won {{value}} dollars!
3
+ {{#in_ca}}
4
+ Well, {{taxed_value}} dollars, after taxes.
5
+ {{/in_ca}}
@@ -0,0 +1,12 @@
1
+ require 'rspec'
2
+ require_relative '../../lib/codgen'
3
+
4
+ describe 'codgen' do
5
+ config = {
6
+ 'templates' => [{'source' => 'data', 'in' => 'Input/hello_world.txt.mustache', 'out' => 'Output/hello_world.txt' }],
7
+ 'data' => { 'data' => [{'name' => 'World'}], 'foo' => 'blah' }
8
+ }
9
+ it 'should have one result' do
10
+ expect(Codgen.run(config).length).to eq 1
11
+ end
12
+ end
@@ -0,0 +1,51 @@
1
+ require 'rspec'
2
+ require_relative '../../lib/codgen/flattener'
3
+
4
+ describe 'Flattener' do
5
+ data_root = {
6
+ 'root_prop1' => 'root_prop1_val',
7
+ 'prop2' => 'root_prop2_val',
8
+ 'object1' => {
9
+ 'prop3' => 'prop3_val',
10
+ 'object2' => {
11
+ 'array' =>[
12
+ {
13
+ 'prop1' => 'prop1_val',
14
+ 'prop2' => 'prop2_val'
15
+ }
16
+ ]
17
+ }
18
+ }
19
+ }
20
+
21
+ data_root2 = { 'data' => [{'name' => 'World'}], 'foo' => 'blah'}
22
+
23
+ it 'should have prop1 = prop1_val when it flattens to object1.object2[0] given @data_root' do
24
+ expect(Codgen::Flattener.merge(data_root, ['object1', 'object2', 'array'])[0]['prop1']).to eq('prop1_val')
25
+ end
26
+
27
+ it 'should have prop2 = prop2_val when it flattens to object1.object2[0] given @data_root' do
28
+ expect(Codgen::Flattener.merge(data_root, ['object1', 'object2', 'array'])[0]['prop2']).to eq('prop2_val')
29
+ end
30
+
31
+ it 'should have root_prop1 = root_prop1_val when it flattens to object1.object2[0] @given data_root' do
32
+ expect(Codgen::Flattener.merge(data_root, ['object1', 'object2', 'array'])[0]['root_prop1']).to eq('root_prop1_val')
33
+ end
34
+
35
+ # When data_root2
36
+ it 'should have data as an array' do
37
+ expect(Codgen::Flattener.merge(data_root2, ['data']).is_a?(Array)).to eq(true)
38
+ end
39
+
40
+ it 'should have a count of 1' do
41
+ expect(Codgen::Flattener.merge(data_root2, ['data']).length).to eq(1)
42
+ end
43
+
44
+ it 'should get the main data properly' do
45
+ expect(Codgen::Flattener.merge(data_root2, ['data'])[0]['name']).to eq('World')
46
+ end
47
+
48
+ it 'should get the parent data properly' do
49
+ expect(Codgen::Flattener.merge(data_root2, ['data'])[0]['foo']).to eq('blah')
50
+ end
51
+ end
@@ -0,0 +1,30 @@
1
+ require 'rspec'
2
+ require_relative '../../lib/codgen/template'
3
+
4
+ describe 'template' do
5
+ config = {'source' => 'data', 'in' => 'Input/hello_world.txt.mustache', 'out' => 'Output/hello_world.txt' }
6
+ data_root = { 'data' => [{'name' => 'World'}], 'foo' => 'blah' }
7
+ template_text = 'Hello {{name}}'
8
+ template = Codgen::Template.new(config, data_root)
9
+
10
+ describe 'initialize' do
11
+ it 'should get the input template file content properly' do
12
+ expect(template.template).to eq('Hello {{name}}')
13
+ end
14
+
15
+ it 'should have data that is a flattened form of data_root.data' do
16
+ expect(template.data).to eq(Codgen::Flattener.merge(data_root, ['data']))
17
+ end
18
+ end
19
+ describe 'fill_template' do
20
+ it 'should return a hash' do
21
+ expect(template.fill_template.is_a?(Hash)).to eq(true)
22
+ end
23
+ it 'should return a output file with location "Output/hello_world.txt"' do
24
+ expect(template.fill_template.keys[0]).to eq('Output/hello_world.txt')
25
+ end
26
+ it 'should return a output file with location "Output/hello_world.txt"' do
27
+ expect(template.fill_template['Output/hello_world.txt']).to eq('Hello World')
28
+ end
29
+ end
30
+ end