alfa 0.0.4.pre → 0.0.5.pre

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 (60) hide show
  1. checksums.yaml +7 -0
  2. data/assets/js/jquery/jquery-1.11.0.js +10337 -0
  3. data/assets/js/jquery/jquery-1.11.0.min.js +4 -0
  4. data/assets/js/jquery/jquery-latest.js +4 -2
  5. data/dummy/project/Gemfile.source +6 -0
  6. data/dummy/project/Rakefile +5 -0
  7. data/dummy/project/apps/admin/controllers/default.rb +4 -0
  8. data/dummy/project/apps/admin/layouts/base.tpl +14 -0
  9. data/dummy/project/apps/admin/layouts/index.tpl.source +5 -0
  10. data/dummy/project/apps/admin/routes.rb +3 -0
  11. data/dummy/project/apps/admin/templates/default/index.tpl +1 -0
  12. data/dummy/project/apps/frontend/controllers/default.rb +5 -0
  13. data/dummy/project/apps/frontend/layouts/base.tpl +14 -0
  14. data/dummy/project/apps/frontend/layouts/index.tpl.source +5 -0
  15. data/dummy/project/apps/frontend/routes.rb +11 -0
  16. data/dummy/project/apps/frontend/templates/default/index.tpl +1 -0
  17. data/dummy/project/config/cli_application.rb +14 -0
  18. data/dummy/project/config/config.rb +11 -0
  19. data/dummy/project/config/db.rb +11 -0
  20. data/dummy/project/config/env.rb +6 -0
  21. data/dummy/project/config/groups.rb +17 -0
  22. data/dummy/project/config/passwords/db.sample.yml +8 -0
  23. data/dummy/project/config/routes.rb +4 -0
  24. data/dummy/project/config/setup_load_paths.rb +14 -0
  25. data/dummy/project/config/web_application.rb +15 -0
  26. data/dummy/project/config.ru +3 -0
  27. data/dummy/project/db/main/schema.yml +3 -0
  28. data/dummy/project/public/favicon.ico +0 -0
  29. data/dummy/project/public/robots.txt +1 -0
  30. data/lib/alfa/application.rb +6 -5
  31. data/lib/alfa/commands/new.rb +49 -4
  32. data/lib/alfa/controller.rb +118 -1
  33. data/lib/alfa/database/mysql.rb +1 -1
  34. data/lib/alfa/exceptions.rb +13 -0
  35. data/lib/alfa/logger.rb +3 -0
  36. data/lib/alfa/router.rb +25 -0
  37. data/lib/alfa/ruty.rb +10 -0
  38. data/lib/alfa/support.rb +39 -4
  39. data/lib/alfa/template-inheritance.rb +3 -0
  40. data/lib/alfa/user.rb +63 -0
  41. data/lib/alfa/web_application.rb +113 -39
  42. data/lib/haml/alfa_patch.rb +25 -0
  43. data/lib/rack/file_alfa.rb +11 -0
  44. data/lib/ruty/tags/href.rb +12 -0
  45. data/lib/ruty/upgrade.rb +1 -1
  46. data/lib/template-inheritance/alfa_bugfix.rb +15 -0
  47. data/lib/template-inheritance/alfa_helpers.rb +93 -0
  48. data/lib/tilt/alfa_patch.rb +25 -0
  49. data/test/data/test_web_application/apps/admin/controllers/default.rb +20 -0
  50. data/test/data/test_web_application/apps/admin/routes.rb +3 -0
  51. data/test/data/test_web_application/apps/frontend/controllers/default.rb +35 -0
  52. data/test/data/test_web_application/apps/frontend/routes.rb +2 -2
  53. data/test/data/test_web_application/config/routes.rb +1 -0
  54. data/test/test_controller.rb +30 -2
  55. data/test/test_router.rb +24 -0
  56. data/test/test_support.rb +72 -19
  57. data/test/test_web_application.rb +72 -5
  58. data/version.rb +1 -0
  59. metadata +143 -74
  60. data/test/data/test_web_application/apps/frontend/controllers/kfk.rb +0 -9
