pakyow-core 0.8.0 → 0.9.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: a272d5c2f6d429275df4e3eac0561c8df6c285e3
4
- data.tar.gz: 8b21f4193337cd9c7298ccbe0e004bd9c814beb0
3
+ metadata.gz: 8c95a638e0b963832783f28d930b2d3643d22d9a
4
+ data.tar.gz: 13933ac6f3e609509cbdd2114820a9dfbd9daf23
5
5
  SHA512:
6
- metadata.gz: dbb4242d0cbbb4dcce94608b6773026e68c4168c450dd4e7587def70a3db921d5e6d53a7b9cd45b3f718451ec70c8b7cf7878ea998eacf95aed655dc084cea56
7
- data.tar.gz: b965ed0dd836899da344beb011cd777eb09080fa3013c381d7a4e1194108147f90c58f9be3dfcb0dedce8d6c06519a66d78ea85188a10c992280cb1506173f07
6
+ metadata.gz: e9de80789a1192803b8643ed2a66523d675a4bd5482f0baca76b4680334f322b7ee612752809383f272a325c6aba9dc378d410ea3ba836c71dfd5f64bcfe4b45
7
+ data.tar.gz: 9399398fa726206307b9de398575289d7c1e470ef21cbd6b05c30cdc714a70e67372158ce5ded1f32ca6ddf3bcb84b65631b501fc118aa9094980fd1775bbdd5
data/pakyow-core/CHANGES CHANGED
@@ -1,3 +1,11 @@
1
+ = 0.9.0
2
+
3
+ * Renames restful "remove" action to "delete"
4
+ * Improves app generator bundle install by showing progress
5
+ * Complete refactor of config handling with a shiny DSL
6
+ * Includes pakyow-rake as a dependency, and updates the generated Rakefile
7
+ * Removes support for Ruby versions < 2.0.0
8
+
1
9
  = 0.8.0 / 2014-03-02
2
10
 
3
11
  * Major rewrite, including changes to app definition and routing
@@ -48,4 +56,4 @@
48
56
 
49
57
  = 0.6.0 / 2011-08-20
50
58
 
51
- * Initial gem release of 0.6.0 codebase
59
+ * Initial gem release of 0.6.0 codebase
@@ -1,30 +1,61 @@
1
1
  module Pakyow
2
2
  class App
3
3
  class << self
4
- def reset
5
- @@routes = {}
6
- @@config = {}
7
- @@middleware = []
4
+ attr_reader :path
8
5
 
9
- @@stacks = {:before => {}, :after => {}}
10
- %w(init load process route match error).each {|name|
11
- @@stacks[:before][name.to_sym] = []
12
- @@stacks[:after][name.to_sym] = []
13
- }
6
+ # Prepares the app for being staged in one or more environments by
7
+ # loading config(s), middleware, and setting the load path.
8
+ #
9
+ def prepare(*env_or_envs)
10
+ return if prepared?
11
+
12
+ # load config for one or more environments
13
+ load_config(*env_or_envs)
14
+
15
+ # load each block from middleware stack
16
+ load_middleware
17
+
18
+ # include pwd in load path
19
+ $:.unshift(Dir.pwd) unless $:.include? Dir.pwd
20
+
21
+ @prepared = true
22
+ end
23
+
24
+ # Stages the app by preparing and returning an instance. This is
25
+ # essentially everything short of running it.
26
+ #
27
+ def stage(*env_or_envs)
28
+ unless staged?
29
+ prepare(*env_or_envs)
30
+ @staged = true
31
+ end
32
+
33
+ self.new
34
+ end
35
+
36
+ # Runs the staged app.
37
+ #
38
+ def run(*env_or_envs)
39
+ return if running?
40
+
41
+ @running = true
42
+ builder.run(stage(*env_or_envs))
43
+ detect_handler.run(builder, Host: config.server.host, Port: config.server.port) do |server|
44
+ trap(:INT) { stop(server) }
45
+ trap(:TERM) { stop(server) }
46
+ end
14
47
  end
15
48
 
16
49
  # Defines an app
17
50
  #
18
51
  def define(&block)
19
52
  # sets the path to the app file so it can be reloaded later
20
- config.app.path = Utils::String.parse_path_from_caller(caller[0])
21
-
53
+ @path = String.parse_path_from_caller(caller[0])
22
54
  self.instance_eval(&block)
23
55
  end
24
56
 
25
57
  # Defines a route set.
26
58
  #
27
- #TODO default route set should be config option (also for bindings)
28
59
  def routes(set_name = :main, &block)
29
60
  if set_name && block
30
61
  @@routes[set_name] = block
@@ -63,30 +94,6 @@ module Pakyow
63
94
  @@stacks[:after][stack_name.to_sym] << block
64
95
  end
65
96
 
