with_model 2.1.0 → 2.1.5

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
2
  SHA256:
3
- metadata.gz: 22f429a5cb8e986623de65004594810d642f7ca21b0bf24a0a1257defa40add9
4
- data.tar.gz: a7a0cbbe47ba722b1359a438c18692a7927ff957c88cd0e0919ac3ab4ac65e92
3
+ metadata.gz: a685dd2fcd809ce446e7dfde25b4fea90014e6bf5456d99e939f79b2ff3b18af
4
+ data.tar.gz: 3966fbcbeae1bd24fbeacf1f4c53b67abd78b771e03de3f6263a989ad8e180ce
5
5
  SHA512:
6
- metadata.gz: 63d816a1fe0782ee315073325b6eb59b468bc87c7899f3a124c181cc6542ee9c31d55768a3e2af8234ec6ffad9bb92037b012da5328128e835fce4a74d7a6b15
7
- data.tar.gz: 6da66d3cbf860d19d5a2c661e01e75ff7aef341d78d64d12055d5c28ebc5e7401ea5c095b6b006da1c01bcb4b2100bf524681a63292ccf791cff7def6a987115
6
+ metadata.gz: 659fff704f44481540e91d6ebe00322dd07fec0beda3142bc2581ed02bc962b7384dacf871a43c5231cc93757a428ef857f2ea093e8b82fb0ee0b9603932793f
7
+ data.tar.gz: 588cb797971b7dc861aa207a09cbddebf69c356878993d0edf98458afb83affb0cc2d5d26856a079e8bef4ae5d420698e9f65abcb636ee8990ab6178479467d2
data/.gitignore CHANGED
@@ -1,18 +1,5 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
1
  .yardoc
6
- .idea/
7
2
  Gemfile.lock
8
- InstalledFiles
9
- _yardoc
10
3
  coverage
11
4
  doc/
12
- lib/bundler/man
13
5
  pkg
14
- rdoc
15
- spec/reports
16
- test/tmp
17
- test/version_tmp
18
- tmp
@@ -0,0 +1 @@
1
+ debug.fullTrace=true
@@ -1,6 +1,22 @@
1
- inherit_gem:
2
- lint-config-ruby:
3
- - default.yml
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-rake
5
+ - rubocop-rspec
4
6
 
5
7
  AllCops:
6
- TargetRubyVersion: 2.3
8
+ NewCops: enable
9
+
10
+ Metrics/BlockLength:
11
+ Exclude:
12
+ - 'spec/**/*'
13
+ - 'with_model.gemspec'
14
+
15
+ Bundler/OrderedGems:
16
+ Enabled: false
17
+
18
+ Bundler/DuplicatedGem:
19
+ Enabled: false
20
+
21
+ Style/Documentation:
22
+ Enabled: false
@@ -0,0 +1,93 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-11-22 01:30:26 UTC using RuboCop version 1.3.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 4
10
+ RSpec/Be:
11
+ Exclude:
12
+ - 'spec/readme_spec.rb'
13
+ - 'spec/with_model_spec.rb'
14
+
15
+ # Offense count: 3
16
+ RSpec/BeforeAfterAll:
17
+ Exclude:
18
+ - 'spec/spec_helper.rb'
19
+ - 'spec/rails_helper.rb'
20
+ - 'spec/support/**/*.rb'
21
+ - 'spec/readme_spec.rb'
22
+ - 'spec/with_model_spec.rb'
23
+
24
+ # Offense count: 6
25
+ # Configuration parameters: Prefixes.
26
+ # Prefixes: when, with, without
27
+ RSpec/ContextWording:
28
+ Exclude:
29
+ - 'spec/active_record_behaviors_spec.rb'
30
+ - 'spec/with_model_spec.rb'
31
+
32
+ # Offense count: 6
33
+ # Configuration parameters: IgnoredMetadata.
34
+ RSpec/DescribeClass:
35
+ Exclude:
36
+ - 'spec/active_record_behaviors_spec.rb'
37
+ - 'spec/readme_spec.rb'
38
+ - 'spec/with_model_spec.rb'
39
+
40
+ # Offense count: 5
41
+ # Configuration parameters: Max.
42
+ RSpec/ExampleLength:
43
+ Exclude:
44
+ - 'spec/active_record_behaviors_spec.rb'
45
+ - 'spec/readme_spec.rb'
46
+ - 'spec/with_model_spec.rb'
47
+
48
+ # Offense count: 7
49
+ # Configuration parameters: AssignmentOnly.
50
+ RSpec/InstanceVariable:
51
+ Exclude:
52
+ - 'spec/active_record_behaviors_spec.rb'
53
+
54
+ # Offense count: 2
55
+ RSpec/LeakyConstantDeclaration:
56
+ Exclude:
57
+ - 'spec/readme_spec.rb'
58
+ - 'spec/with_model_spec.rb'
59
+
60
+ # Offense count: 2
61
+ # Configuration parameters: .
62
+ # SupportedStyles: have_received, receive
63
+ RSpec/MessageSpies:
64
+ EnforcedStyle: receive
65
+
66
+ # Offense count: 1
67
+ RSpec/MultipleDescribes:
68
+ Exclude:
69
+ - 'spec/readme_spec.rb'
70
+
71
+ # Offense count: 13
72
+ RSpec/MultipleExpectations:
73
+ Max: 5
74
+
75
+ # Offense count: 4
76
+ # Configuration parameters: IgnoreSharedExamples.
77
+ RSpec/NamedSubject:
78
+ Exclude:
79
+ - 'spec/with_model_spec.rb'
80
+
81
+ # Offense count: 2
82
+ RSpec/NestedGroups:
83
+ Max: 4
84
+
85
+ # Offense count: 4
86
+ RSpec/RepeatedExample:
87
+ Exclude:
88
+ - 'spec/with_model_spec.rb'
89
+
90
+ # Offense count: 2
91
+ RSpec/SubjectStub:
92
+ Exclude:
93
+ - 'spec/with_model_spec.rb'
@@ -1,43 +1,44 @@
1
1
  language: ruby
