shift-lang 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +29 -0
  5. data/Rakefile +2 -0
  6. data/bin/sft +5 -0
  7. data/bin/shift +5 -0
  8. data/lib/app_engine_templates/app.yaml +13 -0
  9. data/lib/app_engine_templates/pystache/__init__.py +8 -0
  10. data/lib/app_engine_templates/pystache/__init__.pyc +0 -0
  11. data/lib/app_engine_templates/pystache/loader.py +47 -0
  12. data/lib/app_engine_templates/pystache/loader.pyc +0 -0
  13. data/lib/app_engine_templates/pystache/template.py +177 -0
  14. data/lib/app_engine_templates/pystache/template.pyc +0 -0
  15. data/lib/app_engine_templates/pystache/view.py +94 -0
  16. data/lib/app_engine_templates/pystache/view.pyc +0 -0
  17. data/lib/heroku_templates/Gemfile +6 -0
  18. data/lib/heroku_templates/Procfile +1 -0
  19. data/lib/shift-lang/builder/db_model.rb +20 -0
  20. data/lib/shift-lang/builder/url_handler.rb +17 -0
  21. data/lib/shift-lang/builder.rb +103 -0
  22. data/lib/shift-lang/generator/javascript_generator.rb +410 -0
  23. data/lib/shift-lang/generator/javascript_templates.rb +37 -0
  24. data/lib/shift-lang/generator/python_generator.rb +330 -0
  25. data/lib/shift-lang/generator/python_templates.rb +44 -0
  26. data/lib/shift-lang/generator/ruby_generator.rb +334 -0
  27. data/lib/shift-lang/generator/ruby_templates.rb +50 -0
  28. data/lib/shift-lang/generator.rb +41 -0
  29. data/lib/shift-lang/parser/control_statement_parser.rb +17 -0
  30. data/lib/shift-lang/parser/db_query_parser.rb +20 -0
  31. data/lib/shift-lang/parser/keyword_parser.rb +52 -0
  32. data/lib/shift-lang/parser/operator_parser.rb +35 -0
  33. data/lib/shift-lang/parser/routing_expression_parser.rb +33 -0
  34. data/lib/shift-lang/parser/simple_expression_parser.rb +87 -0
  35. data/lib/shift-lang/parser/token_parser.rb +69 -0
  36. data/lib/shift-lang/parser/value_returning_expression_parser.rb +18 -0
  37. data/lib/shift-lang/parser/void_statement_parser.rb +12 -0
  38. data/lib/shift-lang/parser.rb +120 -0
  39. data/lib/shift-lang/version.rb +3 -0
  40. data/lib/shift-lang.rb +224 -0
  41. data/shift-lang.gemspec +19 -0
  42. metadata +106 -0