@@ -0,0 +1,5 @@
1
+ {% extends 'base.tpl' %}
2
+
3
+ {% block title %}#{PROJECT_NAME}{% endblock %}
4
+
5
+ {% block body %}{{ body|raw }}{% endblock %}
@@ -0,0 +1,11 @@
1
+ Project::WebApplication.routes.draw do
2
+
3
+ route '/', :controller => :default, :action => :index, :layout => :index
4
+ #route '/:action', :controller => :default, :layout => :internal
5
+ #route '/:controller/:action', :layout => :internal
6
+ #route '/:controller/:action/:id', :layout => :internal
7
+
8
+ route 404, controller: :system, action: :page_404
9
+ route 500, controller: :system, action: :page_500
10
+
11
+ end
@@ -0,0 +1 @@
1
+ apps/frontend/default#index
@@ -0,0 +1,14 @@
1
+ require 'alfa/cli_application'
2
+ require File.expand_path('../env', __FILE__)
3
+ require File.expand_path('../db', __FILE__)
4
+ require File.expand_path('../groups', __FILE__)
5
+
6
+ module Project
7
+ class CliApplication < Alfa::CliApplication
8
+ instance_eval(File.read(File.expand_path('../config.rb', __FILE__)), File.expand_path('../config.rb', __FILE__))
9
+ config[:run_mode] = :cli # :cli for command-line application
10
+ config[:log][:file] = File.join(PROJECT_ROOT, 'log/cli.log')
11
+ end
12
+
13
+ CliApplication.init!
14
+ end
@@ -0,0 +1,11 @@
1
+ # Eval in actual application's context (CliApplication, WebApplication or other)
2
+
3
+ config[:project_root] = PROJECT_ROOT
4
+ config[:document_root] = DOCUMENT_ROOT
5
+ config[:db][:main] = {
6
+ :instance => DB::Main,
7
+ :path => File.join(PROJECT_ROOT, 'db/main'), # require both instance and path
8
+ :maintain => true,
9
+ }
10
+ config[:groups] = Project::GROUPS
11
+ config[:templates_priority] = [:haml, :tpl]
@@ -0,0 +1,11 @@
1
+ require 'alfa/database'
2
+ require 'yaml'
3
+
4
+ # Main database for application private use
5
+ module DB
6
+ Main = Sequel.connect(YAML.load(File.open(File.expand_path('../passwords/db-main.yml', __FILE__))).symbolize_keys[:dsn], :encoding=>'utf8')
7
+ end
8
+
9
+ Dir[File.join(PROJECT_ROOT, 'db/main/models/*.rb')].each do |f|
10
+ require f
11
+ end
@@ -0,0 +1,6 @@
1
+ # Setting up environment variables
2
+
3
+ PROJECT_ROOT = File.expand_path('../..', __FILE__)
4
+ DOCUMENT_ROOT = File.expand_path('../../public', __FILE__)
5
+ Alfa::TFile.project_root = PROJECT_ROOT
6
+ Alfa::TFile.document_root = DOCUMENT_ROOT
@@ -0,0 +1,17 @@
1
+ module Project
2
+ # Here is hash of groups with list of grants in each.
3
+ # Guest group is required and may be empty, all other groups are optional.
4
+ GROUPS = {
5
+ # Add custom groups here. Example:
6
+ # :some_group => [:send_mails, :create_users, :moderate_forum],
7
+ # Note that :some_group=>[:some_grant] and :other_group=>[:some_grant] points to same :some_grant
8
+
9
+ # :admin_index - predefined (system required) grant for browse admin app
10
+ :admin => [:admin_index],
11
+
12
+ # Public group is associated with all users include non-logged in.
13
+ # This group is empty by default, but you can put some grants in it.
14
+ # For example :public => [:foo] means that all users respond to .grant?(:foo) as true.
15
+ :public => [],
16
+ }
17
+ end
@@ -0,0 +1,8 @@
1
+ ---
2
+ # dns format ([...] can be omitted):
3
+ # adapter://user:[password]@host[:port]/database
4
+ dsn: "mysql2://root:123456@localhost:3306/site"
5
+ host: "localhost"
6
+ user: "root"
7
+ password: "123456"
8
+ dbname: "site"
@@ -0,0 +1,4 @@
1
+ Project::WebApplication.routes.draw do
2
+ mount '/admin/', :admin
3
+ mount '/', :frontend
4
+ end
@@ -0,0 +1,14 @@
1
+ # This file required by Phusion Passenger
2
+
3
+ if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
4
+ begin
5
+ require 'rvm'
6
+ RVM.use_from_path! File.dirname(File.dirname(__FILE__))
7
+ rescue LoadError
8
+ raise "RVM gem is currently unavailable."
9
+ end
10
+ end
11
+
12
+ # If you're not using Bundler at all, remove lines bellow
13
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
14
+ require 'bundler/setup'
@@ -0,0 +1,15 @@
1
+ require 'alfa/web_application'
2
+ require File.expand_path('../env', __FILE__)
3
+ require File.expand_path('../db', __FILE__)
4
+ require File.expand_path('../groups', __FILE__)
5
+
6
+ module Project
7
+ class WebApplication < Alfa::WebApplication
8
+ instance_eval(File.read(File.expand_path('../config.rb', __FILE__)), File.expand_path('../config.rb', __FILE__))
9
+ config[:run_mode] = :development # :development or :production or :test
10
+ config[:log][:file] = File.join(PROJECT_ROOT, 'log/web.log')
11
+ config[:serve_static] = true
12
+ end
13
+
14
+ WebApplication.init!
15
+ end
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../config/web_application', __FILE__)
2
+
3
+ Project::WebApplication.rackup self
@@ -0,0 +1,3 @@
1
+ ---
2
+ engine: mysql
3
+ encoding: utf8
Binary file
@@ -0,0 +1 @@
1
+ User-Agent: *
@@ -8,7 +8,7 @@ Encoding.default_internal = 'utf-8'
8
8
  module Alfa
