delta_test 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +32 -0
- data/README.md +63 -14
- data/Rakefile +16 -3
- data/circle.yml +8 -1
- data/delta_test.gemspec +4 -3
- data/ext/delta_test/delta_test_native.c +154 -0
- data/ext/delta_test/delta_test_native.h +15 -0
- data/ext/delta_test/extconf.rb +12 -0
- data/lib/delta_test.rb +8 -2
- data/lib/delta_test/cli.rb +108 -21
- data/lib/delta_test/configuration.rb +91 -35
- data/lib/delta_test/dependencies_table.rb +15 -1
- data/lib/delta_test/generator.rb +42 -29
- data/lib/delta_test/profiler.rb +5 -0
- data/lib/delta_test/related_spec_list.rb +67 -8
- data/lib/delta_test/spec_helpers.rb +9 -7
- data/lib/delta_test/version.rb +1 -1
- data/spec/lib/delta_test/cli_spec.rb +26 -5
- data/spec/lib/delta_test/configuration_spec.rb +12 -0
- data/spec/lib/delta_test/dependencies_table_spec.rb +35 -0
- data/spec/lib/delta_test/generator_spec.rb +34 -17
- data/spec/lib/delta_test/profiler_spec.rb +121 -0
- data/spec/lib/delta_test/related_spec_list_spec.rb +150 -34
- data/spec/lib/delta_test/spec_helpers_spec.rb +11 -5
- data/spec/rails/Gemfile +8 -2
- data/spec/rails/Gemfile.lock +37 -3
- data/spec/rails/app/models/category.rb +14 -0
- data/spec/rails/app/models/comment.rb +20 -0
- data/spec/rails/app/models/post.rb +23 -0
- data/spec/rails/app/models/post_categorizing.rb +14 -0
- data/spec/rails/app/models/user.rb +15 -0
- data/spec/rails/db/migrate/20150518052022_create_users.rb +9 -0
- data/spec/rails/db/migrate/20150518052057_create_posts.rb +11 -0
- data/spec/rails/db/migrate/20150518052332_create_comments.rb +11 -0
- data/spec/rails/db/migrate/20150518052523_create_categories.rb +9 -0
- data/spec/rails/db/migrate/20150518052604_create_post_categorizings.rb +10 -0
- data/spec/rails/db/schema.rb +59 -0
- data/spec/rails/spec/factories/categories.rb +5 -0
- data/spec/rails/spec/factories/comments.rb +8 -0
- data/spec/rails/spec/factories/post_categorizings.rb +6 -0
- data/spec/rails/spec/factories/posts.rb +7 -0
- data/spec/rails/spec/factories/users.rb +5 -0
- data/spec/rails/spec/models/category_spec.rb +3 -0
- data/spec/rails/spec/models/comment_spec.rb +3 -0
- data/spec/rails/spec/models/post_categorizing_spec.rb +3 -0
- data/spec/rails/spec/models/post_spec.rb +3 -0
- data/spec/rails/spec/models/user_spec.rb +20 -0
- data/spec/rails/spec/spec_helper.rb +53 -9
- data/spec/spec_helper.rb +2 -0
- metadata +79 -19
- data/lib/delta_test/analyzer.rb +0 -47
- data/spec/lib/delta_test/analyzer_spec.rb +0 -126
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94f59b2f95b133bb72a50361d428a93ac6f62c23
|
4
|
+
data.tar.gz: 97c3fee8fcbafa082f24e21bfcb8aada5d251834
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 639090edc53958e9aa7ced6cd476d1c5f974c4e1a6e84ec92bdfebace65d12f9e444535cdffb9145d2edc775d8cd6b46f42ea7807d0119d001d22fd875f11aaa
|
7
|
+
data.tar.gz: 3383686308e0d32881943b213a33b86adc4bbff700275c2a24f9ec97a9e3b03e490af7ddebbc41d7f28f81564813ae4be5e00582d77b58034af6839c5880e8b0
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Change logs
|
2
|
+
===========
|
3
|
+
|
4
|
+
master
|
5
|
+
------
|
6
|
+
|
7
|
+
N/A
|
8
|
+
|
9
|
+
|
10
|
+
0.2.0
|
11
|
+
-----
|
12
|
+
|
13
|
+
- [dev] #1 Setup CircleCI. and others
|
14
|
+
- [dev] #2 Add codeclimate
|
15
|
+
- [dev] #3 Fix bundle install command in rails directory. and others
|
16
|
+
- [bugfix] #4 Use hook scope names of rspec v2
|
17
|
+
- [bugfix] #8 Exit with real status
|
18
|
+
- [bugfix] #9 Fail to obtain current spec file path with RSpec 2
|
19
|
+
- [improvement] #12 Use original profiler
|
20
|
+
- [improvement] #14 Improve profiler
|
21
|
+
- [improvement] #15 Fully support parallel_tests
|
22
|
+
- [improvement] #19 Auto bundle exec
|
23
|
+
- [feature] #20 Run full tests
|
24
|
+
- [feature] #21 Add clear command
|
25
|
+
|
26
|
+
And many bugfixes and refactorings.
|
27
|
+
|
28
|
+
|
29
|
+
0.1.0
|
30
|
+
-----
|
31
|
+
|
32
|
+
- The first release
|
data/README.md
CHANGED
@@ -1,7 +1,19 @@
|
|
1
|
-
|
1
|
+
:warning: **currently in development**
|
2
|
+
|
3
|
+
delta_test
|
2
4
|
==========
|
3
5
|
|
4
|
-
|
6
|
+
[](https://circleci.com/gh/creasty/delta_test)
|
7
|
+
[](https://codeclimate.com/github/creasty/delta_test)
|
8
|
+
[](https://codeclimate.com/github/creasty/delta_test/coverage)
|
9
|
+
|
10
|
+
**It's kinda "[delta update](http://en.wikipedia.org/wiki/Delta_update)" for RSpec.**
|
11
|
+
|
12
|
+
It basically do two things:
|
13
|
+
|
14
|
+
1. Analyzes your tests and creates a dependencies table
|
15
|
+
2. Based on the dependencies table and git diff,
|
16
|
+
only runs partial specs that are considered to be related to the file changes.
|
5
17
|
|
6
18
|
|
7
19
|
Setup
|
@@ -48,19 +60,19 @@ end
|
|
48
60
|
Usage
|
49
61
|
-----
|
50
62
|
|
51
|
-
|
63
|
+
For the first time and whenever on master, it'll run full test cases to create **dependencies table**:
|
52
64
|
|
53
65
|
```bash
|
54
66
|
$ git checkout master
|
55
|
-
$ delta_test exec
|
67
|
+
$ delta_test exec rspec
|
56
68
|
```
|
57
69
|
|
58
|
-
|
70
|
+
And on other branch, it'll run only related tests for your changes from master:
|
59
71
|
|
60
72
|
```bash
|
61
73
|
$ git checkout -b feature/something_awesome
|
62
74
|
$ # Make changes & create commits...
|
63
|
-
$ delta_test exec
|
75
|
+
$ delta_test exec rspec
|
64
76
|
```
|
65
77
|
|
66
78
|
|
@@ -71,7 +83,7 @@ Advanced usage
|
|
71
83
|
|
72
84
|
```
|
73
85
|
usage: delta_test <command> [--base=<base>] [--head=<head>] [--verbose] [<args>]
|
74
|
-
[-v]
|
86
|
+
[-v|--version]
|
75
87
|
|
76
88
|
options:
|
77
89
|
--base=<base> A branch or a commit id to diff from.
|
@@ -90,8 +102,46 @@ commands:
|
|
90
102
|
|
91
103
|
table Show dependencies table.
|
92
104
|
|
93
|
-
exec <script>
|
94
|
-
|
105
|
+
exec <script> [-- <files>]
|
106
|
+
Execute test script using delta_test.
|
107
|
+
if <base> and <head> is the same commit or no dependencies table is found,
|
108
|
+
it'll run full test cases with a profile mode to create a table.
|
109
|
+
Otherwise, it'll run test script with only related spec files
|
110
|
+
passed by its arguments, like `delta_test list | xargs script'.
|
111
|
+
|
112
|
+
clear Clean up tables and caches.
|
113
|
+
```
|
114
|
+
|
115
|
+
#### `exec` example
|
116
|
+
|
117
|
+
RSpec command is rewritten to:
|
118
|
+
|
119
|
+
```bash
|
120
|
+
$ bundle exec rspec
|
121
|
+
↓
|
122
|
+
$ bundle exec delta_test exec rspec
|
123
|
+
```
|
124
|
+
|
125
|
+
With file lists:
|
126
|
+
|
127
|
+
```bash
|
128
|
+
$ bundle exec rspec spec/{models,controllers}
|
129
|
+
↓
|
130
|
+
$ bundle exec delta_test exec rspec -- spec/{models,controllers}
|
131
|
+
```
|
132
|
+
|
133
|
+
And to colorize RSpec outputs, use `--tty` option of `rspec` command:
|
134
|
+
|
135
|
+
```bash
|
136
|
+
$ bundle exec delta_test exec rspec --tty
|
137
|
+
```
|
138
|
+
|
139
|
+
Also delta_test supports [parallel_tests](https://github.com/grosser/parallel_tests):
|
140
|
+
|
141
|
+
```bash
|
142
|
+
$ bundle exec parallel_test -t rspec -n 4 spec/features
|
143
|
+
↓
|
144
|
+
$ bundle exec delta_test exec parallel_test -t rspec -n 4 -- spec/features
|
95
145
|
```
|
96
146
|
|
97
147
|
### Configurations
|
@@ -106,6 +156,9 @@ patterns:
|
|
106
156
|
exclude_patterns:
|
107
157
|
- lib/batch/*.rb
|
108
158
|
|
159
|
+
full_test_patterns:
|
160
|
+
- Gemfile.lock
|
161
|
+
|
109
162
|
custom_mappings:
|
110
163
|
spec/features/i18n_spec.rb:
|
111
164
|
- config/locales/**/*.yml
|
@@ -118,11 +171,7 @@ Testing
|
|
118
171
|
Run units tests:
|
119
172
|
|
120
173
|
```bash
|
121
|
-
$ rspec
|
122
|
-
|
123
|
-
# or
|
124
|
-
|
125
|
-
$ rake test
|
174
|
+
$ rake test # or you can use `rspec`
|
126
175
|
```
|
127
176
|
|
128
177
|
Run integration tests:
|
data/Rakefile
CHANGED
@@ -1,16 +1,29 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/extensiontask'
|
3
|
+
|
4
|
+
GEM_NAME = 'delta_test'
|
5
|
+
SO_NAME = 'delta_test_native'
|
6
|
+
|
7
|
+
Rake::ExtensionTask.new SO_NAME do |ext|
|
8
|
+
ext.ext_dir = "ext/#{GEM_NAME}"
|
9
|
+
ext.lib_dir = "lib/#{RUBY_VERSION.sub(/\.\d$/, '')}"
|
10
|
+
ext.cross_compile = true
|
11
|
+
ext.cross_platform = ['x86-mswin32-60', 'x86-mingw32-60']
|
12
|
+
end
|
2
13
|
|
3
14
|
desc 'Run unit tests'
|
4
15
|
task :test do
|
5
16
|
s = system('bundle exec rspec')
|
6
|
-
exit unless s
|
17
|
+
exit $? unless s
|
7
18
|
end
|
8
19
|
|
9
20
|
namespace :rails do
|
10
21
|
desc 'Run rails tests'
|
11
22
|
task :test do
|
12
|
-
|
13
|
-
|
23
|
+
Bundler.with_clean_env do
|
24
|
+
s = system('cd spec/rails && DELTA_TEST_ACTIVE=true DELTA_TEST_VERBOSE=true bundle exec rspec')
|
25
|
+
exit $? unless s
|
26
|
+
end
|
14
27
|
end
|
15
28
|
end
|
16
29
|
|
data/circle.yml
CHANGED
@@ -3,8 +3,15 @@ machine:
|
|
3
3
|
version: 2.2.0
|
4
4
|
|
5
5
|
dependencies:
|
6
|
+
cache_directories:
|
7
|
+
- spec/rails/vendor/bundle
|
6
8
|
post:
|
7
|
-
- cd spec/rails && bundle install
|
9
|
+
- cd spec/rails && (bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3)
|
10
|
+
- bundle exec rake compile
|
11
|
+
|
12
|
+
database:
|
13
|
+
override:
|
14
|
+
- cd spec/rails && bundle exec rake db:test:prepare
|
8
15
|
|
9
16
|
test:
|
10
17
|
override:
|
data/delta_test.gemspec
CHANGED
@@ -8,23 +8,24 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = DeltaTest::VERSION
|
9
9
|
spec.authors = ['Yuki Iwanaga']
|
10
10
|
spec.email = ['yuki@creasty.com']
|
11
|
-
spec.summary = %q{
|
11
|
+
spec.summary = %q{It's kinda "delta update" for RSpec}
|
12
12
|
spec.description = %q{delta_test analyzes your tests and runs only related tests for your file changes}
|
13
13
|
spec.homepage = 'http://github.com/creasty/delta_test'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.extensions = ['ext/delta_test/extconf.rb']
|
18
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
20
|
spec.require_paths = ['lib']
|
20
21
|
|
21
22
|
spec.required_ruby_version = '>= 2.0.0'
|
22
23
|
|
23
|
-
spec.add_dependency 'ruby-prof'
|
24
|
-
|
25
24
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
25
|
+
spec.add_development_dependency 'codeclimate-test-reporter'
|
26
26
|
spec.add_development_dependency 'fakefs'
|
27
27
|
spec.add_development_dependency 'pry'
|
28
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
29
|
+
spec.add_development_dependency 'rake-compiler'
|
29
30
|
spec.add_development_dependency 'rspec', '>= 3.0'
|
30
31
|
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdbool.h>
|
3
|
+
|
4
|
+
#include "delta_test_native.h"
|
5
|
+
|
6
|
+
static VALUE mDeltaTest;
|
7
|
+
static VALUE mProfiler;
|
8
|
+
|
9
|
+
static dt_profiler_t *profile;
|
10
|
+
|
11
|
+
|
12
|
+
/*=== Helpers
|
13
|
+
==============================================================================================*/
|
14
|
+
static void
|
15
|
+
dt_profiler_event_hook(rb_event_flag_t event, VALUE data, VALUE self, ID mid, VALUE klass)
|
16
|
+
{
|
17
|
+
if (self == mDeltaTest || klass == mProfiler) {
|
18
|
+
return;
|
19
|
+
}
|
20
|
+
|
21
|
+
st_insert(profile->file_table, (st_data_t)rb_sourcefile(), Qtrue);
|
22
|
+
}
|
23
|
+
|
24
|
+
static void
|
25
|
+
dt_profiler_install_hook(VALUE self)
|
26
|
+
{
|
27
|
+
rb_add_event_hook(dt_profiler_event_hook, RUBY_EVENT_CALL, self);
|
28
|
+
}
|
29
|
+
|
30
|
+
static void
|
31
|
+
dt_profiler_uninstall_hook()
|
32
|
+
{
|
33
|
+
rb_remove_event_hook(dt_profiler_event_hook);
|
34
|
+
}
|
35
|
+
|
36
|
+
|
37
|
+
/*=== Initialize
|
38
|
+
==============================================================================================*/
|
39
|
+
static void
|
40
|
+
dt_profiler_init()
|
41
|
+
{
|
42
|
+
profile = (dt_profiler_t *)malloc(sizeof(dt_profiler_t));
|
43
|
+
|
44
|
+
profile->running = Qfalse;
|
45
|
+
profile->file_table = st_init_strtable();
|
46
|
+
}
|
47
|
+
|
48
|
+
|
49
|
+
/*=== Class methods
|
50
|
+
==============================================================================================*/
|
51
|
+
/**
|
52
|
+
* .clean! -> self
|
53
|
+
*
|
54
|
+
* Uninstalls event hook
|
55
|
+
*/
|
56
|
+
static VALUE
|
57
|
+
dt_profiler_clean(VALUE self)
|
58
|
+
{
|
59
|
+
st_clear(profile->file_table);
|
60
|
+
|
61
|
+
profile->running = Qfalse;
|
62
|
+
dt_profiler_uninstall_hook();
|
63
|
+
|
64
|
+
return self;
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* .start! -> self
|
69
|
+
*
|
70
|
+
* Starts recording profile data
|
71
|
+
*/
|
72
|
+
static VALUE
|
73
|
+
dt_profiler_start(VALUE self)
|
74
|
+
{
|
75
|
+
st_clear(profile->file_table);
|
76
|
+
|
77
|
+
if (profile->running == Qfalse) {
|
78
|
+
profile->running = Qtrue;
|
79
|
+
dt_profiler_install_hook(self);
|
80
|
+
}
|
81
|
+
|
82
|
+
return self;
|
83
|
+
}
|
84
|
+
|
85
|
+
/**
|
86
|
+
* .stop! -> self
|
87
|
+
*
|
88
|
+
* Stops collecting profile data
|
89
|
+
*/
|
90
|
+
static VALUE
|
91
|
+
dt_profiler_stop(VALUE self)
|
92
|
+
{
|
93
|
+
if (profile->running == Qtrue) {
|
94
|
+
dt_profiler_uninstall_hook();
|
95
|
+
profile->running = Qfalse;
|
96
|
+
}
|
97
|
+
|
98
|
+
return self;
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* .running? -> Boolean
|
103
|
+
*
|
104
|
+
* Returns whether a profile is currently running
|
105
|
+
*/
|
106
|
+
static VALUE
|
107
|
+
dt_profiler_running(VALUE self)
|
108
|
+
{
|
109
|
+
return profile->running;
|
110
|
+
}
|
111
|
+
|
112
|
+
/**
|
113
|
+
* .last_result -> Array
|
114
|
+
*
|
115
|
+
* Returns an array of source files
|
116
|
+
*/
|
117
|
+
static int
|
118
|
+
dt_profiler_last_result_collect(st_data_t key, st_data_t value, st_data_t result)
|
119
|
+
{
|
120
|
+
rb_ary_push((VALUE)result, rb_str_new2((const char *)key));
|
121
|
+
|
122
|
+
return ST_CONTINUE;
|
123
|
+
}
|
124
|
+
|
125
|
+
static VALUE
|
126
|
+
dt_profiler_last_result(VALUE self)
|
127
|
+
{
|
128
|
+
if (profile->running) {
|
129
|
+
return Qnil;
|
130
|
+
}
|
131
|
+
|
132
|
+
VALUE result = rb_ary_new();
|
133
|
+
st_foreach(profile->file_table, dt_profiler_last_result_collect, result);
|
134
|
+
rb_gc_mark(result);
|
135
|
+
|
136
|
+
return result;
|
137
|
+
}
|
138
|
+
|
139
|
+
|
140
|
+
/*=== Define
|
141
|
+
==============================================================================================*/
|
142
|
+
void Init_delta_test_native()
|
143
|
+
{
|
144
|
+
mDeltaTest = rb_define_module("DeltaTest");
|
145
|
+
mProfiler = rb_define_module_under(mDeltaTest, "Profiler");
|
146
|
+
|
147
|
+
dt_profiler_init();
|
148
|
+
|
149
|
+
rb_define_singleton_method(mProfiler, "clean!", dt_profiler_clean, 0);
|
150
|
+
rb_define_singleton_method(mProfiler, "start!", dt_profiler_start, 0);
|
151
|
+
rb_define_singleton_method(mProfiler, "stop!", dt_profiler_stop, 0);
|
152
|
+
rb_define_singleton_method(mProfiler, "running?", dt_profiler_running, 0);
|
153
|
+
rb_define_singleton_method(mProfiler, "last_result", dt_profiler_last_result, 0);
|
154
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#ifndef __DELTA_TEST_NATIVE_H_LOADED__
|
2
|
+
#define __DELTA_TEST_NATIVE_H_LOADED__
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
|
6
|
+
#if RUBY_VERSION < 192
|
7
|
+
#error un-supported ruby version. Please upgrade to 1.9.3 or higher.
|
8
|
+
#endif
|
9
|
+
|
10
|
+
typedef struct {
|
11
|
+
VALUE running;
|
12
|
+
st_table *file_table;
|
13
|
+
} dt_profiler_t;
|
14
|
+
|
15
|
+
#endif // __DELTA_TEST_NATIVE_H_LOADED__
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
if RUBY_VERSION < '1.9.3'
|
4
|
+
$stderr.puts("Ruby version #{RUBY_VERSION} is no longer supported. Please upgrade to 1.9.3 or higher")
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
|
8
|
+
{
|
9
|
+
'RUBY_VERSION' => RUBY_VERSION.gsub('.', '')
|
10
|
+
}.each { |k, v| $defs.push << '-D%s=%s' % [k, v] }
|
11
|
+
|
12
|
+
create_makefile('delta_test_native')
|
data/lib/delta_test.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
|
3
1
|
require_relative 'delta_test/version'
|
4
2
|
require_relative 'delta_test/errors'
|
5
3
|
require_relative 'delta_test/configuration'
|
6
4
|
|
5
|
+
# Load the C binding
|
6
|
+
begin
|
7
|
+
RUBY_VERSION =~ /(\d+.\d+)/
|
8
|
+
require_relative "#{$1}/delta_test_native"
|
9
|
+
rescue LoadError
|
10
|
+
require_relative 'delta_test_native'
|
11
|
+
end
|
12
|
+
|
7
13
|
module DeltaTest
|
8
14
|
|
9
15
|
ACTIVE_FLAG = 'DELTA_TEST_ACTIVE'
|