data/lib/shift-lang.rb ADDED
@@ -0,0 +1,224 @@
1
+ require 'erb'
2
+ require 'fileutils'
3
+
4
+ require_relative 'shift-lang/generator'
5
+ require_relative 'shift-lang/version'
6
+
7
+ module Shift
8
+ class CLI
9
+ def initialize(args)
10
+ if(!args[0])
11
+ puts "Enter the project name : "
12
+ project_name = gets.chomp
13
+
14
+ if(!File.exists?(project_name))
15
+ Dir.mkdir(project_name)
16
+ Dir.chdir(project_name)
17
+
18
+ puts "Creating " + project_name + ".shift"
19
+ puts "Creating views directory"
20
+ Dir.mkdir("views")
21
+ file = File.new(project_name + ".shift", "w")
22
+ file.puts ""
23
+ file.close
24
+ else
25
+ puts "A file already exists with the same name"
26
+ end
27
+ else
28
+ case args[0]
29
+ when "generate"
30
+ case args[1]
31
+ when "python"
32
+ generate_python
33
+ when "ruby"
34
+ generate_ruby
35
+ when "javascript"
36
+ generate_javascript
37
+ else
38
+ puts "Unknown target platform. Options are ruby, python and javascript"
39
+ end
40
+ else
41
+ puts "Unknown option"
42
+ end
43
+ end
44
+ end
45
+
46
+ def get_files_from_directory(directory, extension = ".shift", log = true)
47
+ files = []
48
+ Dir.foreach(directory) do | file |
49
+ if(File.directory?(file) == false)
50
+ file = File.join(directory, file)
51
+ if(File.extname(file) == extension)
52
+ if log
53
+ puts "Found file : " + File.absolute_path(file)
54
+ end
55
+ files.push File.absolute_path(file)
56
+ end
57
+ else
58
+ if ((file.to_s != '.') && (file.to_s != '..'))
59
+ file = File.join(directory, file)
60
+ files.concat get_files_from_directory(file)
61
+ end
62
+ end
63
+ end
64
+
65
+ files
66
+ end
67
+
68
+ def get_files()
69
+ get_files_from_directory Dir.pwd
70
+ end
71
+
72
+ def get_project_name()
73
+ project_name = Dir.pwd.split("/")
74
+ project_name[project_name.length - 1]
75
+ end
76
+
77
+ def generate_python()
78
+ files = get_files
79
+
80
+ generated_code = Shift::Generator::generatePython(files)
81
+
82
+ if generated_code == ""
83
+ return
84
+ end
85
+
86
+ project_name = get_project_name
87
+
88
+ view_sources = File.absolute_path(File.join(Dir.pwd, "views"))
89
+
90
+ gae_sources = File.absolute_path(File.join(File.dirname(__FILE__), "app_engine_templates"))
91
+ pystache = File.join(gae_sources, "pystache")
92
+ config = File.join(gae_sources, "app.yaml")
93
+
94
+ config_contents = File.open(config, "r") { |io| io.read }
95
+
96
+ config_template = ERB.new(config_contents)
97
+
98
+ if(!File.exists?("release"))
99
+ Dir.mkdir("release")
100
+ end
101
+ Dir.chdir("release")
102
+
103
+ if(File.exists?("python"))
104
+ FileUtils.remove_dir("python", true)
105
+ end
106
+
107
+ Dir.mkdir("python")
108
+ Dir.chdir("python")
109
+
110
+ puts "Creating target folder 'release/" + project_name + "'"
111
+ Dir.mkdir(project_name)
112
+ Dir.chdir(project_name)
113
+
114
+ puts "Writing application file"
115
+ File.open(project_name + ".py", "w") do |file|
116
+ file.puts generated_code
117
+ end
118
+
119
+ puts "Copying templates"
120
+ FileUtils.cp_r(pystache, Dir.pwd)
121
+ FileUtils.cp_r(view_sources, Dir.pwd)
122
+
123
+ template_files = get_files_from_directory(File.join(Dir.pwd, "views"), ".html", false)
124
+ template_files.each do | template_file |
125
+ text = File.read(template_file)
126
+ File.open(template_file, "w") { | file | file.puts text.gsub("{{id}}", "{{#key}}{{id}}{{/key}}") }
127
+ end
128
+
129
+ puts "Writing Google App Engine configuration file"
130
+ File.open("app.yaml", "w") do |file|
131
+ file.puts config_template.result(binding)
132
+ end
133
+
134
+ puts "Done."
135
+ end
136
+
137
+ def generate_ruby()
138
+ files = get_files
139
+
140
+ generated_code = Shift::Generator::generateRuby(files)
141
+
142
+ if generated_code == ""
143
+ return
144
+ end
145
+
146
+ project_name = get_project_name
147
+
148
+ view_sources = File.absolute_path(File.join(Dir.pwd, "views"))
149
+ template_sources = File.absolute_path(File.join(File.dirname(__FILE__), "heroku_templates"))
150
+ gemfile = File.join(template_sources, "Gemfile")
151
+ procfile = File.join(template_sources, "Procfile")
152
+
153
+ if(!File.exists?("release"))
154
+ Dir.mkdir("release")
155
+ end
156
+ Dir.chdir("release")
157
+
158
+ if(File.exists?("ruby"))
159
+ FileUtils.remove_dir("ruby", true)
160
+ end
161
+
162
+ Dir.mkdir("ruby")
163
+ Dir.chdir("ruby")
164
+
165
+ puts "Creating target folder 'release/" + project_name + "'"
166
+ Dir.mkdir(project_name)
167
+ Dir.chdir(project_name)
168
+
169
+ puts "Writing application file"
170
+ File.open("app.rb", "w") do |file|
171
+ file.puts generated_code
172
+ end
173
+
174
+ puts "Copying templates"
175
+ FileUtils.cp_r(view_sources, Dir.pwd)
176
+
177
+ puts "Generating Heroku configuration files"
178
+ FileUtils.cp(gemfile, Dir.pwd)
179
+ FileUtils.cp(procfile, Dir.pwd)
180
+
181
+ puts "Done."
182
+ end
183
+
184
+ def generate_javascript()
185
+ files = get_files
186
+
187
+ generated_code = Shift::Generator::generateJavaScript(files)
188
+
189
+ if generated_code == ""
190
+ return
191
+ end
192
+
193
+ project_name = get_project_name
194
+
195
+ view_sources = File.absolute_path(File.join(Dir.pwd, "views"))
196
+
197
+ if(!File.exists?("release"))
198
+ Dir.mkdir("release")
199
+ end
200
+ Dir.chdir("release")
201
+
202
+ if(File.exists?("javascript"))
203
+ FileUtils.remove_dir("javascript", true)
204
+ end
205
+
206
+ Dir.mkdir("javascript")
207
+ Dir.chdir("javascript")
208
+
209
+ puts "Creating target folder 'release/" + project_name + "'"
210
+ Dir.mkdir(project_name)
211
+ Dir.chdir(project_name)
212
+
213
+ puts "Writing application file"
214
+ File.open("app.js", "w") do |file|
215
+ file.puts generated_code
216
+ end
217
+
218
+ puts "Copying templates"
219
+ FileUtils.cp_r(view_sources, Dir.pwd)
220
+
221
+ puts "Done."
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/shift-lang/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Pradeek"]
6
+ gem.email = ["jpradeek@gmail.com"]
7
+ gem.description = %q{Shift is a Domain-Specific Language that can be used to quickly write server-side applications}
8
+ gem.summary = %q{Shift is a Domain-Specific Language that can be used to quickly write server-side applications}
9
+ gem.homepage = "https://rubygems.org/gems/shift-lang"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = ["sft", "shift"]
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "shift-lang"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Shift::VERSION
17
+
18
+ gem.add_dependency('parslet')
19
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shift-lang
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pradeek
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: parslet
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: Shift is a Domain-Specific Language that can be used to quickly write
31
+ server-side applications
32
+ email:
33
+ - jpradeek@gmail.com
34
+ executables:
35
+ - sft
36
+ - shift
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - .gitignore
41
+ - Gemfile
42
+ - LICENSE
43
+ - README.md
44
+ - Rakefile
45
+ - bin/sft
46
+ - bin/shift
47
+ - lib/app_engine_templates/app.yaml
48
+ - lib/app_engine_templates/pystache/__init__.py
49
+ - lib/app_engine_templates/pystache/__init__.pyc
50
+ - lib/app_engine_templates/pystache/loader.py
51
+ - lib/app_engine_templates/pystache/loader.pyc
52
+ - lib/app_engine_templates/pystache/template.py
53
+ - lib/app_engine_templates/pystache/template.pyc
54
+ - lib/app_engine_templates/pystache/view.py
55
+ - lib/app_engine_templates/pystache/view.pyc
56
+ - lib/heroku_templates/Gemfile
57
+ - lib/heroku_templates/Procfile
58
+ - lib/shift-lang.rb
59
+ - lib/shift-lang/builder.rb
60
+ - lib/shift-lang/builder/db_model.rb
61
+ - lib/shift-lang/builder/url_handler.rb
62
+ - lib/shift-lang/generator.rb
63
+ - lib/shift-lang/generator/javascript_generator.rb
64
+ - lib/shift-lang/generator/javascript_templates.rb
65
+ - lib/shift-lang/generator/python_generator.rb
66
+ - lib/shift-lang/generator/python_templates.rb
67
+ - lib/shift-lang/generator/ruby_generator.rb
68
+ - lib/shift-lang/generator/ruby_templates.rb
69
+ - lib/shift-lang/parser.rb
70
+ - lib/shift-lang/parser/control_statement_parser.rb
71
+ - lib/shift-lang/parser/db_query_parser.rb
72
+ - lib/shift-lang/parser/keyword_parser.rb
73
+ - lib/shift-lang/parser/operator_parser.rb
74
+ - lib/shift-lang/parser/routing_expression_parser.rb
75
+ - lib/shift-lang/parser/simple_expression_parser.rb
76
+ - lib/shift-lang/parser/token_parser.rb
77
+ - lib/shift-lang/parser/value_returning_expression_parser.rb
78
+ - lib/shift-lang/parser/void_statement_parser.rb
79
+ - lib/shift-lang/version.rb
80
+ - shift-lang.gemspec
81
+ homepage: https://rubygems.org/gems/shift-lang
82
+ licenses: []
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 1.8.21
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: Shift is a Domain-Specific Language that can be used to quickly write server-side
105
+ applications
106
+ test_files: []