guacamole 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.hound.yml +3 -0
- data/{config/reek.yml → .reek.yml} +5 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +19 -0
- data/GOALS.md +20 -0
- data/Gemfile +1 -11
- data/Guardfile +0 -4
- data/README.md +147 -11
- data/Rakefile +33 -3
- data/guacamole.gemspec +12 -1
- data/lib/guacamole.rb +1 -0
- data/lib/guacamole/callbacks.rb +259 -0
- data/lib/guacamole/collection.rb +50 -32
- data/lib/guacamole/configuration.rb +92 -15
- data/lib/guacamole/model.rb +39 -1
- data/lib/guacamole/railtie.rb +9 -3
- data/lib/guacamole/version.rb +1 -1
- data/lib/rails/generators/guacamole/callbacks/callbacks_generator.rb +26 -0
- data/lib/rails/generators/guacamole/callbacks/templates/callbacks.rb.tt +13 -0
- data/lib/rails/generators/rspec/callbacks/callbacks_generator.rb +14 -0
- data/lib/rails/generators/rspec/callbacks/templates/callbacks_spec.rb.tt +7 -0
- data/lib/rails/generators/test_unit/callbacks/callbacks_generator.rb +13 -0
- data/lib/rails/generators/test_unit/callbacks/templates/callbacks_test.rb.tt +9 -0
- data/lib/rails/generators/test_unit/collection/collection_generator.rb +13 -0
- data/lib/rails/generators/test_unit/collection/templates/collection_test.rb.tt +10 -0
- data/spec/acceptance/aql_spec.rb +0 -12
- data/spec/acceptance/basic_spec.rb +16 -25
- data/spec/acceptance/callbacks_spec.rb +181 -0
- data/spec/acceptance/config/guacamole.yml +1 -1
- data/spec/acceptance/spec_helper.rb +24 -6
- data/spec/fabricators/article.rb +12 -0
- data/spec/fabricators/comment.rb +7 -0
- data/spec/fabricators/pony.rb +6 -4
- data/spec/fabricators/pony_fabricator.rb +7 -0
- data/spec/spec_helper.rb +5 -4
- data/spec/support/guacamole.yml.erb +5 -0
- data/spec/unit/callbacks_spec.rb +139 -0
- data/spec/unit/collection_spec.rb +85 -66
- data/spec/unit/configuration_spec.rb +165 -21
- data/spec/unit/identiy_map_spec.rb +2 -2
- data/spec/unit/model_spec.rb +36 -3
- metadata +181 -12
- data/Gemfile.devtools +0 -67
- data/config/devtools.yml +0 -4
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/mutant.yml +0 -3
- data/config/yardstick.yml +0 -2
- data/tasks/adjustments.rake +0 -34
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'rails/generators/guacamole_generator'
|
4
|
+
|
5
|
+
module TestUnit
|
6
|
+
module Generators
|
7
|
+
class CallbacksGenerator < ::Guacamole::Generators::Base
|
8
|
+
def create_test_file
|
9
|
+
template 'callbacks_test.rb.tt', File.join('test/callbacks', class_path, "#{file_name}_callbacks_test.rb")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'rails/generators/guacamole_generator'
|
4
|
+
|
5
|
+
module TestUnit
|
6
|
+
module Generators
|
7
|
+
class CollectionGenerator < ::Guacamole::Generators::Base
|
8
|
+
def create_test_file
|
9
|
+
template 'collection_test.rb.tt', File.join('test/collections', class_path, "#{file_name}_collection_test.rb")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/spec/acceptance/aql_spec.rb
CHANGED
@@ -3,18 +3,6 @@
|
|
3
3
|
require 'guacamole'
|
4
4
|
require 'acceptance/spec_helper'
|
5
5
|
|
6
|
-
class Pony
|
7
|
-
include Guacamole::Model
|
8
|
-
|
9
|
-
attribute :name, String
|
10
|
-
attribute :color, String
|
11
|
-
attribute :type, Array[String]
|
12
|
-
end
|
13
|
-
|
14
|
-
class PoniesCollection
|
15
|
-
include Guacamole::Collection
|
16
|
-
end
|
17
|
-
|
18
6
|
describe 'BasicAQLSupport' do
|
19
7
|
subject { PoniesCollection }
|
20
8
|
|
@@ -2,29 +2,6 @@
|
|
2
2
|
require 'guacamole'
|
3
3
|
require 'acceptance/spec_helper'
|
4
4
|
|
5
|
-
class Comment
|
6
|
-
include Guacamole::Model
|
7
|
-
|
8
|
-
attribute :text, String
|
9
|
-
end
|
10
|
-
|
11
|
-
class Article
|
12
|
-
include Guacamole::Model
|
13
|
-
|
14
|
-
attribute :title, String
|
15
|
-
attribute :comments, Array[Comment]
|
16
|
-
|
17
|
-
validates :title, presence: true
|
18
|
-
end
|
19
|
-
|
20
|
-
class ArticlesCollection
|
21
|
-
include Guacamole::Collection
|
22
|
-
|
23
|
-
map do
|
24
|
-
embeds :comments
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
5
|
describe 'ModelBasics' do
|
29
6
|
|
30
7
|
describe Article do
|
@@ -45,9 +22,9 @@ describe 'ModelBasics' do
|
|
45
22
|
end
|
46
23
|
|
47
24
|
it 'should validate its attributes' do
|
48
|
-
expect(subject.valid?).to
|
25
|
+
expect(subject.valid?).to be false
|
49
26
|
subject.title = 'The Legend of Zelda'
|
50
|
-
expect(subject.valid?).to
|
27
|
+
expect(subject.valid?).to be true
|
51
28
|
end
|
52
29
|
|
53
30
|
it 'should know its model name' do
|
@@ -100,6 +77,20 @@ describe 'CollectionBasics' do
|
|
100
77
|
expect(result.title).to eq 'Disturbed'
|
101
78
|
end
|
102
79
|
|
80
|
+
context 'delete documents' do
|
81
|
+
it 'should delete a document by key' do
|
82
|
+
deleted_key = subject.delete(some_article.key)
|
83
|
+
|
84
|
+
expect { subject.by_key(deleted_key) }.to raise_error(Ashikawa::Core::DocumentNotFoundException)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should delete a document by model' do
|
88
|
+
deleted_key = subject.delete(some_article)
|
89
|
+
|
90
|
+
expect { subject.by_key(deleted_key) }.to raise_error(Ashikawa::Core::DocumentNotFoundException)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
103
94
|
it 'should allow to nest models' do
|
104
95
|
article_with_comments = Fabricate(:article_with_two_comments)
|
105
96
|
found_article = subject.by_key(article_with_comments.key)
|
@@ -0,0 +1,181 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require 'guacamole'
|
4
|
+
require 'acceptance/spec_helper'
|
5
|
+
|
6
|
+
require 'bcrypt'
|
7
|
+
|
8
|
+
class SecurePonyCallbacks
|
9
|
+
include Guacamole::Callbacks
|
10
|
+
|
11
|
+
# Those will be triggered by the collection
|
12
|
+
before_create :encrypt_password
|
13
|
+
after_create :throw_welcome_party
|
14
|
+
around_create :log_create_time
|
15
|
+
|
16
|
+
# Those will be triggered by the model
|
17
|
+
before_validate :generate_token
|
18
|
+
after_validate :remove_safety_switch
|
19
|
+
around_validate :log_validate_time
|
20
|
+
|
21
|
+
def encrypt_password
|
22
|
+
object.encrypted_password = BCrypt::Password.create(object.password)
|
23
|
+
end
|
24
|
+
|
25
|
+
def throw_welcome_party
|
26
|
+
Party.throw!
|
27
|
+
end
|
28
|
+
|
29
|
+
def log_create_time
|
30
|
+
TimingLogger.log_time 'before_create'
|
31
|
+
yield
|
32
|
+
TimingLogger.log_time 'after_create'
|
33
|
+
end
|
34
|
+
|
35
|
+
def generate_token
|
36
|
+
object.token = SecureRandom.hex
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove_safety_switch
|
40
|
+
object.safety_switch = :removed
|
41
|
+
end
|
42
|
+
|
43
|
+
def log_validate_time
|
44
|
+
TimingLogger.log_time 'before_validate'
|
45
|
+
yield
|
46
|
+
TimingLogger.log_time 'after_validate'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class SecurePony
|
51
|
+
include Guacamole::Model
|
52
|
+
|
53
|
+
callbacks :secure_pony_callbacks
|
54
|
+
|
55
|
+
attribute :name, String
|
56
|
+
attribute :token, String
|
57
|
+
attribute :encrypted_password, String
|
58
|
+
|
59
|
+
# define a virtual attribute
|
60
|
+
attr_accessor :password, :safety_switch
|
61
|
+
end
|
62
|
+
|
63
|
+
class SecurePoniesCollection
|
64
|
+
include Guacamole::Collection
|
65
|
+
end
|
66
|
+
|
67
|
+
class Party
|
68
|
+
def self.throw!; end
|
69
|
+
end
|
70
|
+
|
71
|
+
class TimingLogger
|
72
|
+
def self.log_time(*args); end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'CallbacksSpec' do
|
76
|
+
subject { SecurePonyCallbacks }
|
77
|
+
|
78
|
+
let(:pinkie_pie) { SecurePony.new name: 'Pinkie Pie', password: 'cupcakes' }
|
79
|
+
|
80
|
+
before do
|
81
|
+
allow(TimingLogger).to receive(:log_time)
|
82
|
+
end
|
83
|
+
|
84
|
+
describe 'collection based callbacks' do
|
85
|
+
let(:collection) { SecurePoniesCollection }
|
86
|
+
|
87
|
+
it 'should fire the before create callback' do
|
88
|
+
collection.save pinkie_pie
|
89
|
+
|
90
|
+
expect(BCrypt::Password.new(pinkie_pie.encrypted_password)).to eq pinkie_pie.password
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should fire the after create callback' do
|
94
|
+
expect(Party).to receive(:throw!)
|
95
|
+
|
96
|
+
collection.save pinkie_pie
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should fire the around create callback' do
|
100
|
+
expect(TimingLogger).to receive(:log_time).with('before_create').ordered
|
101
|
+
expect(TimingLogger).to receive(:log_time).with('after_create').ordered
|
102
|
+
|
103
|
+
collection.save pinkie_pie
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'fill time stamp attributes' do
|
107
|
+
let(:past) { 'Oct 26 1955 01:21'.to_datetime }
|
108
|
+
let(:now) { 'Oct 26 1985 01:21'.to_datetime }
|
109
|
+
|
110
|
+
it 'should fill created_at and updated_at on create' do
|
111
|
+
Timecop.freeze(now) do
|
112
|
+
collection.save pinkie_pie
|
113
|
+
end
|
114
|
+
|
115
|
+
expect(pinkie_pie.created_at).to eq now
|
116
|
+
expect(pinkie_pie.updated_at).to eq now
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should update updated_at on update' do
|
120
|
+
collection.save pinkie_pie
|
121
|
+
pinkie_pie.name = 'Pinkie Pie - Updated'
|
122
|
+
|
123
|
+
Timecop.freeze(now) do
|
124
|
+
collection.save pinkie_pie
|
125
|
+
end
|
126
|
+
|
127
|
+
expect(pinkie_pie.updated_at).to eq now
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'with the default callback' do
|
131
|
+
let(:pinkie_pie) { Fabricate.build(:pony, name: 'Pinkie Pie') }
|
132
|
+
let(:collection) { PoniesCollection }
|
133
|
+
|
134
|
+
it 'should fill created_at and updated_at on create' do
|
135
|
+
Timecop.freeze(now) do
|
136
|
+
collection.save pinkie_pie
|
137
|
+
end
|
138
|
+
|
139
|
+
expect(pinkie_pie.created_at).to eq now
|
140
|
+
expect(pinkie_pie.updated_at).to eq now
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should update updated_at on update' do
|
144
|
+
Timecop.freeze(past) do
|
145
|
+
collection.save pinkie_pie
|
146
|
+
end
|
147
|
+
|
148
|
+
pinkie_pie.color = 'pink'
|
149
|
+
|
150
|
+
Timecop.freeze(now) do
|
151
|
+
collection.save pinkie_pie
|
152
|
+
end
|
153
|
+
|
154
|
+
expect(pinkie_pie.created_at).to eq past
|
155
|
+
expect(pinkie_pie.updated_at).to eq now
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe 'model based callbacks' do
|
162
|
+
it 'should fire the before validate callback' do
|
163
|
+
pinkie_pie.valid?
|
164
|
+
|
165
|
+
expect(pinkie_pie.token).not_to be_nil
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'should fire the after validate callback' do
|
169
|
+
pinkie_pie.valid?
|
170
|
+
|
171
|
+
expect(pinkie_pie.safety_switch).to be_truthy
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'should fire the around validate callback' do
|
175
|
+
expect(TimingLogger).to receive(:log_time).with('before_validate')
|
176
|
+
expect(TimingLogger).to receive(:log_time).with('after_validate')
|
177
|
+
|
178
|
+
pinkie_pie.valid?
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -8,12 +8,8 @@ require 'fabrication'
|
|
8
8
|
require 'faker'
|
9
9
|
require 'logging'
|
10
10
|
require 'ashikawa-core'
|
11
|
-
|
12
|
-
|
13
|
-
require 'debugger'
|
14
|
-
rescue LoadError
|
15
|
-
puts "Debugger is not available. Maybe you're Travis."
|
16
|
-
end
|
11
|
+
require 'pry'
|
12
|
+
require 'timecop'
|
17
13
|
|
18
14
|
# This is required to remove the deprecation warning introduced in this commit:
|
19
15
|
# https://github.com/svenfuchs/i18n/commit/3b6e56e06fd70f6e4507996b017238505e66608c.
|
@@ -50,6 +46,12 @@ Guacamole.configure do |config|
|
|
50
46
|
config.load File.join(File.dirname(__FILE__), 'config', 'guacamole.yml')
|
51
47
|
end
|
52
48
|
|
49
|
+
begin
|
50
|
+
Guacamole.configuration.database.create
|
51
|
+
rescue Ashikawa::Core::ClientError
|
52
|
+
# Database already exists, don't worry
|
53
|
+
end
|
54
|
+
|
53
55
|
RSpec.configure do |config|
|
54
56
|
config.expect_with :rspec do |c|
|
55
57
|
c.syntax = :expect
|
@@ -63,3 +65,19 @@ RSpec.configure do |config|
|
|
63
65
|
Guacamole.configuration.database.truncate
|
64
66
|
end
|
65
67
|
end
|
68
|
+
|
69
|
+
# Collections for fabricator models
|
70
|
+
|
71
|
+
require 'fabricators/article'
|
72
|
+
|
73
|
+
class ArticlesCollection
|
74
|
+
include Guacamole::Collection
|
75
|
+
|
76
|
+
map do
|
77
|
+
embeds :comments
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class PoniesCollection
|
82
|
+
include Guacamole::Collection
|
83
|
+
end
|
data/spec/fabricators/pony.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
class Pony
|
4
|
+
include Guacamole::Model
|
5
|
+
|
6
|
+
attribute :name, String
|
7
|
+
attribute :color, String
|
8
|
+
attribute :type, Array[String]
|
7
9
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,12 +2,13 @@
|
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
3
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
4
|
|
5
|
-
|
6
|
-
require '
|
7
|
-
|
8
|
-
puts "Debugger is not available. Maybe you're Travis."
|
5
|
+
if ENV['CODECLIMATE_REPO_TOKEN']
|
6
|
+
require 'codeclimate-test-reporter'
|
7
|
+
CodeClimate::TestReporter.start
|
9
8
|
end
|
10
9
|
|
10
|
+
require 'rspec/its'
|
11
|
+
|
11
12
|
RSpec.configure do |config|
|
12
13
|
config.expect_with :rspec do |c|
|
13
14
|
c.syntax = :expect
|