tzispa 0.3.4 → 0.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 36b98fcccfc7db5bc2e1851dc330ef71f6d134d6
4
- data.tar.gz: 6adbc025f39c5e2a08e61c1490e8833c4a4eb401
3
+ metadata.gz: cd74c98b9c732e76ab7fa87e760664c4bb1770db
4
+ data.tar.gz: 0c805105cfede7ef61edced4d066e510db90000a
5
5
  SHA512:
6
- metadata.gz: 5ba7a3324decfa4aae956546fd1fdd9cd3b191439646ee482b95b9d43518626545cf5c8701f7a9af7a00bb35892ed4cf7aa2d12bf99cc528e6ee16969ea4c506
7
- data.tar.gz: 96bffe002e67063a618059da19267120db58adec7a72d3952432f579d034781d7d8e4b5db002e45fcc7f7d37410153a38cbdc6147714a5de5233f54b22d2dc14
6
+ metadata.gz: 36d1a0becbad7b32e90cce228d2ff4a6c291ba02cc3390af297ec98de4aeb8b75249836425b1a275eb1d9dfa6ae66dc6e8e028c0a73344b3f95a361dce4085d7
7
+ data.tar.gz: ffa0c807d47a7f36e038d4cc757e1c9f422c0f87a0833f00b454683f4af10d5daa770089e150e85258a3aab6e6a60366b9dd5a390b3b94cd79924d6c7f4851ba
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@ Tzispa
2
2
 
3
3
  General purpose web framework
4
4
 
5
+ ## v0.4.0
6
+ - Added basic cli command engine
7
+ - Added some documentation in README.md
8
+
5
9
  ## v0.3.3
6
10
  - Added internationalization support with i18n
7
11
  - Created new config folder in each domain to store all configurations
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Juan Antonio Piñero
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,3 +1,52 @@
1
- Tzispa
1
+ # Tzispa
2
2
 
3
3
  A sparkling web framework
