alfa 0.0.5.pre → 0.0.6.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/dummy/project/.gitignore +16 -0
  3. data/dummy/project/.ruby-version +1 -0
  4. data/dummy/project/CHANGELOG +0 -0
  5. data/dummy/project/Gemfile.source +7 -2
  6. data/dummy/project/README +0 -0
  7. data/dummy/project/apps/admin/layouts/base.haml +10 -0
  8. data/dummy/project/apps/admin/layouts/index.haml.source +7 -0
  9. data/dummy/project/apps/admin/templates/default/index.haml +1 -0
  10. data/dummy/project/apps/frontend/layouts/base.haml +10 -0
  11. data/dummy/project/apps/frontend/layouts/index.haml.source +7 -0
  12. data/dummy/project/apps/frontend/templates/default/{index.tpl → index.haml} +0 -0
  13. data/dummy/project/config/db.rb +15 -0
  14. data/dummy/project/config/passwords/.gitignore.source +3 -0
  15. data/dummy/project/config/passwords/db-main.yml.source +8 -0
  16. data/dummy/project/config/passwords/secrets.sample.yml +2 -0
  17. data/dummy/project/config/passwords/secrets.yml.source +2 -0
  18. data/dummy/project/config/web_application.rb +1 -0
  19. data/dummy/project/db/main/migrations/.keep +0 -0
  20. data/dummy/project/db/main/models/.keep +0 -0
  21. data/dummy/project/db/main/schema/.keep +0 -0
  22. data/dummy/project/db/main/seed.rb +0 -0
  23. data/dummy/project/log/.keep +0 -0
  24. data/dummy/project/public/.htaccess +13 -0
  25. data/dummy/project/tasks/.keep +0 -0
  26. data/dummy/project/test/.keep +0 -0
  27. data/lib/alfa/application.rb +21 -1
  28. data/lib/alfa/commands/new.rb +14 -9
  29. data/lib/alfa/config.rb +3 -2
  30. data/lib/alfa/controller.rb +19 -104
  31. data/lib/alfa/database.rb +2 -1
  32. data/lib/alfa/exceptions.rb +5 -0
  33. data/lib/alfa/logger.rb +4 -3
  34. data/lib/alfa/resourcer.rb +29 -0
  35. data/lib/alfa/router.rb +34 -14
  36. data/lib/alfa/snippeter.rb +42 -0
  37. data/lib/alfa/support/common.rb +195 -0
  38. data/lib/alfa/support/nil_operations.rb +207 -0
  39. data/lib/alfa/support/time.rb +5 -0
  40. data/lib/alfa/support.rb +3 -135
  41. data/lib/alfa/tasks/assets.rake +16 -0
  42. data/lib/alfa/tasks/db.rake +169 -0
  43. data/lib/alfa/tasks/generators.rake +80 -0
  44. data/lib/alfa/tasks.rb +4 -0
  45. data/lib/alfa/tfile.rb +1 -1
  46. data/lib/alfa/user.rb +41 -6
  47. data/lib/alfa/web_application.rb +96 -31
  48. data/lib/alfa/wrapper.rb +155 -0
  49. data/lib/alfa.rb +0 -2
  50. data/lib/rack/file_alfa.rb +2 -1
  51. data/lib/sequel/extensions/igrep.rb +19 -0
  52. data/lib/sequel/extensions/with_pks.rb +15 -0
  53. data/lib/template-inheritance/alfa_helpers.rb +106 -25
  54. data/lib/tilt/alfa_patch.rb +1 -1
  55. data/test/data/test_router/1/apps/frontend/routes.rb +1 -0
  56. data/test/data/test_router/2/apps/frontend/routes.rb +1 -0
  57. data/test/data/test_web_application/apps/admin/controllers/second.rb +5 -0
  58. data/test/data/test_web_application/apps/admin/layouts/default.haml +1 -0
  59. data/test/data/test_web_application/apps/admin/layouts/default.tpl +1 -0
  60. data/test/data/test_web_application/apps/admin/routes.rb +1 -0
  61. data/test/data/test_web_application/apps/admin/templates/default/test_04.haml +1 -0
  62. data/test/data/test_web_application/apps/admin/templates/default/test_04.tpl +1 -0
  63. data/test/data/test_web_application/apps/admin/templates/default/test_08.haml +2 -0
  64. data/test/data/test_web_application/apps/admin/templates/default/test_08a.haml +1 -0
  65. data/test/data/test_web_application/apps/admin/templates/second/index.haml +1 -0
  66. data/test/data/test_web_application/apps/frontend/controllers/second.rb +5 -0
  67. data/test/data/test_web_application/apps/frontend/layouts/default.haml +1 -0
  68. data/test/data/test_web_application/apps/frontend/layouts/default.tpl +1 -0
  69. data/test/data/test_web_application/apps/frontend/routes.rb +1 -0
  70. data/test/data/test_web_application/apps/frontend/templates/default/bar.haml +0 -0
  71. data/test/data/test_web_application/apps/frontend/templates/default/bar.tpl +0 -0
  72. data/test/data/test_web_application/apps/frontend/templates/default/frontend_only.haml +0 -0
  73. data/test/data/test_web_application/apps/frontend/templates/default/frontend_only.tpl +0 -0
  74. data/test/data/test_web_application/apps/frontend/templates/default/index.haml +0 -0
  75. data/test/data/test_web_application/apps/frontend/templates/default/index.tpl +0 -0
  76. data/test/data/test_web_application/apps/frontend/templates/default/test_04.haml +1 -0
  77. data/test/data/test_web_application/apps/frontend/templates/default/test_04.tpl +1 -0
  78. data/test/data/test_web_application/apps/frontend/templates/default/test_08.haml +2 -0
  79. data/test/data/test_web_application/apps/frontend/templates/default/test_08a.haml +1 -0
  80. data/test/data/test_web_application/apps/frontend/templates/second/index.haml +1 -0
  81. data/test/test_config.rb +2 -2
  82. data/test/test_controller.rb +13 -3
  83. data/test/test_router.rb +13 -6
  84. data/test/test_ruby_core.rb +32 -0
  85. data/test/test_support.rb +152 -11
  86. data/test/test_web_application.rb +7 -0
  87. data/version.rb +1 -1
  88. metadata +100 -16
  89. data/lib/alfa/database/mysql.rb +0 -107
  90. data/lib/alfa/models/base.rb +0 -7
  91. data/lib/alfa/models/base_sql.rb +0 -9
  92. data/lib/alfa/models/dummy.rb +0 -7
  93. data/lib/alfa/models/mysql.rb +0 -62
  94. data/lib/alfa/models.rb +0 -2