2
- sudo: false
2
+ cache: bundler
3
3
 
4
4
  rvm:
5
- - "2.5.1"
6
- - "2.4.4"
7
- - "2.3.7"
8
- - jruby-9.2.0.0
9
-
10
- install:
11
- - bundle install --retry=3
5
+ - 2.7.1
6
+ - 2.6.6
7
+ - 2.5.8
8
+ - 2.4.10
9
+ - jruby-9.2.13.0
12
10
 
13
11
  env:
14
- - ACTIVE_RECORD_BRANCH="master"
15
- - ACTIVE_RECORD_BRANCH="5-2-stable"
16
- - ACTIVE_RECORD_BRANCH="5-1-stable"
17
- - ACTIVE_RECORD_BRANCH="5-0-stable"
18
- - ACTIVE_RECORD_VERSION="~> 5.2.0"
19
- - ACTIVE_RECORD_VERSION="~> 5.1.0"
20
- - ACTIVE_RECORD_VERSION="~> 5.0.0"
21
- - ACTIVE_RECORD_VERSION="~> 4.2.0"
12
+ global:
13
+ - CC_TEST_REPORTER_ID=fe5c8a8b1b951a54707c08b6fb2a9a5edf9e0522d28bccc648454f774c9ccab1
14
+ matrix:
15
+ - ACTIVE_RECORD_BRANCH="master"
16
+ - ACTIVE_RECORD_VERSION="~> 6.1.0.rc1"
17
+ - ACTIVE_RECORD_VERSION="~> 6.0.0"
18
+ - ACTIVE_RECORD_VERSION="~> 5.2.0"
22
19
 
23
20
  matrix:
21
+ fast_finish: true
24
22
  allow_failures:
25
23
  - env: ACTIVE_RECORD_BRANCH="master"
26
- - env: ACTIVE_RECORD_BRANCH="5-2-stable"
27
- - env: ACTIVE_RECORD_BRANCH="5-1-stable"
28
- - env: ACTIVE_RECORD_BRANCH="5-0-stable"
24
+ - env: ACTIVE_RECORD_VERSION="~> 6.1.0.rc1"
29
25
  exclude:
30
- - rvm: 2.3.7
31
- env: ACTIVE_RECORD_BRANCH="master"
32
- - rvm: jruby-9.2.0.0
26
+ - rvm: 2.4.10
33
27
  env: ACTIVE_RECORD_BRANCH="master"
34
- - rvm: jruby-9.2.0.0
35
- env: ACTIVE_RECORD_BRANCH="5-2-stable"
36
- - rvm: jruby-9.2.0.0
37
- env: ACTIVE_RECORD_VERSION="~> 5.2.0"
38
- - rvm: jruby-9.2.0.0
39
- env: ACTIVE_RECORD_VERSION="~> 4.2.0"
28
+ - rvm: 2.4.10
29
+ env: ACTIVE_RECORD_VERSION="~> 6.0.0"
30
+ - rvm: 2.4.10
31
+ env: ACTIVE_RECORD_VERSION="~> 6.1.0.rc1"
32
+ - rvm: jruby-9.2.13.0
33
+ env: ACTIVE_RECORD_VERSION="~> 6.0.0"
34
+
35
+ before_install:
36
+ - gem install bundler
37
+
38
+ before_script:
39
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
40
+ - chmod +x ./cc-test-reporter
41
+ - ./cc-test-reporter before-build
40
42
 
