background_worker 0.0.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fcc18679c11c98ef7f0da1d7d5112004edd1bfb4
4
- data.tar.gz: 3d4cacb66997222274d85dde11e5787c3fad9ffb
2
+ SHA256:
3
+ metadata.gz: 6e2f1d5ad9dc6f2f79dfcd55838f8b7d9ded9c7518fc77f90ecea89fe537539c
4
+ data.tar.gz: 1e05a4e548ebdfea30e6bcf9ecc20dd7aaa3edc75966a2433f1f8ca016eb879c
5
5
  SHA512:
6
- metadata.gz: 37680e16cc121d912e38df598045df83c3e8e3fce5dedb168830932ac1e126d3de8fbfdb34860f0806c4999f26f4a891a7589310adfb323a7810aa4e4cab5553
7
- data.tar.gz: 4002280277529ea9af57c9714d19f1649a920719501e06eb1c9c63c521a295ce4acbb980dc652509f7cd9b10d7257e4725cba829bbb484275c8b17a6eb526967
6
+ metadata.gz: c98bc9599be6db3a4a5f5dd6b8dc699a9209dcf6889553ae786ee7c780198d4af3c37198fdf486477f5a150288c1ab818632eeefb655bf7453c5372806ba4871
7
+ data.tar.gz: 19d317689204f81a81f782c6a8697087c13d5616341abd6258a0284249804fd216c389cf07e738993b522ec1346c517224a040531a574428233e0170502eb506
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_PATH: "vendor"
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
@@ -0,0 +1,59 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build:
10
+ name: Build
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v2
15
+ - uses: ruby/setup-ruby@v1
16
+ with:
17
+ bundler-cache: true
18
+ - run: bundle exec rake
19
+
20
+ release:
21
+ needs: build
22
+ name: Release
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - name: Checkout
26
+ uses: actions/checkout@v2
27
+
28
+ - name: Generate Changelog
29
+ run: |
30
+ # Get version from github ref (remove 'refs/tags/' and prefix 'v')
31
+ version="${GITHUB_REF#refs/tags/v}"
32
+ npx changelog-parser CHANGELOG.md | jq -cr ".versions | .[] | select(.version == \"$version\") | .body" > ${{ github.workflow }}-CHANGELOG.txt
33
+
34
+ - name: Release
35
+ uses: softprops/action-gh-release@v1
36
+ with:
37
+ body_path: ${{ github.workflow }}-CHANGELOG.txt
38
+ env:
39
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
40
+
41
+ publish:
42
+ needs: [build, release]
43
+ name: Publish
44
+ runs-on: ubuntu-latest
45
+
46
+ steps:
47
+ - uses: actions/checkout@v2
48
+ - uses: ruby/setup-ruby@v1
49
+
50
+ - name: Publish to RubyGems
51
+ run: |
52
+ mkdir -p $HOME/.gem
53
+ touch $HOME/.gem/credentials
54
+ chmod 0600 $HOME/.gem/credentials
55
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
56
+ gem build *.gemspec
57
+ gem push *.gem
58
+ env:
59
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_AUTH_TOKEN}}"
@@ -0,0 +1,19 @@
1
+ name: Build and Test
2
+ on: [push, pull_request]
3
+ jobs:
4
+ test:
5
+ strategy:
6
+ fail-fast: false
7
+ matrix:
8
+ gemfile: [rails60, rails61]
9
+ ruby: ["2.6", "2.7", "3.0"]
10
+ runs-on: ubuntu-latest
11
+ env:
12
+ BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - uses: ruby/setup-ruby@v1
16
+ with:
17
+ ruby-version: ${{ matrix.ruby }}
18
+ bundler-cache: true
19
+ - run: bundle exec rake
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ coverage
3
+ vendor
4
+ tmp
@@ -0,0 +1 @@
1
+ 3.0.0
@@ -0,0 +1,25 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+ This changelog adheres to [Keep a CHANGELOG](http://keepachangelog.com/).
5
+
6
+ ## 0.4.0
7
+
8
+ - [TT-8623] Update to build with github actions / ruby 3.0 / rails 6.1
9
+
10
+ ## 0.3.0
11
+
12
+ - [TT-6292] Support Rails 5.2 built-in redis cache, remove legacy supports
13
+
14
+ ## 0.2.1
15
+ ### Fixed
16
+ - [RU-123] Worker disconnecting within transactions in rails 4+
17
+
18
+ ## 0.2.0
19
+ ### Added
20
+ - [RU-79] Release connections after execution for Rails 4
21
+
22
+ ## 0.1.0
23
+ ### Added
24
+ - [TT-1392] Changelog file
25
+ - [TT-2141] Only verify connections for Rails 3
data/README.md CHANGED
@@ -1,10 +1,13 @@
1
- Background Worker
2
- =================
1
+ # Background Worker
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/background_worker.svg)](http://badge.fury.io/rb/background_worker)
4
+ [![Build Status](https://github.com/sealink/background_worker/workflows/Build%20and%20Test/badge.svg?branch=master)](https://github.com/sealink/background_worker/actions)
3
5
 
4
6
  Provides a worker abstraction with an additional status channel.
5
7
 
6
8
  Start by making a worker class which extends from BackgroundWorker::Base
7
9
 
10
+ ```ruby
8
11
  class MyWorker < BackgroundWorker::Base
9
12
  def my_task(options={})
10
13
  report_progress('Starting')
@@ -17,48 +20,69 @@ Start by making a worker class which extends from BackgroundWorker::Base
17
20
  {original_message: message}
18
21
  end
19
22
  end
23
+ ```
20
24
 
21
25
  Then, when you want to perform a task in the background, use
22
26
  klass#perform_in_background which exists in Base:
23
27
 
24
- worker_id = MyWorker.perform_in_background(:my_task, message: "hello!")
28
+ ```ruby
29
+ worker_id = MyWorker.perform_in_background(:my_task, message: "hello!")
30
+ ```
25
31
 
26
32
  # Backgrounded
27
33
 
28
34
  By default this will call your instance method in the foreground -- you have to
29
35
  provide an #enqueue_with configuration like so:
30
36
 
37
+ ```ruby
31
38
  BackgroundWorker.configure(
32
39
  enqueue_with: -> klass, method_name, options {
33
40
  Resque.enqueue(klass, method_name, options)
34
41
  }
35
42
  )
43
+ ```
36
44
 
37
45
  This is independent of the status reporting which (currently) always uses Redis.
38
46
 
39
47
  # Getting the status
40
48
 
41
- The worker_id you are returned can be used to get the status, and
42
- whether the worker has finished successfully, failed, or in progress:
49
+ The worker_id you are returned can be used to get the status and
50
+ whether the worker has finished successfully, failed, or is still in progress:
43
51
 
52
+ ```ruby
44
53
  state = BackgroundWorker.get_state_of(worker_id)
54
+ ```
45
55
 
46
56
  The state is represented by a hash with the following keys:
47
57
 
48
- message: Reported message
49
- detailed_message: Detailed version of above when provided
50
- status: :successful, :failed, or null if still processing
51
- completed: True if report_failed, report_successful called (or worker
52
- finished without exception -- which calls report_successful)
53
- data: Arbitrary data returned by worker method on success or report_failed
58
+ | key | description |
59
+ | ------------------------------------------------------------ | -------------------------------------------------------------------- |
60
+ | message | Reported message |
61
+ | detailed_message | Detailed version of above when provided |
62
+ | status | :successful, :failed, or null if still processing |
63
+ | completed | True if report_failed, report_successful called (or worker |
64
+ | finished without exception -- which calls report_successful) |
65
+ | data | Arbitrary data returned by worker method on success or report_failed |
54
66
 
55
67
  If an exception is raised, the worker will call #report_failed with the
56
- details. You can provide a callback with #after_exception in the config
68
+ details. You can provide a callback with #after_exception in the config.
69
+
70
+ # Installation
71
+
72
+ Add to your Gemfile:
57
73
 
58
- # INSTALLATION
74
+ ```ruby
75
+ gem 'background_worker'
76
+ ```
59
77
 
60
- gem install background_worker
78
+ # Release
61
79
 
62
- or add to your Gemfile:
63
- gem 'background_worker'
80
+ To publish a new version of this gem the following steps must be taken.
64
81
 
82
+ - Update the version in the following files
83
+ ```
84
+ CHANGELOG.md
85
+ lib/background_worker/version.rb
86
+ ```
87
+ - Create a tag using the format v0.1.0
88
+ - Follow build progress in GitHub actions
data/Rakefile CHANGED
@@ -1 +1,12 @@
1
- require 'bundler/gem_tasks'
1
+ require "bundler/gem_tasks"
2
+
3
+ desc 'Default: run specs.'
4
+ task :default => :spec
5
+
6
+ require 'rspec/core/rake_task'
7
+
8
+ desc "Run specs"
9
+ RSpec::Core::RakeTask.new do |t|
10
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
11
+ # Put spec opts in a file named .rspec in root
12
+ end
@@ -19,8 +19,17 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
20
20
  spec.test_files = spec.files.grep(/^(test|spec|features)\//)
21
21
  spec.require_paths = ['lib']
22
+ spec.required_ruby_version = '>= 2.6'
22
23
 
24
+ spec.add_development_dependency 'activesupport'
23
25
  spec.add_development_dependency 'bundler'
24
26
  spec.add_development_dependency 'rake'
27
+ spec.add_development_dependency 'rspec'
28
+ spec.add_development_dependency 'coverage-kit'
29
+ spec.add_development_dependency 'coveralls'
30
+ spec.add_development_dependency 'simplecov-rcov'
25
31
  spec.add_development_dependency 'rubocop'
32
+
33
+ spec.add_development_dependency 'activerecord'
34
+ spec.add_development_dependency 'sqlite3'
26
35
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gemspec path: '../'
5
+
6
+ group :development, :test do
7
+ gem 'activerecord', '~> 6.0'
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gemspec path: '../'
5
+
6
+ group :development, :test do
7
+ gem 'activerecord', '~> 6.1'
8
+ end
@@ -24,8 +24,14 @@ module BackgroundWorker
24
24
  end
25
25
 
26
26
  def self.verify_active_connections!
27
- Rails.cache.reconnect if defined?(Rails)
28
- ActiveRecord::Base.verify_active_connections! if defined?(ActiveRecord)
27
+ if defined?(Rails)
28
+ Rails.cache.reconnect if Rails.cache.respond_to?(:reconnect)
29
+ Rails.cache.redis.close if Rails.cache.respond_to?(:redis)
30
+ end
31
+ end
32
+
33
+ def self.release_connections!
34
+ ActiveRecord::Base.clear_all_connections!
29
35
  end
30
36
 
31
37
  def self.after_exception(e)
@@ -7,14 +7,12 @@ module BackgroundWorker
7
7
  attr_accessor :uid, :state
8
8
 
9
9
  def initialize(options = {})
10
- Time.zone = Setting.time_zone
11
-
12
10
  @uid = options[:uid]
13
11
 
14
12
  # Store state persistently, to enable status checkups & progress reporting
15
13
  @state = BackgroundWorker::PersistentState.new(@uid, options.except(:uid))
16
14
  log("Created #{self.class}")
17
- log("Options are: #{options.pretty_inspect}")
15
+ log("Options are: #{options.inspect}")
18
16
  end
19
17
 
20
18
  # Report progress...
@@ -79,11 +77,13 @@ module BackgroundWorker
79
77
  #
80
78
  # It will just call your preferred method in the worker.
81
79
  def perform(method_name, options = {})
82
- BackgroundWorker.verify_active_connections!
80
+ BackgroundWorker.verify_active_connections! if BackgroundWorker.config.backgrounded
83
81
 
84
82
  worker = new(options)
85
83
  execution = WorkerExecution.new(worker, method_name, options)
86
84
  execution.call
85
+ ensure
86
+ BackgroundWorker.release_connections! if BackgroundWorker.config.backgrounded
87
87
  end
88
88
  end
89
89
  end
@@ -2,7 +2,7 @@ require 'logger'
2
2
 
3
3
  module BackgroundWorker
4
4
  class Config
5
- attr_reader :logger, :enqueue_with
5
+ attr_reader :logger, :enqueue_with, :backgrounded
6
6
 
7
7
  # Configuration includes following options:
8
8
  # logger: what logger to user throughout
@@ -19,6 +19,7 @@ module BackgroundWorker
19
19
  @logger = attrs.fetch(:logger, ::Logger.new(STDOUT))
20
20
  @enqueue_with = attrs.fetch(:enqueue_with, method(:foreground_enqueue))
21
21
  @after_exception = attrs.fetch(:after_exception, method(:default_after_exception))
22
+ @backgrounded = attrs.fetch(:backgrounded, true)
22
23
  end
23
24
 
24
25
  # Callback fired when an exception occurs
@@ -1,3 +1,3 @@
1
1
  module BackgroundWorker
2
- VERSION = '0.0.5'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ require 'active_support/core_ext/hash/keys' # Hash.symbolize_keys
4
+ require 'active_support/core_ext/numeric/time' # Numeric.hours
5
+
6
+ require 'active_record'
7
+
8
+ DB_FILE = 'tmp/test_db'
9
+ FileUtils.mkdir_p File.dirname(DB_FILE)
10
+ FileUtils.rm_f DB_FILE
11
+
12
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => DB_FILE
13
+
14
+ load('spec/schema.rb')
15
+
16
+ describe BackgroundWorker::Base do
17
+ let(:cache) { double(write: nil, read: nil, reconnect: nil, store: nil) }
18
+ let(:model_class) { Model = Class.new(ActiveRecord::Base) }
19
+ let(:worker_class) {
20
+ Class.new(BackgroundWorker::Base) do
21
+ def store_in_cache(opts)
22
+ Rails.cache.store(opts[:value])
23
+ end
24
+ end
25
+ }
26
+
27
+ before do
28
+ stub_const 'Model', model_class
29
+ stub_const 'Rails', double(cache: cache, env: 'production')
30
+ BackgroundWorker.configure(backgrounded: false)
31
+ end
32
+
33
+ it 'should perform action and handle transactions/connections appropriately' do
34
+ Model.transaction do
35
+ worker_class.perform_in_background(:store_in_cache, value: 42)
36
+ end
37
+ expect(cache).to have_received(:store).with(42)
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ ActiveRecord::Schema.define(:version => 1) do
2
+ create_table :models do |t|
3
+ t.string :name
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ require 'rubygems'
9
+ require 'bundler/setup'
10
+ require 'active_support/core_ext/string/inflections' #underscore
11
+
12
+ require 'support/coverage_loader'
13
+
14
+ require 'background_worker'
@@ -0,0 +1,4 @@
1
+ require 'simplecov-rcov'
2
+ require 'coveralls'
3
+ require 'coverage/kit'
4
+ Coverage::Kit.setup(minimum_coverage: 82.75)
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe BackgroundWorker::Uid do
4
+ let(:class_name) { 'CopyWorker' }
5
+ let(:method) { 'make_copy' }
6
+ let(:uid_object) { BackgroundWorker::Uid.new(class_name, method) }
7
+
8
+ context '#generate' do
9
+ subject(:uid) { uid_object.generate }
10
+ it { is_expected.to match(/copy_worker:make_copy:[0-9a-f]{16}/) }
11
+ end
12
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: background_worker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Noack
@@ -10,8 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-05-08 00:00:00.000000000 Z
13
+ date: 2021-01-06 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activesupport
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
15
29
  - !ruby/object:Gem::Dependency
16
30
  name: bundler
17
31
  requirement: !ruby/object:Gem::Requirement
@@ -40,6 +54,62 @@ dependencies:
40
54
  - - ">="
41
55
  - !ruby/object:Gem::Version
42
56
  version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: rspec
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: coverage-kit
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: coveralls
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: simplecov-rcov
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
43
113
  - !ruby/object:Gem::Dependency
44
114
  name: rubocop
45
115
  requirement: !ruby/object:Gem::Requirement
@@ -54,6 +124,34 @@ dependencies:
54
124
  - - ">="
55
125
  - !ruby/object:Gem::Version
56
126
  version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: activerecord
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: sqlite3
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
57
155
  description: See README for full details
58
156
  email:
59
157
  - development@travellink.com.au
@@ -63,12 +161,21 @@ executables: []
63
161
  extensions: []
64
162
  extra_rdoc_files: []
65
163
  files:
164
+ - ".bundle/config"
165
+ - ".github/dependabot.yml"
166
+ - ".github/workflows/release.yml"
167
+ - ".github/workflows/ruby.yml"
168
+ - ".gitignore"
66
169
  - ".rubocop.yml"
170
+ - ".ruby-version"
171
+ - CHANGELOG.md
67
172
  - Gemfile
68
173
  - LICENSE.txt
69
174
  - README.md
70
175
  - Rakefile
71
176
  - background_worker.gemspec
177
+ - gemfiles/rails60.gemfile
178
+ - gemfiles/rails61.gemfile
72
179
  - lib/background_worker.rb
73
180
  - lib/background_worker/base.rb
74
181
  - lib/background_worker/config.rb
@@ -76,6 +183,11 @@ files:
76
183
  - lib/background_worker/uid.rb
77
184
  - lib/background_worker/version.rb
78
185
  - lib/background_worker/worker_execution.rb
186
+ - spec/base_spec.rb
187
+ - spec/schema.rb
188
+ - spec/spec_helper.rb
189
+ - spec/support/coverage_loader.rb
190
+ - spec/uid_spec.rb
79
191
  homepage: http://github.com/sealink/background_worker
80
192
  licenses:
81
193
  - MIT
@@ -88,16 +200,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
200
  requirements:
89
201
  - - ">="
90
202
  - !ruby/object:Gem::Version
91
- version: '0'
203
+ version: '2.6'
92
204
  required_rubygems_version: !ruby/object:Gem::Requirement
93
205
  requirements:
94
206
  - - ">="
95
207
  - !ruby/object:Gem::Version
96
208
  version: '0'
97
209
  requirements: []
98
- rubyforge_project:
99
- rubygems_version: 2.4.5
210
+ rubygems_version: 3.2.3
100
211
  signing_key:
101
212
  specification_version: 4
102
213
  summary: Background worker abstraction with status updates
103
- test_files: []
214
+ test_files:
215
+ - spec/base_spec.rb
216
+ - spec/schema.rb
217
+ - spec/spec_helper.rb
218
+ - spec/support/coverage_loader.rb
219
+ - spec/uid_spec.rb