@@ -0,0 +1,195 @@
1
+ require 'bigdecimal'
2
+
3
+ module Alfa
4
+
5
+ # Thanks to John
6
+ # http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
7
+ module ClassInheritance
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def inheritable_attributes(*args)
14
+ @inheritable_attributes ||= [:inheritable_attributes]
15
+ @inheritable_attributes += args
16
+ args.each do |arg|
17
+ class_eval %(
18
+ class << self; attr_accessor :#{arg} end
19
+ )
20
+ end
21
+ @inheritable_attributes
22
+ end
23
+
24
+ def inherited(subclass) # ruby hook
25
+ @inheritable_attributes.each do |inheritable_attribute|
26
+ instance_var = "@#{inheritable_attribute}"
27
+ subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ module Support
34
+ extend self
35
+
36
+ def camelcase_name(arg)
37
+ arg.to_s.split('/').last.split('_').map(&:capitalize).join
38
+ end
39
+
40
+ def underscore_name(arg)
41
+ arg.to_s.split('/').last.scan(/[A-Z][a-z]*|[a-z]+|\d+/).map(&:downcase).join('_')
42
+ end
43
+
44
+ def args_kwargs(*args)
45
+ return args[0..-2], args.last if args.last.is_a?(Hash)
46
+ return args, {}
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+
53
+ class Module
54
+ def load_in_module_context file
55
+ module_eval ::File.read(file), file
56
+ end
57
+
58
+ def load_in_class_context file
59
+ class_eval ::File.read(file), file
60
+ end
61
+ end
62
+
63
+
64
+ class BasicObject
65
+ def load_in_instance_context(file)
66
+ raise LoadError.new("#{file} does not exists") unless ::File.exist?(file)
67
+ instance_eval ::File.read(file), file
68
+ end
69
+ end
70
+
71
+ # Borrowed from active_support/core_ext/hash/keys.rb
72
+ class Hash
73
+ # Return a new hash with all keys converted to strings.
74
+ #
75
+ # { :name => 'Rob', :years => '28' }.stringify_keys
76
+ # #=> { "name" => "Rob", "years" => "28" }
77
+ def stringify_keys
78
+ dup.stringify_keys!
79
+ end
80
+
81
+ # Destructively convert all keys to strings. Same as
82
+ # +stringify_keys+, but modifies +self+.
83
+ def stringify_keys!
84
+ keys.each do |key|
85
+ self[key.to_s] = delete(key)
86
+ end
87
+ self
88
+ end
89
+
90
+ # Return a new hash with all keys converted to symbols, as long as
91
+ # they respond to +to_sym+.
92
+ #
93
+ # { 'name' => 'Rob', 'years' => '28' }.symbolize_keys
94
+ # #=> { :name => "Rob", :years => "28" }
95
+ def symbolize_keys
96
+ dup.symbolize_keys!
97
+ end
98
+
99
+ # Destructively convert all keys to symbols, as long as they respond
100
+ # to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
101
+ def symbolize_keys!
102
+ keys.each do |key|
103
+ self[(key.to_sym rescue key) || key] = delete(key)
104
+ end
105
+ self
106
+ end
107
+
108
+
109
+ def delete!(*keys)
110
+ keys.each{|key| self.delete(key)}
111
+ self
112
+ end
113
+
114
+
115
+ def except(*keys)
116
+ self.dup.delete!(*keys)
117
+ end
118
+ end
119
+
120
+
121
+ class String
122
+ # PHP's two argument version of strtr
123
+ def strtr(replace_pairs)
124
+ keys = replace_pairs.map {|a, b| a }
125
+ values = replace_pairs.map {|a, b| b }
126
+ self.gsub(
127
+ /(#{keys.map{|a| Regexp.quote(a) }.join( ')|(' )})/
128
+ ) { |match| values[keys.index(match)] }
129
+ end
130
+
131
+ def strtr!(replace_pairs)
132
+ keys = replace_pairs.map {|a, b| a }
133
+ values = replace_pairs.map {|a, b| b }
134
+ self.gsub!(
135
+ /(#{keys.map{|a| Regexp.quote(a) }.join( ')|(' )})/
136
+ ) { |match| values[keys.index(match)] }
137
+ end
138
+ end
139
+
140
+
141
+ module Alfa
142
+ module HMround
143
+ # hround(digits) -> string
144
+ #
145
+ # Returns string with human-adopted representation of number, rounded to digit after dot
146
+ #
147
+ # 123.456.hround(1) #=> "123.5"
148
+ # 123.hround(1) #=> "123"
149
+ # 0.123.hround(1) #=> "0.1"
150
+ #
151
+ # @param digits Fixnum
152
+ # @return String
153
+ def hround(digits)
154
+ '%g' % ("%.#{digits}f" % self)
155
+ end
156
+
157
+ # mround -> string
158
+ #
159
+ # Return string with money representation of number
160
+ #
161
+ # 123.456.mround #=> "123.46"
162
+ # 123.mround #=> "123"
163
+ # 123.mround(true) #=> "123.00"
164
+ # 0.123.mround #=> "0.12"
165
+ # 1.1.mround #=> "1.10"
166
+ #
167
+ # @param zeroes Boolean
168
+ # @return String
169
+ def mround(zeroes = false)
170
+ if !zeroes
171
+ y = self.round(2)
172
+ y.modulo(1) == 0 ? y.to_i.to_s : '%.2f' % y
173
+ else
174
+ '%.2f' % self
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+
181
+ class Fixnum
182
+ include Alfa::HMround
183
+ end
184
+
185
+ class Float
186
+ include Alfa::HMround
187
+ end
188
+
189
+ class String
190
+ include Alfa::HMround
191
+ end
192
+
193
+ class BigDecimal
194
+ include Alfa::HMround
195
+ end
@@ -0,0 +1,207 @@
1
+ require 'delegate'
2
+
3
+ # Nil operations
4
+ # Nil mean "unknown" or "no data set", so operations with nil return nil too
5
+ class NilKnown < SimpleDelegator
6
+ attr_accessor :known
7
+ alias :value :__getobj__
8
+
9
+ def initialize(obj, k = nil)
10
+ raise ::ArgumentError, 'obj and k should not be not nil simultaneously' if !obj.nil? && !k.nil?
11
+ super(obj)
12
+ @known = obj ? obj : k
13
+ end
14
+
15
+ def nil?
16
+ @delegate_sd_obj.nil?
17
+ end
18
+
19
+ alias :implicit? :nil?
20
+
21
+ def explicit?
22
+ !implicit?
23
+ end
24
+
25
+ def is?
26
+ !(@delegate_sd_obj.nil? || @delegate_sd_obj === false)
27
+ end
28
+
29
+ def +(arg)
30
+ if nil? || arg.nil?
31
+ arg_known = arg.respond_to?(:known) ? arg.known : nil
32
+ k = (
33
+ if known.nil? && arg_known.nil?
34
+ nil
35
+ elsif known.nil?
36
+ arg_known
37
+ elsif arg_known.nil?
38
+ known
39
+ else
40
+ known + arg_known
41
+ end
42
+ )
43
+ k.nil? ? nil : NilKnown.new(nil, k)
44
+ else
45
+ NilKnown.new(@delegate_sd_obj + arg)
46
+ end
47
+ end
48
+
49
+ def -(arg)
50
+ if nil? || arg.nil?
51
+ arg_known = arg.respond_to?(:known) ? arg.known : nil
52
+ k = (
53
+ if known.nil? && arg_known.nil?
54
+ nil
55
+ elsif known.nil?
56
+ -arg_known
57
+ elsif arg_known.nil?
58
+ known
59
+ else
60
+ known - arg_known
61
+ end
62
+ )
63
+ k.nil? ? nil : NilKnown.new(nil, k)
64
+ else
65
+ NilKnown.new(@delegate_sd_obj - arg)
66
+ end
67
+ end
68
+
69
+ def *(arg)
70
+ if nil? || arg.nil?
71
+ arg_known = arg.respond_to?(:known) ? arg.known : nil
72
+ k = (
73
+ if known.nil? || arg_known.nil?
74
+ 0
75
+ else
76
+ known * arg_known
77
+ end
78
+ )
79
+ k.nil? ? nil : NilKnown.new(nil, k)
80
+ else
81
+ NilKnown.new(@delegate_sd_obj * arg)
82
+ end
83
+ end
84
+
85
+ def fdiv(arg)
86
+ if nil? || arg.nil?
87
+ arg_known = arg.respond_to?(:known) ? arg.known : nil
88
+ k = (
89
+ if arg_known.nil?
90
+ Float::INFINITY
91
+ elsif known.nil?
92
+ 0
93
+ end
94
+ )
95
+ k.nil? ? nil : NilKnown.new(nil, k)
96
+ else
97
+ NilKnown.new(@delegate_sd_obj.fdiv(arg))
98
+ end
99
+ end
100
+
101
+ def /(arg)
102
+ if nil? || arg.nil?
103
+ arg_known = arg.respond_to?(:known) ? arg.known : nil
104
+ k = (
105
+ if arg_known.nil?
106
+ if @delegate_sd_obj.is_a?(Float) || @delegate_sd_obj.is_a?(NilClass)
107
+ Float::INFINITY
108
+ else
109
+ raise ZeroDivisionError
110
+ end
111
+ elsif known.nil?
112
+ 0
113
+ end
114
+ )
115
+ k.nil? ? nil : NilKnown.new(nil, k)
116
+ else
117
+ NilKnown.new(@delegate_sd_obj / arg)
118
+ end
119
+ end
120
+
121
+ def div(arg)
122
+ if nil? || arg.nil?
123
+ arg_known = arg.respond_to?(:known) ? arg.known : nil
124
+ k = (
125
+ if arg_known.nil?
126
+ raise ZeroDivisionError
127
+ elsif known.nil?
128
+ 0
129
+ end
130
+ )
131
+ k.nil? ? nil : NilKnown.new(nil, k)
132
+ else
133
+ NilKnown.new(@delegate_sd_obj.div(arg))
134
+ end
135
+ end
136
+
137
+ def to_a
138
+ [value, known]
139
+ end
140
+
141
+ def to_h
142
+ {value: value, known: known}
143
+ end
144
+
145
+ def to_nkn
146
+ self
147
+ end
148
+
149
+ def hround(digits)
150
+ self.nil? ? '' : @delegate_sd_obj.hround(digits)
151
+ end
152
+
153
+ def mround(zeroes = false)
154
+ self.nil? ? '' : @delegate_sd_obj.mround(zeroes)
155
+ end
156
+
157
+ def inspect
158
+ "#<NilKnown:#{'%x' % (__id__ << 1)},#{@delegate_sd_obj.inspect}, #{@known.inspect}>"
159
+ end
160
+ end
161
+
162
+
163
+ module Alfa
164
+ module NilOperations
165
+ def known
166
+ self
167
+ end
168
+
169
+ def value
170
+ self
171
+ end
172
+
173
+ def to_nkn
174
+ NilKnown.new(self)
175
+ end
176
+
177
+ def is?
178
+ self
179
+ end
180
+ end
181
+ end
182
+
183
+
184
+ class NilClass
185
+ include Alfa::NilOperations
186
+ end
187
+
188
+
189
+ class Float
190
+ include Alfa::NilOperations
191
+ end
192
+
193
+
194
+ class Fixnum
195
+ include Alfa::NilOperations
196
+ end
197
+
198
+
199
+ class BigDecimal
200
+ include Alfa::NilOperations
201
+ end
202
+
203
+ class Array
204
+ def to_nkn
205
+ NilKnown.new(self[0], self[1])
206
+ end
207
+ end
@@ -0,0 +1,5 @@
1
+ class Time
2
+ def ago
3
+ (::Time.now - self).to_i
4
+ end
5
+ end
data/lib/alfa/support.rb CHANGED
@@ -1,135 +1,3 @@
1
- module Alfa
2
-
3
- # Thanks to John
4
- # http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/
5
- module ClassInheritance
6
- def self.included(base)
7
- base.extend(ClassMethods)
8
- end
9
-
10
- module ClassMethods
11
- def inheritable_attributes(*args)
12
- @inheritable_attributes ||= [:inheritable_attributes]
13
- @inheritable_attributes += args
14
- args.each do |arg|
15
- class_eval %(
16
- class << self; attr_accessor :#{arg} end
17
- )
18
- end
19
- @inheritable_attributes
20
- end
21
-
22
- def inherited(subclass) # ruby hook
23
- @inheritable_attributes.each do |inheritable_attribute|
24
- instance_var = "@#{inheritable_attribute}"
25
- subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
26
- end
27
- end
28
- end
29
- end
30
-
31
- module Support
32
- extend self
33
-
34
- def camelcase_name(arg)
35
- arg.to_s.split('/').last.split('_').map(&:capitalize).join
36
- end
37
-
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, {}
45
- end
46
- end
47
-
48
- end
49
-
50
-
51
- class Module
52
- def load_in_module_context file
53
- module_eval file, file
54
- end
55
-
56
- def load_in_class_context file
57
- class_eval file, file
58
- end
59
- end
60
-
61
-
62
- class BasicObject
63
- def load_in_instance_context file
64
- instance_eval file, file
65
- end
66
- end
67
-
68
- # Borrowed from active_support/core_ext/hash/keys.rb
69
- class Hash
70
- # Return a new hash with all keys converted to strings.
71
- #
72
- # { :name => 'Rob', :years => '28' }.stringify_keys
73
- # #=> { "name" => "Rob", "years" => "28" }
74
- def stringify_keys
75
- dup.stringify_keys!
76
- end
77
-
78
- # Destructively convert all keys to strings. Same as
79
- # +stringify_keys+, but modifies +self+.
80
- def stringify_keys!
81
- keys.each do |key|
82
- self[key.to_s] = delete(key)
83
- end
84
- self
85
- end
86
-
87
- # Return a new hash with all keys converted to symbols, as long as
88
- # they respond to +to_sym+.
89
- #
90
- # { 'name' => 'Rob', 'years' => '28' }.symbolize_keys
91
- # #=> { :name => "Rob", :years => "28" }
92
- def symbolize_keys
93
- dup.symbolize_keys!
94
- end
95
-
96
- # Destructively convert all keys to symbols, as long as they respond
97
- # to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
98
- def symbolize_keys!
99
- keys.each do |key|
100
- self[(key.to_sym rescue key) || key] = delete(key)
101
- end
102
- self
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
135
- end
1
+ require 'alfa/support/common'
2
+ require 'alfa/support/time'
3
+ require 'alfa/support/nil_operations'
@@ -0,0 +1,16 @@
1
+ require 'fileutils'
2
+
3
+ namespace :assets do
4
+
5
+ desc 'Copy assets from gem folder to PROJECT_ROOT/public/~assets'
6
+ task :copy do
7
+ src = File.expand_path('../../../../assets', __FILE__)
8
+ dest = File.join(DOCUMENT_ROOT, '~assets')
9
+ FileUtils.mkdir(dest, mode: 0755) unless File.directory?(dest)
10
+ Dir[File.join(src, '*')].each do |f|
11
+ FileUtils.cp_r(f, dest)
12
+ end
13
+ puts "Assets copied from #{src} to #{dest}"
14
+ end
15
+
16
+ end