9
9
 
10
10
  # Dirty hack. Using constant-hash to store values. Ruby forbid dynamically change constants, but it allow change items of constant-structs
11
- # 1st using - in rake tasks (see self.load_tasks)
11
+ # 1st using - in Rake tasks (see self.load_tasks)
12
12
  VARS = {}
13
13
 
14
14
  class Application
@@ -19,8 +19,9 @@ module Alfa
19
19
 
20
20
  @config = Alfa::Config.new
21
21
 
22
- def self.config(kwargs={})
23
- @config.merge! kwargs
22
+ def self.config(kwargs = nil)
23
+ @config.merge!(kwargs) if kwargs
24
+ @config
24
25
  end
25
26
 
26
27
 
@@ -29,7 +30,7 @@ module Alfa
29
30
  if @config[:log][:file]
30
31
  @log_file = File.open(@config[:log][:file], File::WRONLY | File::APPEND | File::CREAT)
31
32
  @logger = Alfa::Logger.new(@log_file)
32
- str = "Application (pid=#{$$}) started at #{DateTime.now}"
33
+ str = "Application (pid=#{$$}) started in #{@config[:run_mode]} mode at #{DateTime.now}"
33
34
  @logger.info "#{'='*str.length}\n#{str}"
34
35
  @logger.info " PROJECT_ROOT: #{@config[:project_root]}"
35
36
  @logger.info " DOCUMENT_ROOT: #{@config[:document_root]}\n"
@@ -50,7 +51,7 @@ module Alfa
50
51
 
51
52
 
52
53
  def self.verify_config
53
- raise Exceptions::E001 unless @config[:project_root]
54
+ raise Exceptions::E001.new('config[:project_root] should be defined') unless @config[:project_root]
54
55
  end
55
56
  end
56
57
  end
