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 CHANGED
@@ -1,4 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in sentiql.gemspec
4
- gemspec
4
+ gem 'mysql2', '<0.3.0'
@@ -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 don't like using ActiveRecord or other fat ORMs because I think they are breaking following rules:
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
@@ -2,6 +2,7 @@ require 'bundler'
2
2
  require 'yaml'
3
3
  require 'logger'
4
4
  require 'active_record'
5
+ require 'mysql2'
5
6
 
6
7
  Bundler::GemHelper.install_tasks
7
8
 
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module SentiQL
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -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
- prerelease: false
5
- segments:
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
- prerelease: false
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
- segments:
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- segments:
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- segments:
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
- requirement: &id004 !ruby/object:Gem::Requirement
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
- version_requirements: *id004
75
- description: This is a work in progress. SentiQL promotes use of SQL for data selection, OM for CUD operations and being as lean as possible.
76
- email:
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
- segments:
111
- - 0
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
- segments:
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.3.7
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
-