66
- # Runs the application. Accepts the environment(s) to run, for example:
67
- # run(:development)
68
- # run([:development, :staging])
69
- #
70
- def run(*args)
71
- return if running?
72
-
73
- @running = true
74
- builder.run(prepare(args))
75
- detect_handler.run(builder, :Host => config.server.host, :Port => config.server.port) do |server|
76
- trap(:INT) { stop(server) }
77
- trap(:TERM) { stop(server) }
78
- end
79
- end
80
-
81
- # Stages the application. Everything is loaded but the application is
82
- # not started. Accepts the same arguments as #run.
83
- #
84
- def stage(*args)
85
- return if staged?
86
- @staged = true
87
- prepare(args)
88
- end
89
-
90
97
  def builder
91
98
  @builder ||= Rack::Builder.new
92
99
  end
@@ -110,51 +117,55 @@ module Pakyow
110
117
  # Convenience method for base configuration class.
111
118
  #
112
119
  def config
113
- Pakyow::Config::Base
120
+ Pakyow::Config
121
+ end
122
+
123
+ def reset
124
+ @prepared = false
125
+ @staged = false
126
+ @running = false
127
+
128
+ @@routes = {}
129
+ @@config = {}
130
+ @@middleware = []
131
+
132
+ @@stacks = {:before => {}, :after => {}}
133
+ %w(init load process route match error).each {|name|
134
+ @@stacks[:before][name.to_sym] = []
135
+ @@stacks[:after][name.to_sym] = []
136
+ }
114
137
  end
115
138
 
116
- def load_config(envs)
139
+ def load_config(*env_or_envs)
140
+ envs = Array.ensure(env_or_envs)
141
+ envs = envs.empty? || envs.first.nil? ? [config.app.default_environment] : envs
142
+
143
+ config.app.loaded_envs = envs
144
+ config.env = envs.first.to_sym
145
+
117
146
  # run global config first
118
147
  if global_proc = @@config[:global]
119
- config.instance_eval(&global_proc)
148
+ config.app_config(&global_proc)
120
149
  end
121
150
 
122
151
  # then run other envs
123
-
124
152
  envs.each do |env|
125
153
  next unless config_proc = @@config[env.to_sym]
126
- config.instance_eval(&config_proc)
154
+ config.app_config(&config_proc)
127
155
  end
128
-
129
- config.app.loaded_envs = envs
130
156
  end
131
157
 
132
158
  protected
133
159
 
134
- # Prepares the application for running or staging and returns an instance
135
- # of the application.
136
- def prepare(envs)
137
- return if prepared?
138
-
139
- # configure
140
- envs = envs.empty? || envs.first.nil? ? [config.app.default_environment] : envs
141
- load_config(envs)
142
-
143
- # load each block from middleware stack
144
- @@middleware.each {|mw|
160
+ def load_middleware
161
+ @@middleware.each do |mw|
145
162
  self.instance_exec(builder, &mw)
146
- }
163
+ end
147
164
 
148
165
  builder.use(Rack::MethodOverride)
149
166
  builder.use(Middleware::Static) if config.app.static
150
167
  builder.use(Middleware::Logger) if config.app.log
151
168
  builder.use(Middleware::Reloader) if config.app.auto_reload
152
-
153
- @prepared = true
154
-
155
- $:.unshift(Dir.pwd) unless $:.include? Dir.pwd
156
-
157
- return self.new
158
169
  end
159
170
 
160
171
  def detect_handler
@@ -201,7 +212,7 @@ module Pakyow
201
212
  # Returns the primary (first) loaded env.
202
213
  #
203
214
  def env
204
- config.app.loaded_envs[0]
215
+ config.env
205
216
  end
206
217
 
207
218
  def app
@@ -246,7 +257,7 @@ module Pakyow
246
257
  view_file = File.join(File.expand_path('../../', __FILE__), 'views', 'errors', '404.html')
247
258
  content = File.open(view_file).read
248
259
 
249
- path = Utils::String.normalize_path(request.path)
260
+ path = String.normalize_path(request.path)
250
261
  path = '/' if path.empty?
251
262
 
252
263
  content.gsub!('{view_path}', path == '/' ? 'index.html' : "#{path}.html")
@@ -276,12 +287,12 @@ module Pakyow
276
287
  view_file = File.join(File.expand_path('../../', __FILE__), 'views', 'errors', '500.html')
277
288
  content = File.open(view_file).read
278
289
 
279
- path = Utils::String.normalize_path(request.path)
290
+ path = String.normalize_path(request.path)
280
291
  path = '/' if path.empty?
281
292
 