@@ -1,4 +1,49 @@
1
- project_name = $*[1]
2
- target_dir = File.join(Dir.pwd, project_name)
3
- raise "file or directory #{project_name} already exists" if File.exists?(target_dir)
4
- Dir.mkdir project_name
1
+ require File.expand_path('../../../../version', __FILE__)
2
+ require 'fileutils'
3
+ require 'alfa/support'
4
+
5
+ PROJECT_NAME = $*[1]
6
+
7
+ sr = {
8
+ '#{ALFA_VERSION}' => ALFA_VERSION,
9
+ '#{PROJECT_NAME}' => PROJECT_NAME,
10
+ }
11
+
12
+ target_dir = File.join(Dir.pwd, PROJECT_NAME)
13
+ raise "file or directory #{PROJECT_NAME} already exists" if File.exists?(target_dir)
14
+ Dir.mkdir PROJECT_NAME
15
+
16
+ puts "Created new project in #{PROJECT_NAME}"
17
+
18
+ begin
19
+ print "Copy dummy project... "
20
+ source_base_len = File.expand_path('../../../../dummy/project', __FILE__).length + 1
21
+ Dir[File.expand_path('../../../../dummy/project/**/{*,.[^.]*}', __FILE__)].each do |path|
22
+ relpath = path[source_base_len..-1]
23
+ target = File.join(target_dir, relpath)
24
+ if File.directory?(path)
25
+ FileUtils.mkdir_p target, :mode => 0755
26
+ else
27
+ if File.extname(relpath) == '.source'
28
+ File.open(target.chomp('.source'), File::WRONLY | File::CREAT) do |f|
29
+ f.write(File.read(path).strtr(sr))
30
+ end
31
+ else
32
+ FileUtils.cp(path, target)
33
+ end
34
+ end
35
+ end
36
+ print "done"
37
+ ensure
38
+ puts ""
39
+ end
40
+
41
+ begin
42
+ print "Bundle install... "
43
+ FileUtils.cd PROJECT_NAME
44
+ `bundle install`
45
+ print "done"
46
+ ensure
47
+ FileUtils.cd '..'
48
+ puts ""
49
+ end
@@ -1,7 +1,124 @@
1
+ require 'alfa/support'
2
+ require 'alfa/exceptions'
3
+
1
4
  module Alfa
2
5
  class Controller
6
+ attr_accessor :application, :request, :config, :app_sym, :c_sym
7
+
3
8
  def _instance_variables_hash
4
- Hash[instance_variables.map { |name| [name.to_s[1..-1].to_sym, instance_variable_get(name)] } ]
9
+ Hash[instance_variables.map { |name| [name.to_sym, instance_variable_get(name)] } ]
10
+ end
11
+
12
+ def _clear_instance_variables
13
+ instance_variables.each {|name| remove_instance_variable(name)}
14
+ end
15
+
16
+ def href(*o)
17
+ kwargs = _extract_href_params(*o)
18
+ @application.routes.href(kwargs)
19
+ end
20
+
21
+ alias :href_to :href
22
+
23
+ def _extract_href_params(*o)
24
+ args, kwargs = Support.args_kwargs(*o)
25
+ if args.any?
26
+ if args.first.is_a?(Symbol)
27
+ kwargs[:action] = args.first
28
+ else
29
+ kwargs.merge! _string_to_aca(args.first.to_s)
30
+ end
31
+ end
32
+ kwargs = {:app=>@app_sym}.merge kwargs
33
+ kwargs = {:controller=>@c_sym}.merge kwargs if kwargs[:action]
34
+ kwargs
35
+ end
36
+
37
+ # Convert string to App-Controller-Action hash
38
+ # 'app*controller#action'
39
+ def _string_to_aca(str)
40
+ res = {}
41
+ s1 = str.split('@')
42
+ raise Exceptions::E004.new("E004: Bad href argument #{str}: it should contain at most one @ symbol") if s1.length > 2
43
+ res[:app] = s1.last.to_sym if s1.length > 1
44
+ s2 = s1.first.split('#')
45
+ raise Exceptions::E004.new("E004: Bad href argument #{str}: it should contain at most one # symbol") if s2.length > 2
46
+ res[:controller] = s2.first.to_sym if s2.length > 1
47
+ res[:action] = s2.last.to_sym if s2.length > 0
48
+ res
49
+ end
50
+
51
+
52
+ def session
53
+ @request.session
54
+ end
55
+
56
+ # Return current user
57
+ def user
58
+ @user ||= (
59
+ if @request.session[:user_id] && (u = @application.config[:db][:main][:instance][:users].first(id: @request.session[:user_id]))
60
+ User.new(u)
61
+ else
62
+ GuestUser
63
+ end
64
+ )
65
+ end
66
+
67
+
68
+ def grant?(grant)
69
+ user.grant?(grant)
70
+ end
71
+
72
+
73
+ [300, 301, 302, 303].each do |code|
74
+ define_method ("redirect_#{code}".to_sym) do |url|
75
+ @application.redirect(url, code)
76
+ end
77
+ end
78
+
79
+ alias :redirect :redirect_302
80
+
81
+
82
+ def try_login(username, password)
83
+ u = @application.config[:db][:main][:instance][:users].first(login: username)
84
+ raise "No such login: #{username}" unless u
85
+ if u[:passhash] == Digest::MD5.hexdigest("#{u[:salt]}#{password}")
86
+ # success
87
+ session[:user_id] = u[:id]
88
+ return true
89
+ else
90
+ # fail
91
+ session[:user_id] = nil
92
+ raise 'login fail'
93
+ return false
94
+ end
95
+ end
96
+
97
+
98
+ def try_register(username, password)
99
+ @config[:db][:main][:instance].transaction do
100
+ unless @config[:db][:main][:instance][:users].first(:login=>username)
101
+ @logger.portion do |l|
102
+ salt = SecureRandom.hex(5)
103
+ passhash = Digest::MD5.hexdigest("#{salt}#{password}")
104
+ @config[:db][:main][:instance][:users].insert(:login=>username, :salt=>salt, :passhash=>passhash)
105
+ l.info("create new user login=#{username}, password=#{password}, salt=#{salt}, passhash=#{passhash}")
106
+ end
107
+ return true, "Registration done"
108
+ end
109
+ return false, "User with login #{username} already exists"
110
+ end
111
+ end
112
+
113
+
114
+ def try_logout
115
+ session[:user_id] = nil
116
+ @user = GuestUser
117
+ end
118
+
119
+ # Store flash message to session
120
+ def flash(message)
121
+
5
122
  end