41
- addons:
42
- code_climate:
43
- repo_token: fe5c8a8b1b951a54707c08b6fb2a9a5edf9e0522d28bccc648454f774c9ccab1
43
+ after_script:
44
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -0,0 +1 @@
1
+ --markup markdown
@@ -1,3 +1,34 @@
1
+ ### 2.1.5
2
+
3
+ - Add support for Active Record 6.1
4
+
5
+ ### 2.1.4
6
+
7
+ - Remove deprecation warnings for Ruby 2.7
8
+ - Require Ruby 2.4 or later
9
+ - Require Active Record 5.2 or later
10
+
11
+ ### 2.1.3
12
+
13
+ - Support ActiveRecord 6.0, working around new dependency tracking API
14
+
15
+ ### 2.1.2
16
+
17
+ - Don't clobber existing rake executable
18
+
19
+ ### 2.1.1
20
+
21
+ - Don't fail erroneously when running the after hook when the before hook failed
22
+ - Improve documentation
23
+
24
+ ### 2.1.0
25
+
26
+ - Support creating constant in an existing namespace (#26)
27
+ - Prefer keyword arguments over manually-validated hash argument
28
+ - Improve documentation
29
+ - Remove support for obsolete Ruby
30
+ - Internal cleanup
31
+
1
32
  ### 2.0.0
2
33
 
3
34
  - Require Ruby 2.1 or later
data/Gemfile CHANGED
@@ -4,14 +4,21 @@ source 'https://rubygems.org'
4
4
 
5
5
  gemspec
6
6
 
7
- gem 'lint-config-ruby', git: 'https://github.com/Casecommons/lint-config-ruby.git', tag: 'v1.0.0'
8
-
9
7
  ar_branch = ENV['ACTIVE_RECORD_BRANCH']
10
8
  ar_version = ENV['ACTIVE_RECORD_VERSION']
9
+ is_jruby = RUBY_PLATFORM == 'java'
11
10
 
12
11
  if ar_branch
13
12
  gem 'activerecord', git: 'https://github.com/rails/rails.git', branch: ar_branch
14
- gem 'arel', git: 'https://github.com/rails/arel.git' if ar_branch == 'master'
13
+ if ar_branch == 'master'
14
+ gem 'arel', git: 'https://github.com/rails/arel.git'
15
+ gem 'activerecord-jdbcsqlite3-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter.git' if is_jruby
16
+ end
15
17
  elsif ar_version
16
- gem 'activerecord', ar_version # rubocop:disable Bundler/DuplicatedGem
18
+ gem 'activerecord', ar_version
19
+ if is_jruby && !Gem::Requirement.new(ar_version).satisfied_by?(Gem::Version.new('5.2.0'))
20
+ gem 'activerecord-jdbcsqlite3-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter.git'
21
+ end
17
22
  end
23
+
24
+ gem 'sqlite3', '~> 1.4.1' unless is_jruby
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2018 Case Commons, Inc. <http://casecommons.org>
1
+ Copyright (c) 2010-2019 Casebook, PBC <http://www.casebook.net>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -2,8 +2,9 @@
2
2
 
3
3
  [![Gem Version](https://img.shields.io/gem/v/with_model.svg?style=flat)](https://rubygems.org/gems/with_model)
4
4
  [![Build Status](https://secure.travis-ci.org/Casecommons/with_model.svg?branch=master)](https://travis-ci.org/Casecommons/with_model)
5
+ [![API Documentation](https://img.shields.io/badge/yard-api%20docs-lightgrey.svg)](https://www.rubydoc.info/gems/with_model)
5
6
 
6
- `with_model` dynamically builds an ActiveRecord model (with table) before each test in a group and destroys it afterwards.
7
+ `with_model` dynamically builds an Active Record model (with table) before each test in a group and destroys it afterwards.
7
8
 
8
9
  ## Development status
9
10
 
@@ -48,13 +49,13 @@ describe "A blog post" do
48
49
  module MyModule; end
49
50
 
50
51
  with_model :BlogPost do
51
- # The table block (and an options hash) is passed to ActiveRecord migration’s `create_table`.
52
+ # The table block (and an options hash) is passed to Active Record migration’s `create_table`.
52
53
  table do |t|
53
54
  t.string :title
54
55
  t.timestamps null: false
55
56
  end
56
57
 
57
- # The model block is the ActiveRecord model’s class body.
58
+ # The model block is the Active Record model’s class body.
58
59
  model do
59
60
  include MyModule
60
61
  has_many :comments
@@ -101,7 +102,7 @@ describe "A blog post" do
101
102
 
102
103
  it "can do all the things a regular model can" do
103
104
  record = BlogPost.new
104
- expect(record).to_not be_valid
105
+ expect(record).not_to be_valid
105
106
  record.title = "foo"
106
107
  expect(record).to be_valid
107
108
  expect(record.save).to eq true
@@ -154,16 +155,25 @@ describe "with table options" do
154
155
  end
155
156
 
156
157
  it "respects the additional options" do
157
- expect(WithOptions.columns.map(&:name)).to_not include("id")
158
+ expect(WithOptions.columns.map(&:name)).not_to include("id")
158
159
  end
159
160
  end
160
161
  ```
161
162
 
162
163
  ## Requirements
163
164
 
164
- - Ruby 2.1+
165
- - RSpec or minitest/spec
166
- - ActiveRecord 4.2+
165
+ See the [gemspec metadata](https://rubygems.org/gems/with_model) for dependency requirements. RSpec and minitest are indirect dependencies, and `with_model` should support any maintained version of both.
166
+
167
+ ## Thread-safety
168
+
169
+ - A unique table name is used for tables generated via `with_model`/`WithModel::Model.new`. This allows `with_model` (when limited to this API) to run concurrently (in processes or threads) with a single database schema. While there is a possibility of collision, it is very small.
170
+ - A user-supplied table name is used for tables generated via `with_table`/`WithModel::Table.new`. This may cause collisions at runtime if tests are run concurrently against a single database schema, unless the caller takes care to ensure the table names passed as arguments are unique across threads/processes.
171
+ - Generated models are created in stubbed constants, which are global; no guarantee is made to the uniqueness of a constant, and this may be unsafe.
172
+ - Generated classes are Active Record subclasses:
173
+ - This library makes no guarantee as to the thread-safety of creating Active Record subclasses concurrently.
174
+ - This library makes no guarantee as to the thread-safety of cleaning up Active Record/Active Support’s internals which are polluted upon class creation.
175
+
176
+ In general, `with_model` is not guaranteed to be thread-safe, but is, in certain usages, safe to use concurrently across multiple processes with a single database schema.
167
177
 
168
178
  ## Versioning
169
179
 
@@ -171,5 +181,5 @@ end
171
181
 
172
182
  ## License
173
183
 
174
- Copyright © 2010–2018 [Case Commons, Inc](http://casecommons.org).
184
+ Copyright © 2010–2020 [Casebook PBC](https://www.casebook.net).
175
185
  Licensed under the MIT license, see [LICENSE](/LICENSE) file.
@@ -6,8 +6,12 @@ require 'with_model/table'
6
6
  require 'with_model/version'
7
7
 
8
8
  module WithModel
9
+ # @param [Symbol] name The constant name to assign the model class to.
10
+ # @param scope Passed to `before`/`after` in the test context.
11
+ # @param options Passed to {WithModel::Model#initialize}.
12
+ # @param block Yielded an instance of {WithModel::Model::DSL}.
9
13
  def with_model(name, scope: nil, **options, &block)
10
- model = Model.new name, options
14
+ model = Model.new name, **options
11
15
  dsl = Model::DSL.new model
12
16
  dsl.instance_exec(&block) if block
13
17
 
@@ -20,6 +24,10 @@ module WithModel
20
24
  end
21
25
  end
22
26
 
27
+ # @param [Symbol] name The table name to create.
28
+ # @param scope Passed to `before`/`after` in the test context.
29
+ # @param options Passed to {WithModel::Table#initialize}.
30
+ # @param block Passed to {WithModel::Table#initialize} (like {WithModel::Model::DSL#table}).
23
31
  def with_table(name, scope: nil, **options, &block)
24
32
  table = Table.new name, options, &block
25
33
 
@@ -19,9 +19,11 @@ module WithModel
19
19
  end
20
20
 
21
21
  def unstub_const
22
- @namespace.__send__ :remove_const, basename
23
- @namespace.const_set basename, @original_value if @original_value
24
- @namespace = nil
22
+ if @namespace
23
+ @namespace.__send__ :remove_const, basename
24
+ @namespace.const_set basename, @original_value if @original_value
25
+ @namespace = nil
26
+ end
25
27
  @original_value = nil
26
28
  end
27
29
 
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WithModel
4
+ # Extended into all ActiveRecord models created by with_model.
4
5
  module Methods
6
+ # Since model classes not created by with_model won't have this
7
+ # method, one should instead test `respond_to?(:with_model?)`.
5
8
  def with_model?
6
9
  true
7
10
  end
@@ -8,9 +8,14 @@ require 'with_model/methods'
8
8
  require 'with_model/table'
9
9
 
10
10
  module WithModel
11
+ # In general, direct use of this class should be avoided. Instead use
12
+ # either the {WithModel high-level API} or {WithModel::Model::DSL low-level API}.
11
13
  class Model
12
14
  attr_writer :model_block, :table_block, :table_options
13
15
 
16
+ # @param [Symbol] name The constant name to assign the model class to.
17
+ # @param [Class] superclass The superclass for the created class. Should
18
+ # have `ActiveRecord::Base` as an ancestor.
14
19
  def initialize(name, superclass: ActiveRecord::Base)
15
20
  @name = name.to_sym
16
21
  @model_block = nil
@@ -30,7 +35,7 @@ module WithModel
30
35
 
31
36
  def destroy
32
37
  stubber.unstub_const
33
- remove_from_superclass_descendants
38
+ cleanup_descendants_tracking
34
39
  reset_dependencies_cache
35
40
  table.destroy
36
41
  @model = nil
@@ -48,13 +53,17 @@ module WithModel
48
53
  @model.reset_column_information
49
54
  end
50
55
 
51
- def remove_from_superclass_descendants
52
- return unless @model.superclass.respond_to?(:direct_descendants)
53
- @model.superclass.direct_descendants.delete(@model)
56
+ def cleanup_descendants_tracking
57
+ if defined?(ActiveSupport::DescendantsTracker)
58
+ ActiveSupport::DescendantsTracker.class_variable_get(:@@direct_descendants).delete(ActiveRecord::Base)
59
+ elsif @model.superclass.respond_to?(:direct_descendants)
60
+ @model.superclass.direct_descendants.delete(@model)
61
+ end
54
62
  end
55
63
 
56
64
  def reset_dependencies_cache
57
65
  return unless defined?(ActiveSupport::Dependencies::Reference)
66
+
58
67
  ActiveSupport::Dependencies::Reference.clear!
59
68
  end
60
69
 
@@ -3,11 +3,12 @@
3
3
  module WithModel
4
4
  class Model
5
5
  class DSL
6
+ # @param model [WithModel::Model] The Model to mutate via this DSL.
6
7
  def initialize(model)
7
8
  @model = model
8
9
  end
9
10
 
10
- # Provide a schema definition for the table, passed to ActiveRecords `create_table`.
11
+ # Provide a schema definition for the table, passed to ActiveRecord's `create_table`.
11
12
  # The table name will be auto-generated.
12
13
  #
13
14
  # @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_table
@@ -3,20 +3,28 @@
3
3
  require 'active_record'
4
4
 
5
5
  module WithModel
6
+ # In general, direct use of this class should be avoided. Instead use
7
+ # either the {WithModel high-level API} or {WithModel::Model::DSL low-level API}.
6
8
  class Table
9
+ # @param [Symbol] name The name of the table to create.
10
+ # @param options Passed to ActiveRecord `create_table`.
11
+ # @param block Passed to ActiveRecord `create_table`.
12
+ # @see https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_table
7
13
  def initialize(name, options = {}, &block)
8
14
  @name = name.freeze
9
15
  @options = options.freeze
10
16
  @block = block
11
17
  end
12
18
 
19
+ # Creates the table with the initialized options. Drops the table if
20
+ # it already exists.
13
21
  def create
14
22
  connection.drop_table(@name) if exists?
15
- connection.create_table(@name, @options, &@block)
23
+ connection.create_table(@name, **@options, &@block)
16
24
  end
17
25
 
18
26
  def destroy
19
- ActiveRecord::Base.connection.drop_table(@name)
27
+ connection.drop_table(@name)
20
28
  end
21
29
 
22
30
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WithModel
4
- VERSION = '2.1.0'
4
+ VERSION = '2.1.5'
5
5
  end
@@ -0,0 +1,5 @@
1
+ inherit_from:
2
+ - ../.rubocop.yml
3
+
4
+ Lint/ConstantDefinitionInBlock:
5
+ Enabled: false
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ module WithModel
6
+ describe ConstantStubber do
7
+ it 'allows calling unstub_const multiple times' do
8
+ stubber = described_class.new('Foo')
9
+ stubber.stub_const(1)
10
+ stubber.unstub_const
11
+ stubber.unstub_const
12
+ end
13
+
14
+ it 'allows calling unstub_const without stub_const' do
15
+ stubber = described_class.new('Foo')
16
+ stubber.unstub_const
17
+ end
18
+ end
19
+ end
@@ -61,7 +61,7 @@ describe 'A blog post' do
61
61
 
62
62
  it 'can do all the things a regular model can' do
63
63
  record = BlogPost.new
64
- expect(record).to_not be_valid
64
+ expect(record).not_to be_valid
65
65
  record.title = 'foo'
66
66
  expect(record).to be_valid
67
67
  expect(record.save).to eq true
@@ -75,8 +75,7 @@ describe 'A blog post' do
75
75
  self.abstract_class = true
76
76
  end
77
77
 
78
- with_model :Ford, superclass: Car do
79
- end
78
+ with_model :Ford, superclass: Car
80
79
 
81
80
  it 'has a specified superclass' do
82
81
  expect(Ford < Car).to eq true
@@ -114,6 +113,6 @@ describe 'with table options' do
114
113
  end
115
114
 
116
115
  it 'respects the additional options' do
117
- expect(WithOptions.columns.map(&:name)).to_not include('id')
116
+ expect(WithOptions.columns.map(&:name)).not_to include('id')
118
117
  end
119
118
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler'
4
- Bundler.setup
3
+ require 'simplecov'
4
+ SimpleCov.start
5
5
 
6
+ require 'bundler/setup'
6
7
  require 'with_model'
8
+
7
9
  RSpec.configure do |config|
8
10
  config.extend WithModel
9
11
 
@@ -26,9 +28,7 @@ adapter = is_jruby ? 'jdbcsqlite3' : 'sqlite3'
26
28
  require 'active_record'
27
29
  ActiveRecord::Base.establish_connection(adapter: adapter, database: ':memory:')
28
30
 
29
- if defined?(I18n) && I18n.respond_to?(:enforce_available_locales=)
30
- I18n.enforce_available_locales = true
31
- end
31
+ I18n.enforce_available_locales = true if defined?(I18n) && I18n.respond_to?(:enforce_available_locales=)
32
32
 
33
33
  if ENV['LOGGER']
34
34
  require 'logger'
@@ -59,7 +59,8 @@ describe 'a temporary ActiveRecord model created with with_model' do
59
59
 
60
60
  describe 'the class' do
61
61
  subject { BlogPost.new }
62
- it_should_behave_like 'ActiveModel'
62
+
63
+ it_behaves_like 'ActiveModel'
63
64
  end
64
65
 
65
66
  it 'has the methods defined in its model block' do
@@ -90,6 +91,7 @@ describe 'a temporary ActiveRecord model created with with_model' do
90
91
 
91
92
  describe 'constant restoration' do
92
93
  before { stub_const('MyConst', 1) }
94
+
93
95
  shadowing_example_ran = false
94
96
 
95
97
  context 'with the with_model block' do
@@ -145,6 +147,7 @@ describe 'a temporary ActiveRecord model created with with_model' do
145
147
 
146
148
  describe 'with a name which is namespaced' do
147
149
  before { stub_const('Stuff', Module.new) }
150
+
148
151
  with_model :'Stuff::BlogPost'
149
152
 
150
153
  it 'creates the model in the namespace' do
@@ -160,13 +163,16 @@ describe 'a temporary ActiveRecord model created with with_model' do
160
163
  end
161
164
  end
162
165
 
163
- it 'is available' do end
166
+ it 'is available' do
167
+ expect(BlogPost).to be
168
+ end
164
169
  end
165
170
 
166
171
  context 'with a mixin' do
167
172
  let(:mixin) do
168
173
  Module.new { def foo; end }
169
174
  end
175
+
170
176
  before { stub_const('AMixin', mixin) }
171
177
 
172
178
  with_model :WithAMixin do
@@ -176,12 +182,14 @@ describe 'a temporary ActiveRecord model created with with_model' do
176
182
  end
177
183
 
178
184
  it 'has the mixin' do
179
- expect(-> { ::WithAMixin.new.foo }).to_not raise_error
185
+ expect(-> { ::WithAMixin.new.foo }).not_to raise_error
180
186
  expect(::WithAMixin.include?(AMixin)).to eq true
181
187
  end
182
188
  end
183
189
 
184
190
  context 'with a mixin that has a class_eval' do
191
+ subject { WithAClassEval.new }
192
+
185
193
  let(:mixin) do
186
194
  Module.new do
187
195
  def self.included(klass)
@@ -191,9 +199,8 @@ describe 'a temporary ActiveRecord model created with with_model' do
191
199
  end
192
200
  end
193
201
  end
194
- before { stub_const('AMixin', mixin) }
195
202
 
196
- subject { WithAClassEval.new }
203
+ before { stub_const('AMixin', mixin) }
197
204
 
198
205
  with_model :WithAClassEval do
199
206
  model do
@@ -222,7 +229,7 @@ describe 'a temporary ActiveRecord model created with with_model' do
222
229
  end
223
230
 
224
231
  it 'respects the additional options' do
225
- expect(WithOptions.columns.map(&:name)).to_not include('id')
232
+ expect(WithOptions.columns.map(&:name)).not_to include('id')
226
233
  end
227
234
  end
228
235
 
@@ -238,12 +245,13 @@ describe 'a temporary ActiveRecord model created with with_model' do
238
245
 
239
246
  describe 'the class' do
240
247
  subject { BlogPost.new }
241
- it_should_behave_like 'ActiveModel'
248
+
249
+ it_behaves_like 'ActiveModel'
242
250
  end
243
251
  end
244
252
 
245
253
  context 'with an empty block' do
246
- with_model(:BlogPost) {}
254
+ with_model(:BlogPost) {} # rubocop:disable Lint/EmptyBlock
247
255
 
248
256
  it 'acts like a normal ActiveRecord model' do
249
257
  record = BlogPost.create!
@@ -254,7 +262,8 @@ describe 'a temporary ActiveRecord model created with with_model' do
254
262
 
255
263
  describe 'the class' do
256
264
  subject { BlogPost.new }
257
- it_should_behave_like 'ActiveModel'
265
+
266
+ it_behaves_like 'ActiveModel'
258
267
  end
259
268
  end
260
269
 
@@ -283,7 +292,8 @@ describe 'a temporary ActiveRecord model created with with_model' do
283
292
 
284
293
  describe 'the class' do
285
294
  subject { BlogPost.new }
286
- it_should_behave_like 'ActiveModel'
295
+
296
+ it_behaves_like 'ActiveModel'
287
297
  end
288
298
  end
289
299
 
@@ -300,25 +310,32 @@ describe 'a temporary ActiveRecord model created with with_model' do
300
310
 
301
311
  describe 'the class' do
302
312
  subject { BlogPost.new }
303
- it_should_behave_like 'ActiveModel'
313
+
314
+ it_behaves_like 'ActiveModel'
304
315
  end
305
316
  end
306
317
 
307
318
  context 'with ActiveSupport::DescendantsTracker' do
308
- with_model :BlogPost
319
+ with_model :BlogPost do
320
+ model do
321
+ def self.inspect
322
+ "BlogPost class #{object_id}"
323
+ end
324
+ end
325
+ end
309
326
 
310
- it 'includes the correct model class in descendants on the first test run' do
311
- descendant = ActiveRecord::Base.descendants.detect do |c|
327
+ def blog_post_classes
328
+ ActiveRecord::Base.descendants.select do |c|
312
329
  c.table_name == BlogPost.table_name
313
330
  end
314
- expect(descendant).to eq BlogPost
331
+ end
332
+
333
+ it 'includes the correct model class in descendants on the first test run' do
334
+ expect(blog_post_classes).to eq [BlogPost]
315
335
  end
316
336
 
317
337
  it 'includes the correct model class in descendants on the second test run' do
318
- descendant = ActiveRecord::Base.descendants.detect do |c|
319
- c.table_name == BlogPost.table_name
320
- end
321
- expect(descendant).to eq BlogPost
338
+ expect(blog_post_classes).to eq [BlogPost]
322
339
  end
323
340
  end
324
341
 
@@ -355,7 +372,8 @@ describe 'a temporary ActiveRecord model created with with_model' do
355
372
 
356
373
  describe 'the class' do
357
374
  subject { BlogPost.new }
358
- it_should_behave_like 'ActiveModel'
375
+
376
+ it_behaves_like 'ActiveModel'
359
377
  end
360
378
 
361
379
  it 'is a subclass of the supplied superclass' do
@@ -14,18 +14,23 @@ Gem::Specification.new do |spec|
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
- spec.executables = spec.files.grep(%r(^bin/)) { |f| File.basename(f) }
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.required_ruby_version = '>= 2.3'
21
+ spec.required_ruby_version = '>= 2.4'
22
22
 
23
- spec.add_dependency 'activerecord', '>= 4.2', '< 6.0'
23
+ spec.add_dependency 'activerecord', '>= 5.2'
24
24
 
25
- spec.add_development_dependency 'bundler', '~> 1.0'
25
+ spec.add_development_dependency 'bundler', '~> 2.0'
26
26
  spec.add_development_dependency 'minitest'
27
27
  spec.add_development_dependency 'rake'
28
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
+ spec.add_development_dependency 'rubocop'
30
+ spec.add_development_dependency 'rubocop-rake'
31
+ spec.add_development_dependency 'rubocop-rspec'
32
+ spec.add_development_dependency 'simplecov'
33
+ spec.add_development_dependency 'yard'
29
34
 
30
35
  if RUBY_PLATFORM == 'java'
31
36
  spec.add_development_dependency 'activerecord-jdbcsqlite3-adapter'
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: with_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Case Commons, LLC
8
8
  - Grant Hutchins
9
9
  - Andrew Marshall
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-10-09 00:00:00.000000000 Z
13
+ date: 2020-11-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -18,34 +18,28 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '4.2'
22
- - - "<"
23
- - !ruby/object:Gem::Version
24
- version: '6.0'
21
+ version: '5.2'
25
22
  type: :runtime
26
23
  prerelease: false
27
24
  version_requirements: !ruby/object:Gem::Requirement
28
25
  requirements:
29
26
  - - ">="
30
27
  - !ruby/object:Gem::Version
31
- version: '4.2'
32
- - - "<"
33
- - !ruby/object:Gem::Version
34
- version: '6.0'
28
+ version: '5.2'
35
29
  - !ruby/object:Gem::Dependency
36
30
  name: bundler
37
31
  requirement: !ruby/object:Gem::Requirement
38
32
  requirements:
39
33
  - - "~>"
40
34
  - !ruby/object:Gem::Version
41
- version: '1.0'
35
+ version: '2.0'
42
36
  type: :development
43
37
  prerelease: false
44
38
  version_requirements: !ruby/object:Gem::Requirement
45
39
  requirements:
46
40
  - - "~>"
47
41
  - !ruby/object:Gem::Version
48
- version: '1.0'
42
+ version: '2.0'
49
43
  - !ruby/object:Gem::Dependency
50
44
  name: minitest
51
45
  requirement: !ruby/object:Gem::Requirement
@@ -88,6 +82,76 @@ dependencies:
88
82
  - - "~>"
89
83
  - !ruby/object:Gem::Version
90
84
  version: '3.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: rubocop
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: rubocop-rake
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'
113
+ - !ruby/object:Gem::Dependency
114
+ name: rubocop-rspec
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: simplecov
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: yard
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'
91
155
  - !ruby/object:Gem::Dependency
92
156
  name: sqlite3
93
157
  requirement: !ruby/object:Gem::Requirement
@@ -107,21 +171,22 @@ email:
107
171
  - casecommons-dev@googlegroups.com
108
172
  - gems@nertzy.com
109
173
  - andrew@johnandrewmarshall.com
110
- executables:
111
- - rake
174
+ executables: []
112
175
  extensions: []
113
176
  extra_rdoc_files: []
114
177
  files:
115
178
  - ".gitignore"
179
+ - ".jrubyrc"
116
180
  - ".rspec"
117
181
  - ".rubocop.yml"
182
+ - ".rubocop_todo.yml"
118
183
  - ".travis.yml"
184
+ - ".yardopts"
119
185
  - CHANGELOG.md
120
186
  - Gemfile
121
187
  - LICENSE
122
188
  - README.md
123
189
  - Rakefile
124
- - bin/rake
125
190
  - lib/with_model.rb
126
191
  - lib/with_model/constant_stubber.rb
127
192
  - lib/with_model/methods.rb
@@ -129,7 +194,9 @@ files:
129
194
  - lib/with_model/model/dsl.rb
130
195
  - lib/with_model/table.rb
131
196
  - lib/with_model/version.rb
197
+ - spec/.rubocop.yml
132
198
  - spec/active_record_behaviors_spec.rb
199
+ - spec/constant_stubber_spec.rb
133
200
  - spec/readme_spec.rb
134
201
  - spec/spec_helper.rb
135
202
  - spec/with_model_spec.rb
@@ -138,7 +205,7 @@ homepage: https://github.com/Casecommons/with_model
138
205
  licenses:
139
206
  - MIT
140
207
  metadata: {}
141
- post_install_message:
208
+ post_install_message:
142
209
  rdoc_options: []
143
210
  require_paths:
144
211
  - lib
@@ -146,20 +213,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
213
  requirements:
147
214
  - - ">="
148
215
  - !ruby/object:Gem::Version
149
- version: '2.3'
216
+ version: '2.4'
150
217
  required_rubygems_version: !ruby/object:Gem::Requirement
151
218
  requirements:
152
219
  - - ">="
153
220
  - !ruby/object:Gem::Version
154
221
  version: '0'
155
222
  requirements: []
156
- rubyforge_project:
157
- rubygems_version: 2.7.4
158
- signing_key:
223
+ rubygems_version: 3.1.4
224
+ signing_key:
159
225
  specification_version: 4
160
226
  summary: Dynamically build a model within an RSpec context
161
227
  test_files:
228
+ - spec/.rubocop.yml
162
229
  - spec/active_record_behaviors_spec.rb
230
+ - spec/constant_stubber_spec.rb
163
231
  - spec/readme_spec.rb
164
232
  - spec/spec_helper.rb
165
233
  - spec/with_model_spec.rb
data/bin/rake DELETED
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- #
5
- # This file was generated by Bundler.
6
- #
7
- # The application 'rake' is installed as part of a gem, and
8
- # this file is here to facilitate running it.
9
- #
10
-
11
- require 'pathname'
12
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
13
- Pathname.new(__FILE__).realpath)
14
-
15
- require 'rubygems'
16
- require 'bundler/setup'
17
-
18
- load Gem.bin_path('rake', 'rake')