282
293
  nice_source = error.backtrace[0].match(/^(.+?):(\d+)(|:in `(.+)')$/)
283
294
 
284
- content.gsub!('{file}', nice_source[1].gsub(File.expand_path(Config::App.root) + '/', ''))
295
+ content.gsub!('{file}', nice_source[1].gsub(File.expand_path(Config.app.root) + '/', ''))
285
296
  content.gsub!('{line}', nice_source[2])
286
297
 
287
298
  content.gsub!('{msg}', CGI.escapeHTML(error.to_s))
@@ -307,10 +318,10 @@ module Pakyow
307
318
 
308
319
  # reset config
309
320
  envs = config.app.loaded_envs
310
- config.reset!
321
+ config.reset
311
322
 
312
323
  # reload config
313
- self.class.load_config(envs)
324
+ self.class.load_config(*envs)
314
325
 
315
326
  load_app
316
327
  end
@@ -345,7 +356,7 @@ module Pakyow
345
356
  data = file_or_data.read
346
357
 
347
358
  # auto set type based on file type
348
- type = Rack::Mime.mime_type("." + Utils::String.split_at_last_dot(file_or_data.path)[1])
359
+ type = Rack::Mime.mime_type("." + String.split_at_last_dot(file_or_data.path)[1])
349
360
  else
350
361
  data = file_or_data
351
362
  end
@@ -1,8 +1,3 @@
1
- require 'core/config/base'
2
- require 'core/config/app'
3
- require 'core/config/server'
4
- require 'core/config/cookies'
5
- require 'core/config/logger'
6
1
  require 'core/helpers'
7
2
  require 'core/multilog'
8
3
  require 'core/app_context'
@@ -18,31 +13,29 @@ require 'core/route_template_defaults'
18
13
  require 'core/route_lookup'
19
14
  require 'core/app'
20
15
  require 'core/errors'
16
+ require 'core/config'
17
+ require 'core/config/app'
18
+ require 'core/config/server'
19
+ require 'core/config/cookies'
20
+ require 'core/config/logger'
21
21
 
22
22
  # middlewares
23
23
  require 'core/middleware/logger'
24
24
  require 'core/middleware/static'
25
25
  require 'core/middleware/reloader'
26
26
 
27
- # utils
28
- require 'utils/string'
29
- require 'utils/hash'
30
- require 'utils/dir'
31
-
32
27
  module Pakyow
33
28
  attr_accessor :app, :logger
34
29
 
35
30
  def configure_logger
36
- conf = Config::Base
37
-
38
31
  logs = []
39
32
 
40
- if File.directory?(conf.logger.path)
41
- log_path = File.join(conf.logger.path, conf.logger.name)
33
+ if File.directory?(Config.logger.path)
34
+ log_path = File.join(Config.logger.path, Config.logger.filename)
42
35
 
43
36
  begin
44
37
  log = File.open(log_path, 'a')
45
- log.sync if conf.logger.sync
38
+ log.sync if Config.logger.sync
46
39
 
47
40
  logs << log
48
41
  rescue StandardError => e
@@ -50,10 +43,10 @@ module Pakyow
50
43
  end
51
44
  end
52
45
 
53
- logs << $stdout if conf.app.log_output
46
+ logs << $stdout if Config.app.log_output
54
47
 
55
48
  io = logs.count > 1 ? MultiLog.new(*logs) : logs[0]
56
49
 
57
- Pakyow.logger = Logger.new(io, conf.logger.level, conf.logger.colorize, conf.logger.auto_flush)
50
+ Pakyow.logger = Logger.new(io, Config.logger.level, Config.logger.colorize, Config.logger.auto_flush)
58
51
  end
59
52
  end
@@ -1,89 +1,65 @@
1
- module Pakyow
2
- module Config
3
- class App
4
- Config::Base.register_config(:app, self)
5
-
6
- class << self
7
- attr_accessor :log, :resources, :root, :default_action, :ignore_routes,
8
- :default_environment, :path, :src_dir, :auto_reload, :errors_in_browser,
9
- :static, :all_views_visible, :loaded_envs, :log_output
10
-
11
- def method_missing(name, *args)
12
- if name[-1,1] == '='
13
- name = name[0..-2]
14
- instance_variable_set("@#{name}", *args)
15
- else
16
- instance_variable_get("@#{name}")
17
- end
18
- end
19
-
20
- def auto_reload
21
- @auto_reload.nil? ? true : @auto_reload
22
- end
23
-
24
- def errors_in_browser
25
- @errors_in_browser.nil? ? true : @errors_in_browser
26
- end
27
-
28
- # Log requests?
29
- def log
30
- @log.nil? ? true : @log
31
- end
32
-
33
- def log_output
34
- @log_output || true
35
- end
36
-
37
- # Root directory
38
- def root
39
- @root || File.dirname('')
40
- end
41
-
42
- # Resources directory
43
- def resources
44
- @resources ||= { :default => "#{root}/public" }
45
- end
46
-
47
- def src_dir
48
- @src_dir || "#{root}/app/lib"
49
- end
50
-
51
- # Default action
52
- def default_action
53
- @default_action || :index
54
- end
55
-
56
- # Mockup mode
57
- def ignore_routes
58
- @ignore_routes.nil? ? false : @ignore_routes
59
- end
60
-
61
- def all_views_visible
62
- @all_views_visible.nil? ? true : @all_views_visible
63
- end
64
-
65
- def default_environment
66
- @default_environment || :development
67
- end
68
-
69
- # The path to the application class
70
- def path
71
- @path
72
- end
73
-
74
- # Handle static files?
75
- #
76
- # For best performance, should be set to false if static files are
77
- # handled by a web server (e.g. Nginx)
78
- #
79
- def static
80
- @static || true
81
- end
82
-
83
- def loaded_envs
84
- @loaded_envs
85
- end
86
- end
87
- end
88
- end
89
- end
1
+ Pakyow::Config.register(:app) { |config|
2
+
3
+ # if true, the app will be reloaded on every request
4
+ config.opt :auto_reload
5
+
6
+ # if true, errors are displayed in the browser
7
+ config.opt :errors_in_browser
8
+
9
+ # the location of the app's root directory
10
+ config.opt :root, File.dirname('')
11
+
12
+ # the location of the app's resources
13
+ config.opt :resources, lambda { { default: File.join(root, 'public') } }
14
+
15
+ # the location of the app's source code
16
+ config.opt :src_dir, lambda { File.join(root, 'app', 'lib') }
17
+
18
+ # the environment to run in, if one isn't provided
19
+ config.opt :default_environment, :development
20
+
21
+ # the default action to use for routing
22
+ config.opt :default_action, :index
23
+
24
+ # if true, all routes are ignored
25
+ config.opt :ignore_routes, false
26
+
27
+ # if true, views are visible without a route defined
28
+ config.opt :all_views_visible, true
29
+
30
+ # whether or not pakyow should log to stdout
31
+ config.opt :log_output, true
32
+
33
+ # whether or not pakyow should write to a log
34
+ config.opt :log, true
35
+
36
+ # whether or not pakyow should serve static files
37
+ config.opt :static
38
+
39
+ # stores the path to the app definition
40
+ config.opt :path, lambda { Pakyow::App.path }
41
+
42
+ # stores the envs an app is run in
43
+ config.opt :loaded_envs
44
+
45
+ }.env(:development) { |opts|
46
+
47
+ opts.auto_reload = true
48
+ opts.errors_in_browser = true
49
+ opts.static = true
50
+
51
+ }.env(:staging) { |opts|
52
+
53
+ opts.auto_reload = false
54
+ opts.errors_in_browser = true
55
+ opts.log_output = false
56
+ opts.static = false
57
+
58
+ }.env(:production) { |opts|
59
+
60
+ opts.auto_reload = false
61
+ opts.errors_in_browser = false
62
+ opts.log_output = false
63
+ opts.static = false
64
+
65
+ }
@@ -1,21 +1,4 @@
1
- module Pakyow
2
- module Config
3
- class Cookies
4
- Config::Base.register_config(:cookies, self)
5
-
6
- class << self
7
- attr_accessor :path, :expiration
8
-
9
- # What path should the cookie be created for?
10
- def path
11
- @path || '/'
12
- end
13
-
14
- # When does the cookie expire?
15
- def expiration
16
- @expiration || Time.now + 60 * 60 * 24 * 7 # one week
17
- end
18
- end
19
- end
20
- end
21
- end
1
+ Pakyow::Config.register(:cookies) { |config|
2
+ config.opt :path, '/'
3
+ config.opt :expiration, lambda { Time.now + 60 * 60 * 24 * 7 }
4
+ }
@@ -1,37 +1,39 @@
1
- module Pakyow
2
- module Config
3
- class Logger
4
- Config::Base.register_config(:logger, self)
5
-
6
- class << self
7
- attr_accessor :path, :name, :sync, :colorize, :auto_flush, :level
8
-
9
- # Path to logs
10
- def path
11
- @path || "#{Config::Base.app.root}/logs"
12
- end
13
-
14
- def name
15
- @name || "requests.log"
16
- end
17
-
18
- def sync
19
- instance_variable_defined?(:@sync) ? @sync : true
20
- end
21
-
22
- def auto_flush
23
- instance_variable_defined?(:@auto_flush) ? @auto_flush : true
24
- end
25
-
26
- def colorize
27
- instance_variable_defined?(:@colorize) ? @colorize : true
28
- end
29
-
30
- def level
31
- @level || Pakyow::Logger::LEVELS[:debug]
32
- end
33
-
34
- end
35
- end
36
- end
37
- end
1
+ Pakyow::Config.register(:logger) { |config|
2
+
3
+ # the default level to log at
4
+ config.opt :level, :debug
5
+
6
+ # where the log file should be placed
7
+ config.opt :path, lambda { File.join(Pakyow::Config.app.root, 'log') }
8
+
9
+ # the name of the log file
10
+ config.opt :filename, 'pakyow.log'
11
+
12
+ # whether or not the log file should be synced
13
+ config.opt :sync
14
+
15
+ # whether or not the log file should be flushed automatically
16
+ config.opt :auto_flush
17
+
18
+ # whether or not the log file should be colorized
19
+ config.opt :colorize
20
+
21
+ }.env(:development) { |opts|
22
+
23
+ opts.sync = true
24
+ opts.auto_flush = true
25
+ opts.colorize = true
26
+
27
+ }.env(:staging) { |opts|
28
+
29
+ opts.sync = false
30
+ opts.auto_flush = false
31
+ opts.colorize = false
32
+
33
+ }.env(:production) { |opts|
34
+
35
+ opts.sync = false
36
+ opts.auto_flush = false
37
+ opts.colorize = false
38
+
39
+ }
@@ -1,26 +1,12 @@
1
- module Pakyow
2
- module Config
3
- class Server
4
- Config::Base.register_config(:server, self)
1
+ Pakyow::Config.register(:server) { |config|
5
2
 
6
- class << self
7
- attr_accessor :port, :host, :handler
8
-
9
- # On what port does the application run?
10
- def port
11
- @port || 3000
12
- end
13
-
14
- # On what host does the application run?
15
- def host
16
- @host || '0.0.0.0'
17
- end
18
-
19
- # If set, adds a handler to try (e.g. puma)
20
- def handler
21
- @handler || nil
22
- end
23
- end
24
- end
25
- end
26
- end
3
+ # the port to start `pakyow server`
4
+ config.opt :port, 3000
5
+
6
+ # the host to start `pakyow server`
7
+ config.opt :host, '0.0.0.0'
8
+
9
+ # explicitly set a handler to try (e.g. puma)
10
+ config.opt :handler
11
+
12
+ }
@@ -0,0 +1,90 @@
1
+ module Pakyow
2
+ class Config
3
+ class << self
4
+ attr_accessor :env
5
+ end
6
+
7
+ def self.register(name)
8
+ config = Pakyow::Config.new(name)
9
+ yield(config.defaults)
10
+
11
+ @config ||= {}
12
+ @config[name] = config
13
+
14
+ self.class.instance_eval do
15
+ define_method(name) { @config[name] }
16
+ end
17
+
18
+ config
19
+ end
20
+
21
+ def self.deregister(name)
22
+ @config.delete(name)
23
+ end
24
+
25
+ def self.reset
26
+ @config.values.each(&:reset)
27
+ end
28
+
29
+ def self.app_config(&block)
30
+ instance_eval(&block)
31
+ end
32
+
33
+ attr_reader :config_name
34
+
35
+ def initialize(name)
36
+ @config_name = name
37
+ @opts = {}
38
+ @envs = {}
39
+ end
40
+
41
+ def defaults
42
+ @defaults ||= Pakyow::Config.new("#{@config_name}.defaults")
43
+ end
44
+
45
+ def env(name)
46
+ config = Pakyow::Config.new("#{@config_name}.#{name}")
47
+ yield(config)
48
+
49
+ @envs[name] = config
50
+ self
51
+ end
52
+
53
+ def clear_env(name)
54
+ @envs.delete(name)
55
+ end
56
+
57
+ def value(name, *args)
58
+ value = @opts.fetch(name) { raise(ConfigError.new("No config option available for `#{@config_name}.#{name}`")) }
59
+ value = instance_exec(*args, &value) if value.is_a?(Proc)
60
+ value
61
+ end
62
+
63
+ def opt(name, default = nil)
64
+ @opts[name] = default
65
+ end
66
+
67
+ def reset
68
+ @opts = {}
69
+ end
70
+
71
+ def method_missing(method, *args)
72
+ if /^(\w+)=$/ =~ method
73
+ @opts[$1.to_sym] = args[0]
74
+ else
75
+ configs = [self]
76
+ configs << @envs[Config.env] if @envs.key?(Config.env)
77
+ configs << @defaults unless @defaults.nil?
78
+
79
+ configs.each do |config|
80
+ begin
81
+ return config.value(method, *args)
82
+ rescue ConfigError
83
+ end
84
+ end
85
+
86
+ raise(ConfigError.new("No config option available for `#{@config_name}.#{method}`"))
87
+ end
88
+ end
89
+ end
90
+ end
@@ -2,6 +2,9 @@ module Pakyow
2
2
  # Raised when no app context is available
3
3
  class NoContextError < StandardError; end
4
4
 
5
+ # Raised when no config object is available
6
+ class ConfigError < StandardError; end
7
+
5
8
  # Raised when route is looked up that doesn't exist
6
9
  class MissingRoute < StandardError; end
7
10
 
@@ -36,7 +36,7 @@ module Pakyow
36
36
  end
37
37
 
38
38
  def config
39
- Pakyow::Config::Base
39
+ Pakyow::Config
40
40
  end
41
41
  end
42
42
 
@@ -13,11 +13,11 @@ module Pakyow
13
13
  def require_recursively(dir)
14
14
  @times ||= {}
15
15
  if File.exists?(dir)
16
- Utils::Dir.walk_dir(dir) do |path|
16
+ Dir.walk(dir) do |path|
17
17
  next if FileTest.directory?(path)
18
18
  next if path.split('.')[-1] != 'rb'
19
19
 
20
- if Config::Base.app.auto_reload
20
+ if Config.app.auto_reload
21
21
  if !@times[path] || (@times[path] && File.mtime(path) - @times[path] > 0)
22
22
  load(path)
23
23
  @times[path] = File.mtime(path)
@@ -34,6 +34,7 @@ module Pakyow
34
34
  BOLD_SEQ = "\033[1m"
35
35
 
36
36
  def initialize(log = $stdout, level = 0, format = false, auto_flush = false)
37
+ level = LEVELS[level] if level.is_a?(Symbol)
37
38
  @log, @level, @format, @auto_flush = log, level, format, auto_flush
38
39
  @mutex = Mutex.new
39
40
  end
@@ -26,7 +26,7 @@ module Pakyow
26
26
  def is_static?(env)
27
27
  return false unless env['PATH_INFO'] =~ /\.(.*)$/
28
28
 
29
- Config::App.resources.each_pair do |name, path|
29
+ Config.app.resources.each_pair do |name, path|
30
30
  resource_path = File.join(path, env['PATH_INFO'])
31
31
  next unless File.exists?(resource_path)
32
32
  return true, resource_path
@@ -51,12 +51,12 @@ module Pakyow
51
51
  end
52
52
 
53
53
  def cookies
54
- @cookies ||= Utils::Hash.strhash(super)
54
+ @cookies ||= Hash.strhash(super)
55
55
  end
56
56
 
57
57
  # Returns indifferent params (see {HashUtils.strhash} for more info on indifferent hashes).
58
58
  def params
59
- @params ||= Utils::Hash.strhash(super)
59
+ @params ||= Hash.strhash(super)
60
60
  end
61
61
 
62
62
  # Returns array of url components.
@@ -97,14 +97,14 @@ module Pakyow
97
97
  protected
98
98
 
99
99
  def set_working_path_from_path(path, method)
100
- base_route, ignore_format = Utils::String.split_at_last_dot(path)
100
+ base_route, ignore_format = String.split_at_last_dot(path)
101
101
 
102
102
  self.path = base_route
103
103
  self.method = method || self.method
104
104
  end
105
105
 
106
106
  def set_request_format_from_path(path)
107
- path, format = Utils::String.split_at_last_dot(path)
107
+ path, format = String.split_at_last_dot(path)
108
108
  self.format = ((format && (format[format.length - 1, 1] == '/')) ? format[0, format.length - 1] : format)
109
109
  end
110
110
  end
@@ -73,7 +73,7 @@ module Pakyow
73
73
  # build the final list of fns
74
74
  fns = build_fns(fns, hooks)
75
75
 
76
- @handlers << [name, code, fns]
76
+ @handlers.unshift([name, code, fns])
77
77
  end
78
78
 
79
79
  def group(*args, &block)
@@ -108,7 +108,7 @@ module Pakyow
108
108
 
109
109
  evaluator = RouteExpansionEval.from_scope(self, path: File.join(descendent_path, path), group: g_name, hooks: hooks)
110
110
  evaluator.direct_path = path
111
- evaluator.template = template
111
+ evaluator.set_template(g_name, template)
112
112
  evaluator.eval(&block)
113
113
 
114
114
  merge(evaluator)
@@ -159,7 +159,7 @@ module Pakyow
159
159
  else
160
160
  # prepend scope path if we're in a scope
161
161
  path = File.join(@path, path)
162
- path = Utils::String.normalize_path(path)
162
+ path = String.normalize_path(path)
163
163
 
164
164
  # get regex and vars for path
165
165
  regex, vars = build_route_matcher(path)
@@ -316,7 +316,8 @@ module Pakyow
316
316
  super
317
317
  end
318
318
 
319
- def template=(template)
319
+ def set_template(expansion_name, template)
320
+ @expansion_name = expansion_name
320
321
  @template_block = template[1]
321
322
 
322
323
  @hooks = merge_hooks(@hooks, template[0])
@@ -343,7 +344,7 @@ module Pakyow
343
344
  group = @template_eval.group_named(name)
344
345
 
345
346
  hooks = merge_hooks(hooks, group[0])
346
- group(name, hooks, &block)
347
+ group(@expansion_name, hooks, &block)
347
348
  end
348
349
 
349
350
  def action_namespace(*args, &block)
@@ -351,7 +352,7 @@ module Pakyow
351
352
  namespace = @template_eval.namespace_named(name)
352
353
 
353
354
  hooks = merge_hooks(hooks, namespace[1])
354
- namespace(name, namespace[0], hooks, &block)
355
+ namespace(@expansion_name, namespace[0], hooks, &block)
355
356
  end
356
357
 
357
358
  def method_missing(method, *args, &block)
@@ -1,6 +1,6 @@
1
1
  module Pakyow
2
2
  module RouteMerger
3
- private
3
+ private
4
4
 
5
5
  def merge(route_eval)
6
6
  merge_fns(route_eval.fns)
@@ -28,7 +28,7 @@ module Pakyow
28
28
 
29
29
  def merge_lookup(lookup)
30
30
  @lookup[:routes].merge!(lookup[:routes])
31
- @lookup[:grouped].merge!(lookup[:grouped])
31
+ @lookup[:grouped].deep_merge!(lookup[:grouped])
32
32
  end
33
33
 
34
34
  def merge_templates(templates)
@@ -22,7 +22,7 @@ module Pakyow
22
22
  # [regex, vars, name, fns, path]
23
23
  #
24
24
  def match(path, method)
25
- path = Utils::String.normalize_path(path)
25
+ path = String.normalize_path(path)
26
26
 
27
27
  # want the request to still knows it's a head, but match as get
28
28
  method = method.to_sym
@@ -22,7 +22,7 @@ module Pakyow
22
22
  get :edit, "/#{resource_id}/edit"
23
23
  patch :update, "/#{resource_id}"
24
24
  put :replace, "/#{resource_id}"
25
- delete :delete, "/#{resource_id}"
25
+ delete :remove, "/#{resource_id}"
26
26
 
27
27
  group :collection
28
28
  namespace :member, resource_id
@@ -88,7 +88,7 @@ module Pakyow
88
88
  else
89
89
  app.instance_exec(&fn)
90
90
  end
91
-
91
+
92
92
  break
93
93
  end
94
94
  }
@@ -106,7 +106,7 @@ module Pakyow
106
106
  # returns the list of route functions for that route.
107
107
  #
108
108
  def match(request)
109
- path = Utils::String.normalize_path(request.path)
109
+ path = String.normalize_path(request.path)
110
110
  method = request.method
111
111
 
112
112
  match, data = nil
@@ -121,7 +121,7 @@ module Pakyow
121
121
 
122
122
  # handle route params
123
123
  #TODO where to do this?
124
- request.params.merge!(Utils::Hash.strhash(self.data_from_path(path, data, match[1])))
124
+ request.params.merge!(Hash.strhash(self.data_from_path(path, data, match[1])))
125
125
 
126
126
  #TODO where to do this?
127
127
  request.route_path = match[4]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pakyow-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Powell
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-04 00:00:00.000000000 Z
12
+ date: 2014-11-09 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: pakyow-support
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '='
19
+ - !ruby/object:Gem::Version
20
+ version: 0.9.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '='
26
+ - !ruby/object:Gem::Version
27
+ version: 0.9.0
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: rack
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +53,7 @@ dependencies:
39
53
  - - "~>"
40
54
  - !ruby/object:Gem::Version
41
55
  version: '5.0'
42
- description: Core functionality for Pakyow applications, including routing and middleware.
56
+ description: Core functionality for Pakyow apps, including routing and middleware.
43
57
  email: bryan@metabahn.com
44
58
  executables: []
45
59
  extensions: []
@@ -51,8 +65,8 @@ files:
51
65
  - pakyow-core/lib/core/app.rb
52
66
  - pakyow-core/lib/core/app_context.rb
53
67
  - pakyow-core/lib/core/base.rb
68
+ - pakyow-core/lib/core/config.rb
54
69
  - pakyow-core/lib/core/config/app.rb
55
- - pakyow-core/lib/core/config/base.rb
56
70
  - pakyow-core/lib/core/config/cookies.rb
57
71
  - pakyow-core/lib/core/config/logger.rb
58
72
  - pakyow-core/lib/core/config/server.rb
@@ -73,9 +87,6 @@ files:
73
87
  - pakyow-core/lib/core/route_template_defaults.rb
74
88
  - pakyow-core/lib/core/router.rb
75
89
  - pakyow-core/lib/pakyow-core.rb
76
- - pakyow-core/lib/utils/dir.rb
77
- - pakyow-core/lib/utils/hash.rb
78
- - pakyow-core/lib/utils/string.rb
79
90
  - pakyow-core/lib/views/errors/404.html
80
91
  - pakyow-core/lib/views/errors/500.html
81
92
  homepage: http://pakyow.com
@@ -90,7 +101,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
101
  requirements:
91
102
  - - ">="
92
103
  - !ruby/object:Gem::Version
93
- version: 1.9.3
104
+ version: 2.0.0
94
105
  required_rubygems_version: !ruby/object:Gem::Requirement
95
106
  requirements:
96
107
  - - ">="
@@ -98,8 +109,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
109
  version: '0'
99
110
  requirements: []
100
111
  rubyforge_project: pakyow-core
101
- rubygems_version: 2.2.0
112
+ rubygems_version: 2.2.2
102
113
  signing_key:
103
114
  specification_version: 4
104
- summary: Core functionality for Pakyow applications.
115
+ summary: Core functionality for Pakyow apps.
105
116
  test_files: []
117
+ has_rdoc:
@@ -1,30 +0,0 @@
1
- module Pakyow
2
- module Config
3
- class Base
4
- @@configs = {}
5
- def self.register_config(name, klass)
6
- @@configs[name] = klass
7
-
8
- define_singleton_method name do
9
- @@configs[name]
10
- end
11
- end
12
-
13
- # Resets all config
14
- def self.reset!
15
- @@configs.keys.each do |type|
16
- klass = self.send(type.to_sym)
17
- klass.instance_variables.each do |var|
18
- # Assumes path shouldn't be reset, since it's only set
19
- # once when Pakyow::Application is inherited.
20
- next if var.to_sym == :'@path'
21
- begin
22
- klass.send("#{var.to_s.gsub('@', '')}=", nil)
23
- rescue
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,40 +0,0 @@
1
- module Pakyow
2
- module Utils
3
-
4
- # Utility methods for directories and files.
5
- class Dir
6
-
7
- # visit dir, then all files in dir, then walk_dir each directory in dir
8
- def self.walk_dir(dir, &block)
9
- yield dir
10
- all = ::Dir.entries(dir)
11
- partition = all.partition{|e| File.file?("#{dir}/#{e}")}
12
- files = partition[0]
13
- dirs = partition[1]
14
- files.each{|f| yield "#{dir}/#{f}" unless f.start_with?(".")}
15
- dirs.each{|d| walk_dir("#{dir}/#{d}", &block) unless d.start_with?(".")}
16
- end
17
-
18
- def self.print_dir(dir)
19
- puts "/#{dir}"
20
- Utils::Dir.walk_dir(dir) {|full_path|
21
- path = full_path.gsub(Regexp.new("#{dir}\/?"), '')
22
- next if path.empty?
23
-
24
- prefix = "|"
25
- path.scan(/\//).size.times do
26
- prefix += " |"
27
- end
28
-
29
- path.gsub!(/^.*\//, '')
30
- puts "#{prefix}-- #{path}"
31
- }
32
- end
33
-
34
- def self.dir_within_dir?(dir1, dir2)
35
- (dir1.split('/') - dir2.split('/')).empty?
36
- end
37
- end
38
-
39
- end
40
- end
@@ -1,44 +0,0 @@
1
- module Pakyow
2
- module Utils
3
-
4
- # Utility methods for hashes.
5
- class Hash
6
- # Creates an indifferent hash. This means that when indifferentized, this hash:
7
- # { 'foo' => 'bar' }
8
- #
9
- # Can be accessed like this:
10
- # { :foo => 'bar' }
11
- #
12
- def self.strhash(hash)
13
- indifferentize(hash)
14
- end
15
-
16
- # Converts keys to symbols.
17
- def self.symbolize_keys(hash)
18
- ::Hash[hash.map{|(k,v)| [k.to_sym,v]}]
19
- end
20
-
21
- # Converts keys/values to symbols.
22
- def self.symbolize(hash)
23
- ::Hash[hash.map{|(k,v)| [k.to_sym,v.to_sym]}]
24
- end
25
-
26
- protected
27
-
28
- # (see {strhash})
29
- def self.indifferentize(hash)
30
- hash.each_pair do |key, value|
31
- hash[key] = indifferentize(value) if value.is_a? ::Hash
32
- end
33
-
34
- indifferent_hash.merge(hash)
35
- end
36
-
37
- # (see {strhash})
38
- def self.indifferent_hash
39
- ::Hash.new { |hash,key| hash[key.to_s] if Symbol === key }
40
- end
41
- end
42
-
43
- end
44
- end
@@ -1,41 +0,0 @@
1
- module Pakyow
2
- module Utils
3
-
4
- # Utility methods for strings.
5
- class String
6
-
7
- # split . seperated string at the last .
8
- def self.split_at_last_dot(s)
9
- split_index = s.rindex('.')
10
- return s,nil unless split_index
11
- left = s[0,split_index]
12
- right = s[split_index+1,s.length-(split_index+1)]
13
- return left,right
14
- end
15
-
16
- def self.remove_route_vars(route_spec)
17
- return unless route_spec
18
- arr = route_spec.split('/')
19
- new_arr = []
20
- arr.each {|e| new_arr << e unless e[0,1] == ':'}
21
- ret = new_arr.join('/')
22
- return '/' if ret == ''
23
- return ret
24
- end
25
-
26
- def self.parse_path_from_caller(caller)
27
- caller.match(/^(.+)(:?:\d+(:?:in `.+')?$)/)[1]
28
- end
29
-
30
- def self.normalize_path(path)
31
- return path if path.is_a?(Regexp)
32
-
33
- path = path[1, path.length - 1] if path[0, 1] == '/'
34
- path = path[0, path.length - 1] if path[path.length - 1, 1] == '/'
35
- path
36
- end
37
-
38
- end
39
-
40
- end
41
- end