6
123
  end
7
124
  end
@@ -27,7 +27,7 @@ module Alfa
27
27
  raise "Unacceptible engine in #{path}/schema.yml, expected to be mysql of mysql2" unless ['mysql', 'mysql2'].include? data[:engine]
28
28
  Dir[File.join(path, 'models/*.rb')].each do |file|
29
29
  require file
30
- Kernel::const_get(Alfa::Support.capitalize_name(File.basename(file, '.rb'))).register_database self
30
+ Kernel::const_get(Alfa::Support.camelcase_name(File.basename(file, '.rb'))).register_database self
31
31
  end
32
32
 
33
33
  end
@@ -3,10 +3,23 @@ module Alfa
3
3
  # Route not found
4
4
  class Route404 < StandardError; end
5
5
 
6
+ class HttpRedirect < StandardError
7
+ attr_reader :url, :code
8
+ def initialize(url, code)
9
+ @url, @code = url, code
10
+ end
11
+ end
12
+
6
13
  # Application's config.project_root required
7
14
  class E001 < StandardError; end
8
15
 
9
16
  # WebApplication's config.document_root required
10
17
  class E002 < StandardError; end
18
+
19
+ # Href can't be build
20
+ class E003 < StandardError; end
21
+
22
+ # Bad str for href format
23
+ class E004 < StandardError; end
11
24
  end
12
25
  end
data/lib/alfa/logger.rb CHANGED
@@ -12,6 +12,9 @@ module Alfa
12
12
  def info(*args)
13
13
  end
14
14
 
15
+ def debug(*args)
16
+ end
17
+
15
18
  def <<(*args)
16
19
  end
17
20
  end
data/lib/alfa/router.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'alfa/exceptions'
2
+ require 'rack/utils'
3
+
1
4
  module Alfa
2
5
  class Router
3
6
 
@@ -165,5 +168,27 @@ module Alfa
165
168
  raise Alfa::Exceptions::Route404
166
169
  end
167
170
 
171
+
172
+ def self.href(kwargs={})
173
+ params = kwargs[:params] || {}
174
+ kwargs.delete!(:params)
175
+ @routes.each do |route|
176
+ if route[:context].is_a?(Hash) # container
177
+ if route[:context][:app][:app] == kwargs[:app]
178
+ route[:routes].each do |r|
179
+ r[:placeholders] = r[:rule].scan(/:([a-z_][a-z0-9_]*)/).map{|m| m[0].to_sym}.sort unless r[:placeholders]
180
+ if (r[:placeholders] - kwargs.keys).empty? &&
181
+ (kwargs.keys & r[:options].keys).all?{|key| kwargs[key] == r[:options][key]} &&
182
+ (kwargs.keys - [:app] - r[:placeholders] - r[:options].keys).empty?
183
+ result = File.join(route[:context][:app][:path], r[:rule].strtr(kwargs.map{|key, value| [":#{key}", value.to_s]}))
184
+ result += "?#{::Rack::Utils.build_query(params)}" if params.any?
185
+ return result
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+ raise Exceptions::E003.new("Can't build url by params #{kwargs}")
192
+ end
168
193
  end
