codgen 0.0.1

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.
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