sentiql 0.3.1 → 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.
- data/Gemfile +1 -1
- data/README.rdoc +6 -5
- data/Rakefile +1 -0
- data/lib/sentiql.rb +12 -0
- data/lib/sentiql/version.rb +1 -1
- data/spec/sentiql_spec.rb +36 -0
- metadata +53 -79
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
A minimalistic Ruby wrapper for MySQL. I love using SQL for data selection, except for basic selects (e.g. finding something by id), I love using OM interface to create, update and delete records in the database and I love when lib is not "overcoded". When you combine all this love, you get SentiQL.
|
3
3
|
|
4
4
|
== Why SentiQL
|
5
|
-
I
|
5
|
+
I wanted to have a lightweight OM for my Sinatras' apps, that wouldn't add a thick abstraction layer and would allow me to be flexible.
|
6
|
+
|
7
|
+
== SentiQL Philosophy
|
6
8
|
1. "Make everything as simple as possible, but not simpler" - Albert Einstein.
|
7
9
|
2. Rule of Clarity. Clarity is better than cleverness. (Unix Philosophy)
|
8
10
|
3. Rule of Simplicity: Design for simplicity; add complexity only where you must. (Unix Philosophy)
|
9
11
|
|
10
|
-
Plus. I think it is wrong to put a thick abstraction layer on one of the biggest web application's performance bottlenecks.
|
11
|
-
|
12
12
|
== Notice
|
13
13
|
This is REALY a work in progress, I wrote this lib during one evening after reading "Metaprogramming Ruby: Program Like a Ruby Pros". It is less then 140 LOCs, so even if it is missing one or other thing, just open the sentiql.rb file and happy hacking.
|
14
14
|
|
@@ -76,6 +76,8 @@ This is REALY a work in progress, I wrote this lib during one evening after read
|
|
76
76
|
before_save :create_salt, :encrypt_password,
|
77
77
|
after_create :download_profile_image
|
78
78
|
|
79
|
+
|
80
|
+
Plus. I think it is wrong to put a thick abstraction layer on one of the biggest web application's performance bottlenecks.
|
79
81
|
protected
|
80
82
|
|
81
83
|
def create_salt
|
@@ -99,8 +101,7 @@ This is REALY a work in progress, I wrote this lib during one evening after read
|
|
99
101
|
|
100
102
|
def name_not_blank?
|
101
103
|
if self[:name] == "" || self[:name].nil?
|
102
|
-
@errors << "Name can't
|
103
|
-
be blank"
|
104
|
+
@errors << "Name can't be blank"
|
104
105
|
return false
|
105
106
|
end
|
106
107
|
return true
|
data/Rakefile
CHANGED
data/lib/sentiql.rb
CHANGED
@@ -41,7 +41,9 @@ module SentiQL
|
|
41
41
|
values = i.keys.map { |k| @attrs[k] }
|
42
42
|
values << @attrs[:id]
|
43
43
|
|
44
|
+
filter_with :before_validation_filters
|
44
45
|
return self unless valid?
|
46
|
+
filter_with :after_validation_filters
|
45
47
|
|
46
48
|
|
47
49
|
SentiQL::Base.execute "UPDATE #{self.class.table} SET #{i.keys.map{|m| "#{m.to_s}=?"}.join(",")} WHERE id=?", values
|
@@ -56,7 +58,9 @@ module SentiQL
|
|
56
58
|
i = @attrs.select { |k| self.class.schema.include?(k) }
|
57
59
|
values = i.keys.map { |k| @attrs[k] }
|
58
60
|
|
61
|
+
filter_with :before_validation_filters
|
59
62
|
return self unless valid?
|
63
|
+
filter_with :after_validation_filters
|
60
64
|
|
61
65
|
id = SentiQL::Base.insert "INSERT INTO #{self.class.table} (#{i.keys.map{|k| k.to_s}.join(",")}) VALUES (#{i.map{|k| k="?"}.join(",")})", values
|
62
66
|
@attrs[:id] = id
|
@@ -84,6 +88,7 @@ module SentiQL
|
|
84
88
|
end
|
85
89
|
|
86
90
|
def validate; end
|
91
|
+
|
87
92
|
def valid?
|
88
93
|
@errors = []
|
89
94
|
validate
|
@@ -101,11 +106,18 @@ module SentiQL
|
|
101
106
|
def before_save_filters; @before_save_filters ||={} ; end
|
102
107
|
def before_create *args; @before_create_filters = args; end
|
103
108
|
def before_create_filters; @before_create_filters ||={}; end
|
109
|
+
|
110
|
+
def before_validation *args; @before_validation_filters = args; end
|
111
|
+
def before_validation_filters; @before_validation_filters ||={}; end
|
112
|
+
|
104
113
|
def after_create *args; @after_create_filters = args; end
|
105
114
|
def after_create_filters; @after_create_filters ||={}; end
|
106
115
|
def after_save *args; @after_save_filters= args; end
|
107
116
|
def after_save_filters; @after_save_filters ||={}; end
|
108
117
|
|
118
|
+
def after_validation *args; @after_validation_filters = args; end
|
119
|
+
def after_validation_filters; @after_validation_filters ||={}; end
|
120
|
+
|
109
121
|
def set_table name; @table= name.to_s; end
|
110
122
|
def table; @table.to_sym; end
|
111
123
|
|
data/lib/sentiql/version.rb
CHANGED
data/spec/sentiql_spec.rb
CHANGED
@@ -47,6 +47,20 @@ class User < SentiQL::Base
|
|
47
47
|
before_create :touch_before_create
|
48
48
|
after_create :touch_after_create
|
49
49
|
after_save :touch_after_save
|
50
|
+
before_validation :touch_before_validation
|
51
|
+
after_validation :touch_after_validation
|
52
|
+
|
53
|
+
def validate
|
54
|
+
name_not_blank?
|
55
|
+
end
|
56
|
+
|
57
|
+
def name_not_blank?
|
58
|
+
if self[:name].blank?
|
59
|
+
errors << "Name can't be blank"
|
60
|
+
return false
|
61
|
+
end
|
62
|
+
return true
|
63
|
+
end
|
50
64
|
|
51
65
|
class << self
|
52
66
|
|
@@ -75,6 +89,14 @@ class User < SentiQL::Base
|
|
75
89
|
self[:after_save_touched] = Time.now
|
76
90
|
end
|
77
91
|
|
92
|
+
def touch_before_validation
|
93
|
+
self[:before_validation_touched] = Time.now
|
94
|
+
end
|
95
|
+
|
96
|
+
def touch_after_validation
|
97
|
+
self[:after_validation_touched] = Time.now
|
98
|
+
end
|
99
|
+
|
78
100
|
end
|
79
101
|
|
80
102
|
|
@@ -203,6 +225,20 @@ describe SentiQL::Base do
|
|
203
225
|
sleep(1)
|
204
226
|
lambda { u.save }.should_not change(u, :before_create_touched)
|
205
227
|
end
|
228
|
+
|
229
|
+
it "executes before_validation filters even if record is not valid" do
|
230
|
+
u = User.new :before_validation_touched=>Time.now
|
231
|
+
lambda { u.save }.should change(u, :before_validation_touched)
|
232
|
+
end
|
233
|
+
|
234
|
+
it "executes after_validation filters after record only if record validates" do
|
235
|
+
u = User.new :after_validation_touched=>Time.now
|
236
|
+
sleep(1)
|
237
|
+
lambda { u.save }.should_not change(u, :after_validation_touched)
|
238
|
+
u[:name] = 'Natalie'
|
239
|
+
sleep(1)
|
240
|
+
lambda { u.save }.should change(u, :after_validation_touched)
|
241
|
+
end
|
206
242
|
|
207
243
|
it "executes after_create filters only after record is created" do
|
208
244
|
u = User.new :name=>'Natalie'
|
metadata
CHANGED
@@ -1,87 +1,69 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sentiql
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 3
|
8
|
-
- 1
|
9
|
-
version: 0.3.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Martynas Miliauskas
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2011-05-28 00:00:00 +01:00
|
12
|
+
date: 2011-07-23 00:00:00.000000000 +01:00
|
18
13
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
21
16
|
name: mysql2
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &77535290 !ruby/object:Gem::Requirement
|
24
18
|
none: false
|
25
|
-
requirements:
|
19
|
+
requirements:
|
26
20
|
- - <
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 0
|
30
|
-
- 3
|
31
|
-
version: "0.3"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.3'
|
32
23
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: rspec
|
36
24
|
prerelease: false
|
37
|
-
|
25
|
+
version_requirements: *77535290
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &77535070 !ruby/object:Gem::Requirement
|
38
29
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
- 0
|
44
|
-
version: "0"
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
45
34
|
type: :development
|
46
|
-
version_requirements: *id002
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: database_cleaner
|
49
35
|
prerelease: false
|
50
|
-
|
36
|
+
version_requirements: *77535070
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: database_cleaner
|
39
|
+
requirement: &77534840 !ruby/object:Gem::Requirement
|
51
40
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
- 0
|
57
|
-
version: "0"
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
58
45
|
type: :development
|
59
|
-
version_requirements: *id003
|
60
|
-
- !ruby/object:Gem::Dependency
|
61
|
-
name: activerecord
|
62
46
|
prerelease: false
|
63
|
-
|
47
|
+
version_requirements: *77534840
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: activerecord
|
50
|
+
requirement: &77534580 !ruby/object:Gem::Requirement
|
64
51
|
none: false
|
65
|
-
requirements:
|
52
|
+
requirements:
|
66
53
|
- - ~>
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
segments:
|
69
|
-
- 3
|
70
|
-
- 0
|
71
|
-
- 5
|
54
|
+
- !ruby/object:Gem::Version
|
72
55
|
version: 3.0.5
|
73
56
|
type: :development
|
74
|
-
|
75
|
-
|
76
|
-
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *77534580
|
59
|
+
description: This is a work in progress. SentiQL promotes use of SQL for data selection,
|
60
|
+
OM for CUD operations and being as lean as possible.
|
61
|
+
email:
|
77
62
|
- miliauskas@facebook.com
|
78
63
|
executables: []
|
79
|
-
|
80
64
|
extensions: []
|
81
|
-
|
82
65
|
extra_rdoc_files: []
|
83
|
-
|
84
|
-
files:
|
66
|
+
files:
|
85
67
|
- .gitignore
|
86
68
|
- Gemfile
|
87
69
|
- README.rdoc
|
@@ -94,36 +76,28 @@ files:
|
|
94
76
|
- spec/sentiql_spec.rb
|
95
77
|
- spec/spec_helper.rb
|
96
78
|
has_rdoc: true
|
97
|
-
homepage:
|
79
|
+
homepage: ''
|
98
80
|
licenses: []
|
99
|
-
|
100
81
|
post_install_message:
|
101
82
|
rdoc_options: []
|
102
|
-
|
103
|
-
require_paths:
|
83
|
+
require_paths:
|
104
84
|
- lib
|
105
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
86
|
none: false
|
107
|
-
requirements:
|
108
|
-
- -
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
|
111
|
-
|
112
|
-
version: "0"
|
113
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
92
|
none: false
|
115
|
-
requirements:
|
116
|
-
- -
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
|
119
|
-
- 0
|
120
|
-
version: "0"
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
121
97
|
requirements: []
|
122
|
-
|
123
98
|
rubyforge_project: sentiql
|
124
|
-
rubygems_version: 1.
|
99
|
+
rubygems_version: 1.6.2
|
125
100
|
signing_key:
|
126
101
|
specification_version: 3
|
127
102
|
summary: A minimalistic Ruby wrapper for MySQL
|
128
103
|
test_files: []
|
129
|
-
|