169
194
  end
data/lib/alfa/ruty.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'ruty'
2
+ require 'ruty/bugfix'
3
+ require 'ruty/upgrade'
4
+ require 'ruty/tags/resources'
5
+ require 'ruty/tags/href'
6
+
7
+ module Ruty
8
+ # Global variable, bad code style
9
+ AUX_VARS = {}
10
+ end
data/lib/alfa/support.rb CHANGED
@@ -31,13 +31,17 @@ module Alfa
31
31
  module Support
32
32
  extend self
33
33
 
34
- def capitalize_name(arg)
34
+ def camelcase_name(arg)
35
35
  arg.to_s.split('/').last.split('_').map(&:capitalize).join
36
36
  end
37
37
 
38
- def parse_arguments(*arguments)
39
- return arguments[0..-2], arguments.last if arguments.last.is_a?(Hash)
40
- return arguments, {}
38
+ def underscore_name(arg)
39
+ arg.to_s.split('/').last.scan(/[A-Z][a-z]*|[a-z]+/).map(&:downcase).join('_')
40
+ end
41
+
42
+ def args_kwargs(*args)
43
+ return args[0..-2], args.last if args.last.is_a?(Hash)
44
+ return args, {}
41
45
  end
42
46
  end
43
47
 
@@ -97,4 +101,35 @@ class Hash
97
101
  end
98
102
  self
99
103
  end
104
+
105
+
106
+ def delete!(*keys)
107
+ keys.each{|key| self.delete(key)}
108
+ self
109
+ end
110
+
111
+
112
+ def except(*keys)
113
+ self.dup.delete!(*keys)
114
+ end
115
+ end
116
+
117
+
118
+ class String
119
+ # PHP's two argument version of strtr
120
+ def strtr(replace_pairs)
121
+ keys = replace_pairs.map {|a, b| a }
122
+ values = replace_pairs.map {|a, b| b }
123
+ self.gsub(
124
+ /(#{keys.map{|a| Regexp.quote(a) }.join( ')|(' )})/
125
+ ) { |match| values[keys.index(match)] }
126
+ end
127
+
128
+ def strtr!(replace_pairs)
129
+ keys = replace_pairs.map {|a, b| a }
130
+ values = replace_pairs.map {|a, b| b }
131
+ self.gsub!(
132
+ /(#{keys.map{|a| Regexp.quote(a) }.join( ')|(' )})/
133
+ ) { |match| values[keys.index(match)] }
134
+ end
100
135
  end
@@ -0,0 +1,3 @@
1
+ require 'template-inheritance/alfa_bugfix'
2
+ require 'template-inheritance'
3
+ require 'template-inheritance/alfa_helpers'
data/lib/alfa/user.rb ADDED
@@ -0,0 +1,63 @@
1
+ module Alfa
2
+ class << self
3
+ attr_accessor :GROUPS
4
+ end
5
+
6
+ class GuestUser
7
+ def self.grants
8
+ @grants ||= Alfa.GROUPS[:public]
9
+ end
10
+
11
+ def self.grant?(name)
12
+ grants.include?(name.to_sym)
13
+ end
14
+
15
+ def self.groups
16
+ []
17
+ end
18
+
19
+ def self.group?(name)
20
+ groups.include?(name.to_sym)
21
+ end
22
+
23
+ def self.logged?
24
+ false
25
+ end
26
+
27
+ def [](key)
28
+ nil
29
+ end
30
+ end
31
+
32
+ class User
33
+ def initialize(properties)
34
+ @properties = properties
35
+ end
36
+
37
+ def grants
38
+ @groups_p ||= groups + [:public]
39
+ @groups_p.map{|g| Alfa.GROUPS[g] || []}.flatten
40
+ end
41
+
42
+ def grant?(name)
43
+ grants.include?(name.to_sym)
44
+ end
45
+
46
+ # @return Array
47
+ def groups
48
+ @groups ||= @properties[:groups].to_s.split(',').map{|s| s.strip.to_sym}
49
+ end
50
+
51
+ def group?(name)
52
+ groups.include?(name.to_sym)
53
+ end
54
+
55
+ def logged?
56
+ true
57
+ end
58
+
59
+ def [](key)
60
+ @properties[key]
61
+ end
62
+ end
63
+ end