webink 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/rfcgi +9 -6
- data/lib/webink.rb +0 -0
- data/lib/webink/beauty.rb +0 -0
- data/lib/webink/controller.rb +10 -9
- data/lib/webink/database.rb +25 -5
- data/lib/webink/model.rb +69 -27
- metadata +45 -42
data/bin/rfcgi
CHANGED
@@ -48,6 +48,9 @@ FCGI.each_cgi do |cgi|
|
|
48
48
|
control[:config] = Ink::Beauty.load_config script
|
49
49
|
control[:time] = time
|
50
50
|
control[:cgi] = cgi
|
51
|
+
control[:env] = ENV
|
52
|
+
control[:is_production] = is_production
|
53
|
+
control[:use_errors] = use_errors
|
51
54
|
if cgi.env_table['REQUEST_METHOD'] == 'POST'
|
52
55
|
control[:post] = Hash.new
|
53
56
|
cgi.params.each do |k,v|
|
@@ -75,7 +78,7 @@ FCGI.each_cgi do |cgi|
|
|
75
78
|
fhandle.close
|
76
79
|
|
77
80
|
rescue LoadError => bang
|
78
|
-
if
|
81
|
+
if is_production
|
79
82
|
puts cgi.header({"Location" => "/status-404.html"}) if use_errors
|
80
83
|
error cgi, "NOT_FOUND" if not use_errors
|
81
84
|
else
|
@@ -84,7 +87,7 @@ FCGI.each_cgi do |cgi|
|
|
84
87
|
end
|
85
88
|
|
86
89
|
rescue NotImplementedError => bang
|
87
|
-
if
|
90
|
+
if is_production
|
88
91
|
puts cgi.header({"Location" => "/status-500.html"}) if use_errors
|
89
92
|
error cgi, "SERVER_ERROR" if not use_errors
|
90
93
|
else
|
@@ -93,7 +96,7 @@ FCGI.each_cgi do |cgi|
|
|
93
96
|
end
|
94
97
|
|
95
98
|
rescue ArgumentError => bang
|
96
|
-
if
|
99
|
+
if is_production
|
97
100
|
puts cgi.header({"Location" => "/status-500.html"}) if use_errors
|
98
101
|
error cgi, "SERVER_ERROR" if not use_errors
|
99
102
|
else
|
@@ -102,7 +105,7 @@ FCGI.each_cgi do |cgi|
|
|
102
105
|
end
|
103
106
|
|
104
107
|
rescue RuntimeError => bang
|
105
|
-
if
|
108
|
+
if is_production
|
106
109
|
puts cgi.header({"Location" => "/status-500.html"}) if use_errors
|
107
110
|
error cgi, "SERVER_ERROR" if not use_errors
|
108
111
|
else
|
@@ -111,7 +114,7 @@ FCGI.each_cgi do |cgi|
|
|
111
114
|
end
|
112
115
|
|
113
116
|
rescue NameError => bang
|
114
|
-
if
|
117
|
+
if is_production
|
115
118
|
puts cgi.header({"Location" => "/status-500.html"}) if use_errors
|
116
119
|
error cgi, "SERVER_ERROR" if not use_errors
|
117
120
|
else
|
@@ -120,7 +123,7 @@ FCGI.each_cgi do |cgi|
|
|
120
123
|
end
|
121
124
|
|
122
125
|
rescue Exception, StandardError => bang
|
123
|
-
if
|
126
|
+
if is_production
|
124
127
|
puts cgi.header({"Location" => "/status-500.html"}) if use_errors
|
125
128
|
error cgi, "SERVER_ERROR" if not use_errors
|
126
129
|
else
|
data/lib/webink.rb
CHANGED
File without changes
|
data/lib/webink/beauty.rb
CHANGED
File without changes
|
data/lib/webink/controller.rb
CHANGED
@@ -6,12 +6,13 @@ module Ink
|
|
6
6
|
#
|
7
7
|
# Controllers handle incoming requests and decide what to do
|
8
8
|
# with them. A controller has access to all incoming data, like
|
9
|
-
# POST and GET
|
9
|
+
# POST and GET (through @params[:get] and @params[:post] as
|
10
|
+
# well as the config.
|
10
11
|
#
|
11
12
|
# class App < Ink::Controller
|
12
13
|
#
|
13
14
|
# def index
|
14
|
-
# redirect_to :controller => "
|
15
|
+
# redirect_to :controller => "my_app", :module => "feed", :id => 29382374
|
15
16
|
# end
|
16
17
|
#
|
17
18
|
# def feed
|
@@ -27,9 +28,11 @@ module Ink
|
|
27
28
|
#
|
28
29
|
# end
|
29
30
|
#
|
30
|
-
# A controller named App should have the filename app.rb
|
31
|
-
#
|
32
|
-
#
|
31
|
+
# A controller named App should have the filename app.rb (note
|
32
|
+
# that underscores are not allowed: "app".capitalize must be
|
33
|
+
# the loadable classname) and be placed inside the project
|
34
|
+
# controller folder. It can have instance methods that are
|
35
|
+
# usually refered to as modules.
|
33
36
|
# So a route should contain at least a :controller and a :module.
|
34
37
|
#
|
35
38
|
# In the sample above there are three modules, index redirects
|
@@ -211,8 +214,7 @@ module Ink
|
|
211
214
|
# [returns:] Hyperlink
|
212
215
|
def link_to(*args)
|
213
216
|
raise ArgumentError.new("Expects an array.") if not args.instance_of? Array and args.length < 2
|
214
|
-
href = "#{@params[:root]}#{(@params[:root][@params[:root].length-1].chr == "/") ? "" : "/"}"
|
215
|
-
href = "/" if @params[:root].length == 0
|
217
|
+
href = (@params[:root].length == 0) ? "/" : "#{@params[:root]}#{(@params[:root][@params[:root].length-1].chr == "/") ? "" : "/"}"
|
216
218
|
a = "<a "
|
217
219
|
name = args[0]
|
218
220
|
for i in 1...args.length
|
@@ -238,8 +240,7 @@ module Ink
|
|
238
240
|
# [param args:] Array of Strings or String
|
239
241
|
# [returns:] path
|
240
242
|
def path_to(*args)
|
241
|
-
href = "#{@params[:root]}#{(@params[:root][@params[:root].length-1].chr == "/") ? "" : "/"}"
|
242
|
-
href = "/" if @params[:root].length == 0
|
243
|
+
href = (@params[:root].length == 0) ? "/" : "#{@params[:root]}#{(@params[:root][@params[:root].length-1].chr == "/") ? "" : "/"}"
|
243
244
|
|
244
245
|
if args.is_a? Array
|
245
246
|
for i in 0...args.length
|
data/lib/webink/database.rb
CHANGED
@@ -39,14 +39,20 @@ module Ink
|
|
39
39
|
# This is the most basic query, it returns an Array of results,
|
40
40
|
# and each element contains a Hash of column_name => column_entry.
|
41
41
|
#
|
42
|
-
#
|
43
|
-
#
|
42
|
+
# The following methods are convenience methods to access data for
|
43
|
+
# models. As example a model Apple and its n:1 relation to Tree
|
44
|
+
# are used. Please note that both class and database table name can
|
45
|
+
# be used to call the find and related methods. The table name for
|
46
|
+
# Apple would be "apple"; for MyApple would be "my_apple".
|
47
|
+
#
|
48
|
+
# Ink::Database.database.find "apple", "WHERE id < 10 GROUP BY color"
|
49
|
+
# => self.query("SELECT * FROM apple WHERE id < 10 GROUP BY color;")
|
44
50
|
#
|
45
51
|
# This is different from the query method, because it returns an Array
|
46
52
|
# of Objects, created by the information stored in the database. So this
|
47
53
|
# find() will return you a set of Apple-instances.
|
48
54
|
#
|
49
|
-
# Ink::Database.database.find_union "apple", 5, "tree", ""
|
55
|
+
# Ink::Database.database.find_union "apple", 5, "tree", "AND tree_id>1"
|
50
56
|
#
|
51
57
|
# find_union allows you to retrieve data through a many_many reference.
|
52
58
|
# When you define a many_many relationship, a helper-table is created
|
@@ -56,16 +62,30 @@ module Ink
|
|
56
62
|
# by the alphabetically first, and then second classname. The last quotes
|
57
63
|
# allow additional query informations to be passed along (like group by)
|
58
64
|
#
|
59
|
-
# Ink::Database.database.
|
65
|
+
# Ink::Database.database.find_references Tree, 1, Apple, "AND tree_id>1"
|
60
66
|
#
|
61
|
-
#
|
67
|
+
# find_references is similar to find_union, only that it handles all
|
62
68
|
# other relationships. This statement above requires one Tree to have many
|
63
69
|
# Apples, so it will return an Array of Apples, all those that belong to
|
64
70
|
# the Tree with primary key 1
|
65
71
|
#
|
72
|
+
# Ink::Database.database.find_reference Apple, 5, Tree, ""
|
73
|
+
#
|
74
|
+
# find_reference is essentially equal to find_references, yet it returns
|
75
|
+
# one result of a Tree or nil. This is used when Apple-Tree is a many_one
|
76
|
+
# or one_one relationship. It saves the need for the result Array from
|
77
|
+
# find_references.
|
78
|
+
#
|
66
79
|
# Please close the dbinstance once you are done. This is automatically
|
67
80
|
# inserted in the init.rb of a project.
|
68
81
|
#
|
82
|
+
# == Convenience methods
|
83
|
+
#
|
84
|
+
# Database.format_date(Time.now)
|
85
|
+
#
|
86
|
+
# This will return a date in the form of 2012-11-20 10:00:02 and takes a Time
|
87
|
+
# instance.
|
88
|
+
#
|
69
89
|
#
|
70
90
|
#
|
71
91
|
class Database
|
data/lib/webink/model.rb
CHANGED
@@ -12,7 +12,7 @@ module Ink
|
|
12
12
|
# The constructor checks, if there are class methods 'fields'
|
13
13
|
# and 'foreign' defined. If that check is positive, it will
|
14
14
|
# match the parameter Hash to the fields, that are set for
|
15
|
-
# the database, and
|
15
|
+
# the database, and throw an exception if fields is lacking
|
16
16
|
# an entry (excluded the primary key). The other case just
|
17
17
|
# creates an Apple with the Hash as instance variables.
|
18
18
|
#
|
@@ -22,14 +22,12 @@ module Ink
|
|
22
22
|
# methods are automatically added for either the Hash, or
|
23
23
|
# the fields and foreign keys.
|
24
24
|
#
|
25
|
-
# apple.tree = nil
|
26
25
|
# apple.save
|
27
26
|
#
|
28
27
|
# You can save your apple by using the save method. New instances
|
29
28
|
# will create a new row in the database, and update its primary
|
30
|
-
# key. Old instances just update the fields. Relationships
|
31
|
-
#
|
32
|
-
# the save method will not touch relationships.
|
29
|
+
# key. Old instances just update the fields. Relationships are set
|
30
|
+
# to nil by default and will not be touched while nil.
|
33
31
|
#
|
34
32
|
# treeinstance.apple = [1,2,myapple]
|
35
33
|
# treeinstance.save
|
@@ -47,6 +45,13 @@ module Ink
|
|
47
45
|
# themselves, so you must fetch all related data, and delete them by
|
48
46
|
# 'hand' if you will.
|
49
47
|
#
|
48
|
+
# treeinstance.find_references Apple
|
49
|
+
#
|
50
|
+
# This convenience method finds all apples for this tree and makes
|
51
|
+
# them available in the accessor. If the Tree-Apple relationship is
|
52
|
+
# a *_one, then there is only one object in the accessor, otherwise
|
53
|
+
# an Array of objects.
|
54
|
+
#
|
50
55
|
#
|
51
56
|
# = Fields and foreign sample config
|
52
57
|
#
|
@@ -78,6 +83,37 @@ module Ink
|
|
78
83
|
# many_many, many_one]
|
79
84
|
# Obviously the Tree class requires a foreign with "Apple"
|
80
85
|
# mapped to "many_one" to match this schema.
|
86
|
+
#
|
87
|
+
# You can override the automatically generated getters and
|
88
|
+
# setters in any Model class you create by just redefining
|
89
|
+
# the methods.
|
90
|
+
#
|
91
|
+
# == Convenience methods
|
92
|
+
#
|
93
|
+
# self.primary_key
|
94
|
+
# self.foreign_key
|
95
|
+
#
|
96
|
+
# Both return an Array of length 2, where the second entry
|
97
|
+
# is the type and the first for primary_key is the name of
|
98
|
+
# the primary key (default "id"). The foreign_key has a
|
99
|
+
# combination of "classname"_"primary_key" (i.e. "apple_id")
|
100
|
+
#
|
101
|
+
# self.class_name
|
102
|
+
#
|
103
|
+
# Equivalent to class.name
|
104
|
+
#
|
105
|
+
# self.table_name
|
106
|
+
#
|
107
|
+
# Generates a table representation of the class. (Apple as
|
108
|
+
# "apple" and MyApple as "my_apple")
|
109
|
+
#
|
110
|
+
# self.str_to_classname(str)
|
111
|
+
#
|
112
|
+
# Converts a table name to class name. This method takes a string.
|
113
|
+
#
|
114
|
+
# self.str_to_tablename(str)
|
115
|
+
#
|
116
|
+
# Converts a class name to table name. This method takes a string.
|
81
117
|
#
|
82
118
|
#
|
83
119
|
#
|
@@ -93,7 +129,7 @@ module Ink
|
|
93
129
|
def initialize(data)
|
94
130
|
if self.class.respond_to? :fields
|
95
131
|
self.class.fields.each do |k,v|
|
96
|
-
raise NameError.new("Model cannot use #{k} as field, it
|
132
|
+
raise NameError.new("Model cannot use #{k} as field, it is blocked by primary key") if k.to_s.downcase == "pk"
|
97
133
|
raise LoadError.new("Model cannot be loaded, argument missing: #{k}") if not data.key?(k.to_s) and self.class.primary_key[0] != k
|
98
134
|
entry = nil
|
99
135
|
if data[k.to_s].nil?
|
@@ -107,21 +143,25 @@ module Ink
|
|
107
143
|
end
|
108
144
|
instance_variable_set("@#{k}", entry)
|
109
145
|
|
110
|
-
self.
|
111
|
-
|
146
|
+
if not self.respond_to? k
|
147
|
+
self.class.send(:define_method, k) do
|
148
|
+
instance_variable_get "@#{k}"
|
149
|
+
end
|
112
150
|
end
|
113
151
|
if self.class.primary_key[0] != k
|
114
|
-
self.
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
val
|
121
|
-
|
122
|
-
|
152
|
+
if not self.respond_to? "#{k}="
|
153
|
+
self.class.send(:define_method, "#{k}=") do |val|
|
154
|
+
if data[k.to_s].nil?
|
155
|
+
val = nil
|
156
|
+
elsif val.is_a? String
|
157
|
+
val = val.gsub(/'/, ''')
|
158
|
+
elsif val.is_a? Numeric
|
159
|
+
val = val
|
160
|
+
else
|
161
|
+
val = "\'#{val}\'"
|
162
|
+
end
|
163
|
+
instance_variable_set "@#{k}", val
|
123
164
|
end
|
124
|
-
instance_variable_set "@#{k}", val
|
125
165
|
end
|
126
166
|
else
|
127
167
|
self.class.send(:define_method, "pk") do
|
@@ -132,13 +172,15 @@ module Ink
|
|
132
172
|
if self.class.respond_to? :foreign
|
133
173
|
self.class.foreign.each do |k,v|
|
134
174
|
k_table = self.class.str_to_tablename(k)
|
135
|
-
raise NameError.new("Model cannot use #{k_table} as foreign, it already exists") if
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
175
|
+
raise NameError.new("Model cannot use #{k_table} as foreign, it already exists") if k_table == "pk"
|
176
|
+
if not self.respond_to? k_table
|
177
|
+
instance_variable_set("@#{k_table}", nil)
|
178
|
+
self.class.send(:define_method, k_table) do
|
179
|
+
instance_variable_get "@#{k_table}"
|
180
|
+
end
|
181
|
+
self.class.send(:define_method, "#{k_table}=") do |val|
|
182
|
+
instance_variable_set "@#{k_table}", val
|
183
|
+
end
|
142
184
|
end
|
143
185
|
end
|
144
186
|
end
|
@@ -186,7 +228,7 @@ module Ink
|
|
186
228
|
if pkvalue
|
187
229
|
response = Ink::Database.database.find self.class, pkvalue
|
188
230
|
if response.length == 1
|
189
|
-
Ink::Database.database.query "UPDATE #{self.class.table_name} SET #{string * ","} #{pkvalue}"
|
231
|
+
Ink::Database.database.query "UPDATE #{self.class.table_name} SET #{string * ","} #{pkvalue};"
|
190
232
|
elsif response.length == 0
|
191
233
|
Ink::Database.database.query "INSERT INTO #{self.class.table_name} (#{keystring * ","}) VALUES (#{valuestring * ","});"
|
192
234
|
pk = Ink::Database.database.last_inserted_pk(self.class)
|
@@ -219,7 +261,7 @@ module Ink
|
|
219
261
|
end
|
220
262
|
|
221
263
|
pkvalue = instance_variable_get "@#{self.class.primary_key[0]}"
|
222
|
-
Ink::Database.database.remove self.class.name, "WHERE `#{self.class.primary_key[0]}`=#{(pkvalue.is_a?(Numeric)) ? pkvalue : "\'#{pkvalue}\'"}
|
264
|
+
Ink::Database.database.remove self.class.name, "WHERE `#{self.class.primary_key[0]}`=#{(pkvalue.is_a?(Numeric)) ? pkvalue : "\'#{pkvalue}\'"}"
|
223
265
|
end
|
224
266
|
|
225
267
|
# Instance method
|
metadata
CHANGED
@@ -1,82 +1,85 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: webink
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.3
|
4
5
|
prerelease:
|
5
|
-
version: 1.3.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Matthias Geier
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-02-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: fcgi
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 0.8.8
|
24
22
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: simple-mmap
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
25
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.8.8
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: simple-mmap
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
34
37
|
version: 1.1.4
|
35
38
|
type: :runtime
|
36
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.1.4
|
37
46
|
description:
|
38
47
|
email:
|
39
|
-
executables:
|
48
|
+
executables:
|
40
49
|
- webink_database
|
41
50
|
- rfcgi
|
42
51
|
extensions: []
|
43
|
-
|
44
52
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
53
|
+
files:
|
47
54
|
- lib/webink.rb
|
48
|
-
- lib/webink/
|
55
|
+
- lib/webink/controller.rb
|
49
56
|
- lib/webink/database.rb
|
50
57
|
- lib/webink/beauty.rb
|
51
|
-
- lib/webink/
|
52
|
-
- bin/webink_database
|
58
|
+
- lib/webink/model.rb
|
53
59
|
- bin/rfcgi
|
60
|
+
- bin/webink_database
|
54
61
|
homepage: https://github.com/matthias-geier/WebInk
|
55
62
|
licenses: []
|
56
|
-
|
57
63
|
post_install_message:
|
58
64
|
rdoc_options: []
|
59
|
-
|
60
|
-
require_paths:
|
65
|
+
require_paths:
|
61
66
|
- lib
|
62
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
68
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
67
72
|
version: 1.9.3
|
68
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
74
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version:
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
74
79
|
requirements: []
|
75
|
-
|
76
80
|
rubyforge_project:
|
77
81
|
rubygems_version: 1.8.23
|
78
82
|
signing_key:
|
79
83
|
specification_version: 3
|
80
84
|
summary: A minimal web framework.
|
81
85
|
test_files: []
|
82
|
-
|