4
+
5
+ ## Frameworks
6
+
7
+ Tzispa is composed by these frameworks:
8
+
9
+ * [**Tzispa::Rig**](https://github.com/japiber/tzispa_rig) - Template engine
10
+ * [**Tzispa::Utils**](https://github.com/japiber/tzispa_utils) - Ruby class utilities
11
+ * [**Tzispa::Helpers**](https://github.com/japiber/tzispa_helpers) - Helper modules
12
+ * [**Tzispa::Data**](https://github.com/japiber/tzispa_data) - Data access layer
13
+
14
+
15
+ ## Installation
16
+
17
+ ```shell
18
+ % gem install tzispa
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ ```shell
24
+ % tzispa generate project myproject
25
+ % cd myproject
26
+ % tzispa generate app mainapp --host=www.mynewsite.com
27
+ % puma start.ru
28
+ ```
29
+
30
+ ## Adding more apps
31
+
32
+ Tzispa support multi-app projects. Each app must have a unique mount path
33
+
34
+ ```shell
35
+ % tzispa generate app adminapp --host=www.mynewsite.com --mount=admin
36
+ ```
37
+
38
+ ## Adding templates
39
+
40
+ There are 3 template types: layout, static and block:
41
+
42
+ * layout: these are the skeleton entry points of the rig templates
43
+ * static: these are "light" templates that are a included without any processing as plain text
44
+ * block: the true core of the rig templates, each block template file has an associated ruby file with the template binder class
45
+
46
+ ```shell
47
+ % tzispa generate rig lister --type=layout --app=mainapp
48
+ % tzispa generate rig sitefoot --type=static --app=mainapp
49
+ % tzispa generate rig product_detail --type=block --app=mainapp
50
+ ```
51
+
52
+ Work in progress ...
data/bin/tzispa ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'tzispa/cli'
4
+ Tzispa::Cli.start
data/lib/tzispa/app.rb CHANGED
@@ -4,7 +4,7 @@ require 'forwardable'
4
4
  require 'logger'
5
5
  require 'i18n'
6
6
  require 'tzispa/domain'
7
- require 'tzispa/config/webconfig'
7
+ require 'tzispa/config/appconfig'
8
8
  require 'tzispa/config/routes'
9
9
  require 'tzispa/middleware'
10
10
  require 'tzispa_data'
@@ -46,10 +46,11 @@ module Tzispa
46
46
  end
47
47
 
48
48
  def mount(mount_point, builder)
49
- self.routes ||= Tzispa::Config::Routes.new(mount_point)
50
- app = self.new
51
- yield(routes)
52
- app.middleware.map mount_point, builder
49
+ self.new.tap { |app|
50
+ self.routes ||= Config::Routes.new(mount_point)
51
+ yield(routes)
52
+ app.middleware.map mount_point, builder
53
+ }
53
54
  end
54
55
 
55
56
  def router
@@ -59,9 +60,10 @@ module Tzispa
59
60
  end
60
61
 
61
62
  def initialize(domain_name)
62
- @domain = Domain.new(name: domain_name)
63
- @middleware = Tzispa::Middleware.new self
63
+ @domain = Domain.new(domain_name)
64
+ @middleware = Middleware.new self
64
65
  I18n.load_path = Dir["config/locales/*.yml"]
66
+ @config = Config::AppConfig.new(@domain).load!
65
67
  end
66
68
 
67
69
  def call(env)
@@ -72,10 +74,9 @@ module Tzispa
72
74
  def load!
73
75
  unless @loaded
74
76
  Mutex.new.synchronize {
75
- @config = Tzispa::Config::WebConfig.new(@domain).load!
76
77
  @middleware.load!
77
- @repository = Tzispa::Data::Repository.new(@config.repository.to_h).load! if @config.respond_to? :repository
78
- @engine = Tzispa::Rig::Engine.new self
78
+ @repository = Data::Repository.new(@config.repository.to_h).load! if @config.respond_to? :repository
79
+ @engine = Rig::Engine.new self
79
80
  @logger = Logger.new("logs/#{@domain.name}.log", 'weekly')
80
81
  @logger.level = @config.respond_to?(:developing) && @config.developing ? Logger::DEBUG : Logger::INFO
81
82
  I18n.load_path += Dir["#{@domain.path}/config/locales/*.yml"] if @config.respond_to?(:locales) && @config.locales.preload
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'tzispa/cli'
4
+ Tzispa::Cli.start
data/lib/tzispa/cli.rb ADDED
@@ -0,0 +1,19 @@
1
+ require 'thor'
2
+
3
+ module Tzispa
4
+
5
+ class Cli < Thor
6
+
7
+ desc 'version', 'Prints Tzispa version'
8
+ def version
9
+ require 'tzispa/version'
10
+ puts "v#{VERSION}"
11
+ end
12
+
13
+ require 'tzispa/command/cli/generate'
14
+ register Tzispa::Command::Cli::Generate, 'generate', 'generate [SUBCOMMAND]', 'Generate Tzispa components'
15
+
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,86 @@
1
+ require 'json'
2
+ require 'tzispa/domain'
3
+ require 'tzispa/utils/string'
4
+ require 'tzispa/config/appconfig'
5
+ require_relative 'project'
6
+
7
+ module Tzispa
8
+ module Command
9
+
10
+ class App
11
+
12
+ APP_STRUCTURE = [
13
+ 'api',
14
+ 'config',
15
+ 'config/locales',
16
+ 'error',
17
+ 'rig',
18
+ 'rig/block',
19
+ 'rig/layout',
20
+ 'rig/static'
21
+ ]
22
+
23
+ attr_reader :domain, :config
24
+
25
+ def initialize(name)
26
+ @domain = Tzispa::Domain.new(name)
27
+ end
28
+
29
+ def generate(host, mount_path=nil)
30
+ update_project
31
+ create_structure
32
+ create_class mount_path
33
+ create_appconfig(host)
34
+ create_home_layout
35
+ end
36
+
37
+ private
38
+
39
+ def update_project
40
+ prj = Project.open
41
+ raise "Application '#{domain.name}' already exist in this project" if prj.apps.include?(domain.name)
42
+ prj.apps << domain.name
43
+ prj.close
44
+ end
45
+
46
+ def create_class(mount_path=nil)
47
+ appclass = "#{TzString.camelize domain.name}App"
48
+ mount_path ||= DEFAULT_MOUNT_PATH
49
+ class_code = TzString.new
50
+ File.open("#{Project::START_FILE}","a") do |f|
51
+ f.puts class_code.indenter("\nclass #{appclass} < Tzispa::Application\n\n")
52
+ f.puts class_code.indenter("def initialize", 2)
53
+ f.puts class_code.indenter("super(:#{domain.name})", 2)
54
+ f.puts class_code.unindenter("end\n\n", 2)
55
+ f.puts class_code.unindenter("end\n\n", 2)
56
+ f.puts class_code.indenter("#{appclass}.mount '/#{mount_path}', self do |route|")
57
+ f.puts class_code.indenter("route.index '/', [:get, :head]", 2)
58
+ f.puts class_code.indenter("route.api '/__api_:sign/:handler/:verb(~:predicate)(/:sufix)', [:get, :head, :post]")
59
+ f.puts class_code.indenter("route.site '/:title(/@:id0)(@:id1)(@~:id2)(@@:id3)(@@~:id4)(@@@:id5)/:layout.:format', [:get, :head]")
60
+ f.puts class_code.unindenter("end\n\n", 2)
61
+ end
62
+ end
63
+
64
+ def create_structure
65
+ unless File.exist? domain.path
66
+ Dir.mkdir "#{domain.path}"
67
+ APP_STRUCTURE.each { |appdir|
68
+ Dir.mkdir "#{domain.path}/#{appdir}"
69
+ }
70
+ end
71
+ end
72
+
73
+ def create_appconfig(host)
74
+ appconfig = Tzispa::Config::AppConfig.new(domain)
75
+ @config = appconfig.create_default host: host
76
+ end
77
+
78
+ def create_home_layout
79
+ tpl = Tzispa::Rig::Template.new(name: config&.default_layout || 'index', type: :layout, domain: domain, format: :htm)
80
+ tpl.create("<html><body><h1>Welcome: Tzispa #{domain.name} application is working!</h1></body></html>")
81
+ end
82
+
83
+ end
84
+
85
+ end
86
+ end
@@ -0,0 +1,41 @@
1
+ require 'thor'
2
+ require 'tzispa/command/project'
3
+ require 'tzispa/command/app'
4
+ require 'tzispa/command/rig'
5
+
6
+ module Tzispa
7
+ module Command
8
+ module Cli
9
+
10
+ class Generate < Thor
11
+
12
+ desc 'project', 'Generate Tzispa project components'
13
+ def project(name)
14
+ Tzispa::Command::Project.new(name).generate
15
+ puts "Project '#{name}' has been created"
16
+ end
17
+
18
+ desc 'app', 'Generate new application into a project'
19
+ method_option :mount, :aliases => "-m", :desc => "The mount point for this app", :default => ""
20
+ method_option :host, :aliases => "-h", :desc => "The hostname used for this app ", :required => true
21
+ def app(name)
22
+ tzapp = Tzispa::Command::App.new(name)
23
+ tzapp.generate(options[:host], options[:mount])
24
+ puts "App '#{name}' has been created"
25
+ end
26
+
27
+
28
+ desc 'rig', 'Generate new rig template'
29
+ method_option :app, :aliases => "-a", :desc => "The app where the new template will be created", :required => true
30
+ method_option :type, :aliases => "-t", :desc => "The template type: block, static or layout ", :required => true
31
+ def rig(name)
32
+ tpl = Tzispa::Command::Rig.new(name, options[:app], options[:type])
33
+ tpl.generate
34
+ puts "Rig #{options[:type]} template '#{name}' has been created in #{options[:app]}"
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,257 @@
1
+ require 'json'
2
+ require "base64"
3
+
4
+ module Tzispa
5
+ module Command
6
+
7
+ class Project
8
+
9
+ PROJECT_STRUCTURE = [
10
+ 'apps',
11
+ 'config',
12
+ 'config/locales',
13
+ 'data',
14
+ 'data/session',
15
+ 'logs',
16
+ 'public',
17
+ 'public/css',
18
+ 'public/css/fonts',
19
+ 'public/css/less',
20
+ 'public/img',
21
+ 'public/js',
22
+ 'repository'
23
+ ]
24
+
25
+ PROJECT_FILE = '.tzispaprj'
26
+ START_FILE = 'start.ru'
27
+ PUMA_CONFIG_FILE = 'puma.rb'
28
+
29
+ DEFAULT_MOUNT_PATH = '/'
30
+
31
+ attr_accessor :name, :apps, :created
32
+
33
+ def initialize(name)
34
+ @name = name
35
+ @apps = Array.new
36
+ end
37
+
38
+
39
+ def generate
40
+ if create_structure
41
+ create_project
42
+ create_start
43
+ create_pumaconfig
44
+ create_i18n 'en'
45
+ end
46
+ end
47
+
48
+ def self.check?
49
+ File.exist? "#{PROJECT_FILE}"
50
+ end
51
+
52
+ def self.open
53
+ raise "This command must be runned in a Tzispa project base dir" unless self.check?
54
+ hpj = JSON.parse String.new.tap { |ptxt|
55
+ File.open("#{PROJECT_FILE}","r") do |f|
56
+ while line = f.gets
57
+ ptxt << line
58
+ end
59
+ end
60
+ }
61
+ self.new(hpj['name']).tap { |project|
62
+ project.apps = hpj['apps']
63
+ project.created = hpj['created']
64
+ }
65
+ end
66
+
67
+ def close
68
+ save to_h
69
+ end
70
+
71
+ def to_h
72
+ Hash.new.tap { |h|
73
+ h['name'] = name
74
+ h['apps'] = apps
75
+ h['created'] = created
76
+ }
77
+ end
78
+
79
+ private
80
+
81
+ def save(prj, base_dir=nil)
82
+ base_dir = "#{base_dir}/" if base_dir
83
+ File.open("#{base_dir}#{PROJECT_FILE}","w") do |f|
84
+ f.write prj.to_json
85
+ end
86
+ end
87
+
88
+ def create_structure
89
+ unless File.exist? name
90
+ Dir.mkdir "#{name}"
91
+ PROJECT_STRUCTURE.each { |psdir|
92
+ Dir.mkdir "#{name}/#{psdir}"
93
+ }
94
+ end
95
+ end
96
+
97
+ def create_project
98
+ save({
99
+ name: name,
100
+ created: Time.new,
101
+ apps: []
102
+ }, name)
103
+ end
104
+
105
+ def create_start
106
+ File.open("#{name}/#{START_FILE}","w") do |f|
107
+ f.puts "require 'rack'\nrequire 'tzispa'"
108
+ end
109
+ end
110
+
111
+ def create_pumaconfig
112
+ File.open("#{name}/config/#{PUMA_CONFIG_FILE}", "w") do |f|
113
+ f.puts PUMA_CONFIG
114
+ end
115
+ end
116
+
117
+ def create_i18n(lang)
118
+ File.open("#{name}/config/locales/#{lang}.yml", "w") do |f|
119
+ f.puts Base64.decode64(I18N_DEFAULTS)
120
+ end
121
+ end
122
+
123
+ PUMA_CONFIG = <<-PUMACONFIG
124
+ #!/usr/bin/env puma
125
+
126
+ #daemonize true
127
+ pidfile 'puma.pid'
128
+ state_path 'puma.state'
129
+
130
+ # stdout_redirect 'logs/puma.stdout', 'logs/puma.stderr'
131
+ # stdout_redirect '/u/apps/lolcat/log/stdout', '/u/apps/lolcat/log/stderr', true
132
+
133
+ # Disable request logging.
134
+ # quiet
135
+
136
+ # threads 0, 16
137
+
138
+
139
+ bind 'tcp://0.0.0.0:9292'
140
+ workers 0
141
+
142
+ on_restart do
143
+ require 'fileutils'
144
+ FileUtils.rm_rf(Dir.glob('./data/session/*'))
145
+ end
146
+
147
+ # on_worker_boot do
148
+ # puts 'On worker boot...'
149
+ # end
150
+
151
+ # after_worker_boot do
152
+ # puts 'On worker boot...'
153
+ # end
154
+
155
+ # on_worker_shutdown do
156
+ # puts 'On worker boot...'
157
+ # end
158
+
159
+
160
+ tag 'your_app_tag'
161
+ worker_timeout 90
162
+ PUMACONFIG
163
+
164
+ I18N_DEFAULTS = <<-I18NDEFAULTSBASE64
165
+ LS0tDQplbjoNCiAgZGF0ZToNCiAgICBhYmJyX2RheV9uYW1lczoNCiAgICAtIFN1bg0KICAgIC0g
166
+ TW9uDQogICAgLSBUdWUNCiAgICAtIFdlZA0KICAgIC0gVGh1DQogICAgLSBGcmkNCiAgICAtIFNh
167
+ dA0KICAgIGFiYnJfbW9udGhfbmFtZXM6DQogICAgLQ0KICAgIC0gSmFuDQogICAgLSBGZWINCiAg
168
+ ICAtIE1hcg0KICAgIC0gQXByDQogICAgLSBNYXkNCiAgICAtIEp1bg0KICAgIC0gSnVsDQogICAg
169
+ LSBBdWcNCiAgICAtIFNlcA0KICAgIC0gT2N0DQogICAgLSBOb3YNCiAgICAtIERlYw0KICAgIGRh
170
+ eV9uYW1lczoNCiAgICAtIFN1bmRheQ0KICAgIC0gTW9uZGF5DQogICAgLSBUdWVzZGF5DQogICAg
171
+ LSBXZWRuZXNkYXkNCiAgICAtIFRodXJzZGF5DQogICAgLSBGcmlkYXkNCiAgICAtIFNhdHVyZGF5
172
+ DQogICAgZm9ybWF0czoNCiAgICAgIGRlZmF1bHQ6ICIlWS0lbS0lZCINCiAgICAgIGxvbmc6ICIl
173
+ QiAlZCwgJVkiDQogICAgICBzaG9ydDogIiViICVkIg0KICAgIG1vbnRoX25hbWVzOg0KICAgIC0N
174
+ CiAgICAtIEphbnVhcnkNCiAgICAtIEZlYnJ1YXJ5DQogICAgLSBNYXJjaA0KICAgIC0gQXByaWwN
175
+ CiAgICAtIE1heQ0KICAgIC0gSnVuZQ0KICAgIC0gSnVseQ0KICAgIC0gQXVndXN0DQogICAgLSBT
176
+ ZXB0ZW1iZXINCiAgICAtIE9jdG9iZXINCiAgICAtIE5vdmVtYmVyDQogICAgLSBEZWNlbWJlcg0K
177
+ ICAgIG9yZGVyOg0KICAgIC0gOnllYXINCiAgICAtIDptb250aA0KICAgIC0gOmRheQ0KICBkYXRl
178
+ dGltZToNCiAgICBkaXN0YW5jZV9pbl93b3JkczoNCiAgICAgIGFib3V0X3hfaG91cnM6DQogICAg
179
+ ICAgIG9uZTogYWJvdXQgMSBob3VyDQogICAgICAgIG90aGVyOiBhYm91dCAle2NvdW50fSBob3Vy
180
+ cw0KICAgICAgYWJvdXRfeF9tb250aHM6DQogICAgICAgIG9uZTogYWJvdXQgMSBtb250aA0KICAg
181
+ ICAgICBvdGhlcjogYWJvdXQgJXtjb3VudH0gbW9udGhzDQogICAgICBhYm91dF94X3llYXJzOg0K
182
+ ICAgICAgICBvbmU6IGFib3V0IDEgeWVhcg0KICAgICAgICBvdGhlcjogYWJvdXQgJXtjb3VudH0g
183
+ eWVhcnMNCiAgICAgIGFsbW9zdF94X3llYXJzOg0KICAgICAgICBvbmU6IGFsbW9zdCAxIHllYXIN
184
+ CiAgICAgICAgb3RoZXI6IGFsbW9zdCAle2NvdW50fSB5ZWFycw0KICAgICAgaGFsZl9hX21pbnV0
185
+ ZTogaGFsZiBhIG1pbnV0ZQ0KICAgICAgbGVzc190aGFuX3hfbWludXRlczoNCiAgICAgICAgb25l
186
+ OiBsZXNzIHRoYW4gYSBtaW51dGUNCiAgICAgICAgb3RoZXI6IGxlc3MgdGhhbiAle2NvdW50fSBt
187
+ aW51dGVzDQogICAgICBsZXNzX3RoYW5feF9zZWNvbmRzOg0KICAgICAgICBvbmU6IGxlc3MgdGhh
188
+ biAxIHNlY29uZA0KICAgICAgICBvdGhlcjogbGVzcyB0aGFuICV7Y291bnR9IHNlY29uZHMNCiAg
189
+ ICAgIG92ZXJfeF95ZWFyczoNCiAgICAgICAgb25lOiBvdmVyIDEgeWVhcg0KICAgICAgICBvdGhl
190
+ cjogb3ZlciAle2NvdW50fSB5ZWFycw0KICAgICAgeF9kYXlzOg0KICAgICAgICBvbmU6IDEgZGF5
191
+ DQogICAgICAgIG90aGVyOiAiJXtjb3VudH0gZGF5cyINCiAgICAgIHhfbWludXRlczoNCiAgICAg
192
+ ICAgb25lOiAxIG1pbnV0ZQ0KICAgICAgICBvdGhlcjogIiV7Y291bnR9IG1pbnV0ZXMiDQogICAg
193
+ ICB4X21vbnRoczoNCiAgICAgICAgb25lOiAxIG1vbnRoDQogICAgICAgIG90aGVyOiAiJXtjb3Vu
194
+ dH0gbW9udGhzIg0KICAgICAgeF9zZWNvbmRzOg0KICAgICAgICBvbmU6IDEgc2Vjb25kDQogICAg
195
+ ICAgIG90aGVyOiAiJXtjb3VudH0gc2Vjb25kcyINCiAgICBwcm9tcHRzOg0KICAgICAgZGF5OiBE
196
+ YXkNCiAgICAgIGhvdXI6IEhvdXINCiAgICAgIG1pbnV0ZTogTWludXRlDQogICAgICBtb250aDog
197
+ TW9udGgNCiAgICAgIHNlY29uZDogU2Vjb25kcw0KICAgICAgeWVhcjogWWVhcg0KICBlcnJvcnM6
198
+ DQogICAgZm9ybWF0OiAiJXthdHRyaWJ1dGV9ICV7bWVzc2FnZX0iDQogICAgbWVzc2FnZXM6DQog
199
+ ICAgICBhY2NlcHRlZDogbXVzdCBiZSBhY2NlcHRlZA0KICAgICAgYmxhbms6IGNhbid0IGJlIGJs
200
+ YW5rDQogICAgICBwcmVzZW50OiBtdXN0IGJlIGJsYW5rDQogICAgICBjb25maXJtYXRpb246IGRv
201
+ ZXNuJ3QgbWF0Y2ggJXthdHRyaWJ1dGV9DQogICAgICBlbXB0eTogY2FuJ3QgYmUgZW1wdHkNCiAg
202
+ ICAgIGVxdWFsX3RvOiBtdXN0IGJlIGVxdWFsIHRvICV7Y291bnR9DQogICAgICBldmVuOiBtdXN0
203
+ IGJlIGV2ZW4NCiAgICAgIGV4Y2x1c2lvbjogaXMgcmVzZXJ2ZWQNCiAgICAgIGdyZWF0ZXJfdGhh
204
+ bjogbXVzdCBiZSBncmVhdGVyIHRoYW4gJXtjb3VudH0NCiAgICAgIGdyZWF0ZXJfdGhhbl9vcl9l
205
+ cXVhbF90bzogbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXtjb3VudH0NCiAgICAg
206
+ IGluY2x1c2lvbjogaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0DQogICAgICBpbnZhbGlkOiBp
207
+ cyBpbnZhbGlkDQogICAgICBsZXNzX3RoYW46IG11c3QgYmUgbGVzcyB0aGFuICV7Y291bnR9DQog
208
+ ICAgICBsZXNzX3RoYW5fb3JfZXF1YWxfdG86IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRv
209
+ ICV7Y291bnR9DQogICAgICBtb2RlbF9pbnZhbGlkOiAiVmFsaWRhdGlvbiBmYWlsZWQ6ICV7ZXJy
210
+ b3JzfSINCiAgICAgIG5vdF9hX251bWJlcjogaXMgbm90IGEgbnVtYmVyDQogICAgICBub3RfYW5f
211
+ aW50ZWdlcjogbXVzdCBiZSBhbiBpbnRlZ2VyDQogICAgICBvZGQ6IG11c3QgYmUgb2RkDQogICAg
212
+ ICByZXF1aXJlZDogbXVzdCBleGlzdA0KICAgICAgdGFrZW46IGhhcyBhbHJlYWR5IGJlZW4gdGFr
213
+ ZW4NCiAgICAgIHRvb19sb25nOg0KICAgICAgICBvbmU6IGlzIHRvbyBsb25nIChtYXhpbXVtIGlz
214
+ IDEgY2hhcmFjdGVyKQ0KICAgICAgICBvdGhlcjogaXMgdG9vIGxvbmcgKG1heGltdW0gaXMgJXtj
215
+ b3VudH0gY2hhcmFjdGVycykNCiAgICAgIHRvb19zaG9ydDoNCiAgICAgICAgb25lOiBpcyB0b28g
216
+ c2hvcnQgKG1pbmltdW0gaXMgMSBjaGFyYWN0ZXIpDQogICAgICAgIG90aGVyOiBpcyB0b28gc2hv
217
+ cnQgKG1pbmltdW0gaXMgJXtjb3VudH0gY2hhcmFjdGVycykNCiAgICAgIHdyb25nX2xlbmd0aDoN
218
+ CiAgICAgICAgb25lOiBpcyB0aGUgd3JvbmcgbGVuZ3RoIChzaG91bGQgYmUgMSBjaGFyYWN0ZXIp
219
+ DQogICAgICAgIG90aGVyOiBpcyB0aGUgd3JvbmcgbGVuZ3RoIChzaG91bGQgYmUgJXtjb3VudH0g
220
+ Y2hhcmFjdGVycykNCiAgICAgIG90aGVyX3RoYW46IG11c3QgYmUgb3RoZXIgdGhhbiAle2NvdW50
221
+ fQ0KICAgIHRlbXBsYXRlOg0KICAgICAgYm9keTogJ1RoZXJlIHdlcmUgcHJvYmxlbXMgd2l0aCB0
222
+ aGUgZm9sbG93aW5nIGZpZWxkczonDQogICAgICBoZWFkZXI6DQogICAgICAgIG9uZTogMSBlcnJv
223
+ ciBwcm9oaWJpdGVkIHRoaXMgJXttb2RlbH0gZnJvbSBiZWluZyBzYXZlZA0KICAgICAgICBvdGhl
224
+ cjogIiV7Y291bnR9IGVycm9ycyBwcm9oaWJpdGVkIHRoaXMgJXttb2RlbH0gZnJvbSBiZWluZyBz
225
+ YXZlZCINCiAgaGVscGVyczoNCiAgICBzZWxlY3Q6DQogICAgICBwcm9tcHQ6IFBsZWFzZSBzZWxl
226
+ Y3QNCiAgICBzdWJtaXQ6DQogICAgICBjcmVhdGU6IENyZWF0ZSAle21vZGVsfQ0KICAgICAgc3Vi
227
+ bWl0OiBTYXZlICV7bW9kZWx9DQogICAgICB1cGRhdGU6IFVwZGF0ZSAle21vZGVsfQ0KICBudW1i
228
+ ZXI6DQogICAgY3VycmVuY3k6DQogICAgICBmb3JtYXQ6DQogICAgICAgIGRlbGltaXRlcjogIiwi
229
+ DQogICAgICAgIGZvcm1hdDogIiV1JW4iDQogICAgICAgIHByZWNpc2lvbjogMg0KICAgICAgICBz
230
+ ZXBhcmF0b3I6ICIuIg0KICAgICAgICBzaWduaWZpY2FudDogZmFsc2UNCiAgICAgICAgc3RyaXBf
231
+ aW5zaWduaWZpY2FudF96ZXJvczogZmFsc2UNCiAgICAgICAgdW5pdDogIiQiDQogICAgZm9ybWF0
232
+ Og0KICAgICAgZGVsaW1pdGVyOiAiLCINCiAgICAgIHByZWNpc2lvbjogMw0KICAgICAgc2VwYXJh
233
+ dG9yOiAiLiINCiAgICAgIHNpZ25pZmljYW50OiBmYWxzZQ0KICAgICAgc3RyaXBfaW5zaWduaWZp
234
+ Y2FudF96ZXJvczogZmFsc2UNCiAgICBodW1hbjoNCiAgICAgIGRlY2ltYWxfdW5pdHM6DQogICAg
235
+ ICAgIGZvcm1hdDogIiVuICV1Ig0KICAgICAgICB1bml0czoNCiAgICAgICAgICBiaWxsaW9uOiBC
236
+ aWxsaW9uDQogICAgICAgICAgbWlsbGlvbjogTWlsbGlvbg0KICAgICAgICAgIHF1YWRyaWxsaW9u
237
+ OiBRdWFkcmlsbGlvbg0KICAgICAgICAgIHRob3VzYW5kOiBUaG91c2FuZA0KICAgICAgICAgIHRy
238
+ aWxsaW9uOiBUcmlsbGlvbg0KICAgICAgICAgIHVuaXQ6ICcnDQogICAgICBmb3JtYXQ6DQogICAg
239
+ ICAgIGRlbGltaXRlcjogJycNCiAgICAgICAgcHJlY2lzaW9uOiAzDQogICAgICAgIHNpZ25pZmlj
240
+ YW50OiB0cnVlDQogICAgICAgIHN0cmlwX2luc2lnbmlmaWNhbnRfemVyb3M6IHRydWUNCiAgICAg
241
+ IHN0b3JhZ2VfdW5pdHM6DQogICAgICAgIGZvcm1hdDogIiVuICV1Ig0KICAgICAgICB1bml0czoN
242
+ CiAgICAgICAgICBieXRlOg0KICAgICAgICAgICAgb25lOiBCeXRlDQogICAgICAgICAgICBvdGhl
243
+ cjogQnl0ZXMNCiAgICAgICAgICBnYjogR0INCiAgICAgICAgICBrYjogS0INCiAgICAgICAgICBt
244
+ YjogTUINCiAgICAgICAgICB0YjogVEINCiAgICBwZXJjZW50YWdlOg0KICAgICAgZm9ybWF0Og0K
245
+ ICAgICAgICBkZWxpbWl0ZXI6ICcnDQogICAgICAgIGZvcm1hdDogIiVuJSINCiAgICBwcmVjaXNp
246
+ b246DQogICAgICBmb3JtYXQ6DQogICAgICAgIGRlbGltaXRlcjogJycNCiAgdGltZToNCiAgICBh
247
+ bTogYW0NCiAgICBmb3JtYXRzOg0KICAgICAgZGVmYXVsdDogIiVhLCAlZCAlYiAlWSAlSDolTTol
248
+ UyAleiINCiAgICAgIGxvbmc6ICIlQiAlZCwgJVkgJUg6JU0iDQogICAgICBzaG9ydDogIiVkICVi
249
+ ICVIOiVNIg0KICAgIHBtOiBwbQ0K
250
+ I18NDEFAULTSBASE64
251
+
252
+
253
+ end
254
+
255
+
256
+ end
257
+ end
@@ -0,0 +1,26 @@
1
+ require 'tzispa/rig/template'
2
+
3
+ module Tzispa
4
+ module Command
5
+
6
+ class Rig
7
+
8
+ attr_reader :name, :domain, :type, :mime_format
9
+
10
+ def initialize(name, app, type, mime_format = nil)
11
+ @prj = Project.open
12
+ raise "Application '#{app}' does not exists in project file" unless @prj.apps.include?(app)
13
+ @domain = Tzispa::Domain.new app
14
+ @type = type.to_sym
15
+ @name = name
16
+ @mime_format = mime_format
17
+ end
18
+
19
+ def generate
20
+ Tzispa::Rig::Template.new(name: name, type: type, domain: domain, format: mime_format).create
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tzispa/config/yaml'
4
+ require 'tzispa/helpers/security'
5
+
6
+ module Tzispa
7
+ module Config
8
+ class AppConfig
9
+
10
+ include Tzispa::Helpers::Security
11
+
12
+ CONFIG_FILENAME = :appconfig
13
+
14
+ attr_reader :domain, :cfname
15
+
16
+ def initialize(domain, configname=nil)
17
+ @domain = domain
18
+ @cfname = configname || CONFIG_FILENAME
19
+ @cftime = nil
20
+ end
21
+
22
+ def filename
23
+ @filename ||= "#{domain.path}/config/#{cfname}.yml".freeze
24
+ end
25
+
26
+ def load!
27
+ if @cftime.nil?
28
+ @cftime = File.ctime(filename)
29
+ else
30
+ if @cftime != File.ctime(filename)
31
+ @config = nil
32
+ @cftime = File.ctime(filename)
33
+ end
34
+ end
35
+ @config ||= Tzispa::Config::Yaml.load(filename)
36
+ end
37
+
38
+ def create_default(host:, layout: 'index', dev_mode: true, locale: 'en')
39
+ hcfg = Hash.new.tap { |cfg|
40
+ cfg['id'] = domain.name
41
+ cfg['default_layout'] = layout
42
+ cfg['default_format'] = 'htm'
43
+ cfg['host_name'] = host
44
+ cfg['dev_mode'] = dev_mode
45
+ cfg['default_encoding'] = 'utf-8'
46
+ cfg['auth_required'] = false
47
+ cfg['salt'] = secret(24)
48
+ cfg['locales'] = Hash.new.tap { |loc|
49
+ loc['preload'] = true
50
+ loc['default'] = locale
51
+ }
52
+ cfg['sessions'] = Hash.new.tap { |ses|
53
+ ses['enabled'] = true
54
+ ses['timeout'] = 3600
55
+ ses['secret'] = secret(32)
56
+ }
57
+ }
58
+ Tzispa::Config::Yaml.save(hcfg, filename)
59
+ load!
60
+ end
61
+
62
+
63
+ end
64
+ end
65
+ end
@@ -21,7 +21,7 @@ module Tzispa
21
21
  "#{@map_path}#{@router.path path_id, params}"
22
22
  end
23
23
 
24
- def add(route_id, path, controller)
24
+ def add(route_id, path, controller, methods)
25
25
  spec_control, callmethod = controller.to_s.split(':')
26
26
  mpath = spec_control.split('#')
27
27
  controller = TzString.camelize(mpath.pop).to_s
@@ -32,22 +32,22 @@ module Tzispa
32
32
  controller_module = CONTROLLERS_BASE
33
33
  require "tzispa/controller/#{controller.downcase}"
34
34
  end
35
- @router.add(path).tap { |rule|
35
+ @router.add(path, {request_method: methods}).tap { |rule|
36
36
  rule.to TzString.constantize("#{controller_module}::#{controller}").new(callmethod)
37
37
  rule.name = route_id
38
38
  }
39
39
  end
40
40
 
41
- def index(path, controller=nil)
42
- add :index, path, controller || 'layout:render!'
41
+ def index(path, methods, controller=nil)
42
+ add :index, path, controller || 'layout:render!', methods
43
43
  end
44
44
 
45
- def api(path, controller=nil)
46
- add :api, path, controller || 'api:dispatch!'
45
+ def api(path, methods, controller=nil)
46
+ add :api, path, controller || 'api:dispatch!', methods
47
47
  end
48
48
 
49
- def site(path, controller=nil)
50
- add :site, path, controller || 'layout:render!'
49
+ def site(path, methods, controller=nil)
50
+ add :site, path, controller || 'layout:render!', methods
51
51
  end
52
52
 
53
53
  end
@@ -11,6 +11,12 @@ module Tzispa
11
11
  self.parametrize params
12
12
  end
13
13
 
14
+ def self.save(cfg, filename)
15
+ File.open(filename, 'w') { |f|
16
+ f.write cfg.to_yaml
17
+ }
18
+ end
19
+
14
20
 
15
21
 
16
22
  end
@@ -2,7 +2,7 @@ require 'forwardable'
2
2
 
3
3
  module Tzispa
4
4
 
5
- # Thie class defines a environment to hold application state in runtime
5
+ # This class defines a environment to hold application state in runtime
6
6
  class Context
7
7
  extend Forwardable
8
8
 
@@ -18,6 +18,7 @@ module Tzispa
18
18
  context.router_params[:layout] || context.config.default_layout
19
19
  end
20
20
  layout_format = context.router_params[:format] || context.config.default_format
21
+ context.layout = layout
21
22
  rig = context.app.engine.layout(name: layout, format: layout_format.to_sym)
22
23
  response.body << rig.render(context)
23
24
  content_type layout_format
data/lib/tzispa/domain.rb CHANGED
@@ -6,12 +6,12 @@ module Tzispa
6
6
  attr_reader :name, :root
7
7
 
8
8
  DEFAULT_DOMAIN_NAME = :default
9
- DEFAULT_DOMAINS_ROOT = :domains
9
+ DEFAULT_DOMAINS_ROOT = :apps
10
10
 
11
11
 
12
- def initialize(name: DEFAULT_DOMAIN_NAME, root: DEFAULT_DOMAINS_ROOT)
13
- @name = name || DEFAULT_DOMAIN_NAME
14
- @root = root || DEFAULT_DOMAINS_ROOT
12
+ def initialize(name=DEFAULT_DOMAIN_NAME, root=DEFAULT_DOMAINS_ROOT)
13
+ @name = name
14
+ @root = root
15
15
  end
16
16
 
17
17
  def path
@@ -16,6 +16,7 @@ module Tzispa
16
16
  include Tzispa::Helpers::Security
17
17
 
18
18
  attr_reader :request, :response
19
+ attr_accessor :layout
19
20
  def_delegators :@request, :session
20
21
 
21
22
  SESSION_LAST_ACCESS = :__last_access
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tzispa
4
- VERSION = '0.3.4'
4
+ VERSION = '0.4.0'
5
5
  FRAMEWORK_NAME = 'Tzispa'
6
6
  GEM_NAME = 'tzispa'
7
7
  end
data/tzispa.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/tzispa/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = Tzispa::FRAMEWORK_NAME.downcase
6
+ s.version = Tzispa::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.bindir = 'bin'
9
+ s.authors = ['Juan Antonio Piñero']
10
+ s.email = ['japinero@area-integral.com']
11
+ s.homepage = 'https://github.com/japiber/tzispa'
12
+ s.summary = 'A sparkling web framework'
13
+ s.description = 'A sparkling web framework based on Rack and inspired by Sinatra and Lotus'
14
+ s.licenses = ['MIT']
15
+
16
+ s.required_ruby_version = '~> 2.3'
17
+
18
+ s.add_dependency 'rack', '~> 1.5'
19
+ s.add_dependency 'puma', '~> 3.1'
20
+ s.add_dependency 'i18n', '~> 0.7'
21
+ s.add_dependency 'http_router', '~> 0.11'
22
+ s.add_dependency 'moneta', '~> 0.8'
23
+ s.add_dependency 'tzispa_helpers', '~> 0.1.0'
24
+ s.add_dependency 'tzispa_utils', '~> 0.2.1'
25
+ s.add_dependency 'tzispa_rig', '~> 0.2.0'
26
+ s.add_dependency 'tzispa_data', '~> 0.1'
27
+
28
+ s.files = Dir.glob("{lib,bin}/**/*") + %w(README.md CHANGELOG.md LICENSE tzispa.gemspec)
29
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
30
+ s.require_paths = ['lib']
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tzispa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Antonio Piñero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-29 00:00:00.000000000 Z
11
+ date: 2016-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: puma
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: i18n
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.7'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: http_router
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +100,14 @@ dependencies:
72
100
  requirements:
73
101
  - - "~>"
74
102
  - !ruby/object:Gem::Version
75
- version: 0.1.2
103
+ version: 0.2.1
76
104
  type: :runtime
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
- version: 0.1.2
110
+ version: 0.2.1
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: tzispa_rig
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -111,18 +139,27 @@ dependencies:
111
139
  description: A sparkling web framework based on Rack and inspired by Sinatra and Lotus
112
140
  email:
113
141
  - japinero@area-integral.com
114
- executables: []
142
+ executables:
143
+ - tzispa
115
144
  extensions: []
116
145
  extra_rdoc_files: []
117
146
  files:
118
147
  - CHANGELOG.md
148
+ - LICENSE
119
149
  - README.md
150
+ - bin/tzispa
120
151
  - lib/tzispa.rb
121
152
  - lib/tzispa/api/handler.rb
122
153
  - lib/tzispa/app.rb
154
+ - lib/tzispa/bin/tzispa
155
+ - lib/tzispa/cli.rb
156
+ - lib/tzispa/command/app.rb
157
+ - lib/tzispa/command/cli/generate.rb
158
+ - lib/tzispa/command/project.rb
159
+ - lib/tzispa/command/rig.rb
160
+ - lib/tzispa/config/appconfig.rb
123
161
  - lib/tzispa/config/base.rb
124
162
  - lib/tzispa/config/routes.rb
125
- - lib/tzispa/config/webconfig.rb
126
163
  - lib/tzispa/config/yaml.rb
127
164
  - lib/tzispa/context.rb
128
165
  - lib/tzispa/controller/api.rb
@@ -137,6 +174,7 @@ files:
137
174
  - lib/tzispa/http/session_flash_bag.rb
138
175
  - lib/tzispa/middleware.rb
139
176
  - lib/tzispa/version.rb
177
+ - tzispa.gemspec
140
178
  homepage: https://github.com/japiber/tzispa
141
179
  licenses:
142
180
  - MIT
@@ -157,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
195
  version: '0'
158
196
  requirements: []
159
197
  rubyforge_project:
160
- rubygems_version: 2.5.1
198
+ rubygems_version: 2.4.8
161
199
  signing_key:
162
200
  specification_version: 4
163
201
  summary: A sparkling web framework
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'tzispa/config/yaml'
4
-
5
- module Tzispa
6
- module Config
7
- class WebConfig
8
-
9
- RPG_WEBCONFIG_FILENAME = :webconfig
10
-
11
-
12
- def initialize(domain,configname=nil)
13
- @domain = domain
14
- @cfname = configname || RPG_WEBCONFIG_FILENAME
15
- @cftime = nil
16
- end
17
-
18
- def filename
19
- @filename ||= "#{@domain.path}/config/#{@cfname}.yml".freeze
20
- end
21
-
22
- def load!
23
- if @cftime.nil?
24
- @cftime = File.ctime(filename)
25
- else
26
- if @cftime != File.ctime(filename)
27
- @config = nil
28
- @cftime = File.ctime(filename)
29
- end
30
- end
31
- @config ||= Tzispa::Config::Yaml.load(filename)
32
- end
33
-
34
-
35
- end
36
- end
37
- end