shoulda 3.6.0 → 4.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +181 -2
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +24 -9
  6. data/Appraisals +108 -10
  7. data/Gemfile +9 -5
  8. data/README.md +24 -17
  9. data/Rakefile +18 -13
  10. data/gemfiles/rails_4_2.gemfile +31 -0
  11. data/gemfiles/rails_4_2.gemfile.lock +240 -0
  12. data/gemfiles/rails_5_0.gemfile +29 -0
  13. data/gemfiles/rails_5_0.gemfile.lock +232 -0
  14. data/gemfiles/rails_5_1.gemfile +30 -0
  15. data/gemfiles/rails_5_1.gemfile.lock +249 -0
  16. data/gemfiles/rails_5_2.gemfile +32 -0
  17. data/gemfiles/rails_5_2.gemfile.lock +268 -0
  18. data/gemfiles/rails_6_0.gemfile +34 -0
  19. data/gemfiles/rails_6_0.gemfile.lock +285 -0
  20. data/lib/shoulda/version.rb +1 -1
  21. data/script/install_gems_in_all_appraisals +16 -0
  22. data/script/run_all_tests +16 -0
  23. data/script/supported_ruby_versions +7 -0
  24. data/script/update_gem_in_all_appraisals +17 -0
  25. data/script/update_gems_in_all_appraisals +16 -0
  26. data/shoulda.gemspec +3 -3
  27. data/test/acceptance/integrates_with_rails_test.rb +580 -0
  28. data/test/acceptance_test_helper.rb +32 -6
  29. data/test/support/acceptance/add_shoulda_to_project.rb +13 -18
  30. data/test/support/acceptance/matchers/have_output.rb +2 -0
  31. data/test/support/acceptance/matchers/indicate_that_tests_were_run.rb +109 -0
  32. data/test/support/acceptance/rails_application_with_shoulda.rb +47 -0
  33. data/test/support/{tests/current_bundle.rb → current_bundle.rb} +4 -4
  34. data/test/support/snowglobe.rb +5 -0
  35. data/test/test_helper.rb +9 -4
  36. metadata +37 -65
  37. data/.hound/ruby.yml +0 -1042
  38. data/gemfiles/4.2.gemfile +0 -17
  39. data/gemfiles/4.2.gemfile.lock +0 -174
  40. data/gemfiles/5.0.gemfile +0 -17
  41. data/gemfiles/5.0.gemfile.lock +0 -179
  42. data/test/acceptance/rails_integration_test.rb +0 -76
  43. data/test/report_warnings.rb +0 -7
  44. data/test/support/acceptance/helpers.rb +0 -19
  45. data/test/support/acceptance/helpers/active_model_helpers.rb +0 -11
  46. data/test/support/acceptance/helpers/base_helpers.rb +0 -14
  47. data/test/support/acceptance/helpers/command_helpers.rb +0 -54
  48. data/test/support/acceptance/helpers/file_helpers.rb +0 -19
  49. data/test/support/acceptance/helpers/gem_helpers.rb +0 -31
  50. data/test/support/acceptance/helpers/step_helpers.rb +0 -69
  51. data/test/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -54
  52. data/test/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -75
  53. data/test/support/tests/bundle.rb +0 -94
  54. data/test/support/tests/command_runner.rb +0 -230
  55. data/test/support/tests/filesystem.rb +0 -100
  56. data/test/support/tests/version.rb +0 -45
  57. data/test/warnings_spy.rb +0 -62
  58. data/test/warnings_spy/filesystem.rb +0 -45
  59. data/test/warnings_spy/partitioner.rb +0 -36
  60. data/test/warnings_spy/reader.rb +0 -53
  61. data/test/warnings_spy/reporter.rb +0 -88
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd256fdc40162759558e33c2fd011d0c1c78f1fc6a48530c1981c9d5be59749c
4
- data.tar.gz: 67eed1f001ac7575cf5e71ecd17543a03bdbf12cbd0953616520df25294b1def
3
+ metadata.gz: b87e253682d87a9713acd221ad7201c6ed1885d23eea6727dc8af5432432ee84
4
+ data.tar.gz: f28166eed87bc29a895445d5c5175aac1b08eff2b7d577eaee3b5c9a53524574
5
5
  SHA512:
6
- metadata.gz: c3671625339d0e7f18941504b295e155104e8f67d6c7d7b70afcbf6face4c2fa21eaea02133c6b1da611b000df68f3b89cfee0197cd4ccbb8c81bfdef0542a08
7
- data.tar.gz: 989e4dc4ed540ed7d2bbc88477f700926e036774ac5ea8310c313778af27ad82e5338ef06056dba2fde9d4fbf08e3cc3e7893522371a6352bb73009399031cf3
6
+ metadata.gz: 92e53a4b9fb2c8b90bc09d95f8dde8100c3849481a3978c355539addccd19b4dd18cd74ae52724f9d57891c5e838577c726a0422451b1432536d09c19317e48b
7
+ data.tar.gz: b55e8b92f1655845712ad2affe99681ad0917c3bc8edfdb547737c36e4dceac713249f9f69121d7bbb6407c49691bc06fe4728f21c6c00b12c1bef663183788d
data/.gitignore CHANGED
@@ -1,5 +1,7 @@
1
1
  *.swo
2
2
  *.swp
3
+ .DS_Store
4
+ .byebug_history
3
5
  .bundle
4
6
  .svn/
5
7
  Gemfile.lock
@@ -1,13 +1,192 @@
1
- inherit_from: .hound/ruby.yml
2
- Style/AlignParameters:
1
+ AllCops:
2
+ TargetRubyVersion: 2.4
3
+ Layout/ParameterAlignment:
3
4
  EnforcedStyle: with_fixed_indentation
5
+ Layout/ConditionPosition:
6
+ Enabled: false
7
+ Layout/DotPosition:
8
+ EnforcedStyle: trailing
9
+ Layout/HeredocIndentation:
10
+ Enabled: false
11
+ Layout/MultilineMethodCallIndentation:
12
+ EnforcedStyle: indented
13
+ Lint/AmbiguousOperator:
14
+ Enabled: false
15
+ Lint/AmbiguousRegexpLiteral:
16
+ Enabled: false
17
+ Lint/AssignmentInCondition:
18
+ Enabled: false
19
+ Lint/DeprecatedClassMethods:
20
+ Enabled: false
21
+ Lint/ElseLayout:
22
+ Enabled: false
23
+ Lint/SuppressedException:
24
+ Enabled: false
25
+ Lint/LiteralInInterpolation:
26
+ Enabled: false
27
+ Lint/Loop:
28
+ Enabled: false
29
+ Lint/ParenthesesAsGroupedExpression:
30
+ Enabled: false
31
+ Lint/RequireParentheses:
32
+ Enabled: false
33
+ Lint/UnderscorePrefixedVariableName:
34
+ Enabled: false
35
+ Lint/Void:
36
+ Enabled: false
37
+ Metrics/BlockLength:
38
+ Enabled: false
39
+ Metrics/ClassLength:
40
+ Enabled: false
41
+ Metrics/LineLength:
42
+ IgnoredPatterns:
43
+ - "^[ ]*describe.+$"
44
+ - "^[ ]*context.+$"
45
+ - "^[ ]*shared_context.+$"
46
+ - "^[ ]*shared_examples_for.+$"
47
+ - "^[ ]*it.+$"
48
+ - "^[ ]*'.+?' => '.+?',?$"
49
+ - "^[ ]*\".+?\" => \".+?\",?$"
50
+ - "^[ ]*.+?: .+?$"
51
+ Metrics/MethodLength:
52
+ Max: 30
53
+ Naming/AccessorMethodName:
54
+ Enabled: false
55
+ Naming/AsciiIdentifiers:
56
+ Enabled: false
57
+ Naming/BinaryOperatorParameterName:
58
+ Enabled: false
59
+ Style/ClassVars:
60
+ Enabled: false
61
+ Style/ColonMethodCall:
62
+ Enabled: false
63
+ Naming/FileName:
64
+ Enabled: false
65
+ Rails:
66
+ Enabled: true
67
+ Rails/Delegate:
68
+ Enabled: false
69
+ Rails/HttpPositionalArguments:
70
+ Enabled: false
71
+ Style/Alias:
72
+ Enabled: false
73
+ Style/ArrayJoin:
74
+ Enabled: false
75
+ Style/AsciiComments:
76
+ Enabled: false
77
+ Style/Attr:
78
+ Enabled: false
79
+ Style/CaseEquality:
80
+ Enabled: false
81
+ Style/CharacterLiteral:
82
+ Enabled: false
83
+ Style/ClassAndModuleChildren:
84
+ Enabled: false
4
85
  Style/CollectionMethods:
5
86
  PreferredMethods:
6
87
  find: detect
7
88
  reduce: inject
8
89
  collect: map
9
90
  find_all: select
91
+ Style/CommentAnnotation:
92
+ Enabled: false
93
+ Style/Documentation:
94
+ Enabled: false
95
+ Style/DoubleNegation:
96
+ Enabled: false
97
+ Style/EachWithObject:
98
+ Enabled: false
99
+ Style/EmptyLiteral:
100
+ Enabled: false
101
+ Style/Encoding:
102
+ Enabled: false
103
+ Style/EvenOdd:
104
+ Enabled: false
105
+ Lint/FlipFlop:
106
+ Enabled: false
107
+ Style/FormatString:
108
+ Enabled: false
10
109
  Style/FrozenStringLiteralComment:
11
110
  Enabled: false
111
+ Style/GlobalVars:
112
+ Enabled: false
113
+ Style/GuardClause:
114
+ Enabled: false
115
+ Style/IfUnlessModifier:
116
+ Enabled: false
117
+ Style/IfWithSemicolon:
118
+ Enabled: false
119
+ Style/InlineComment:
120
+ Enabled: false
121
+ Style/Lambda:
122
+ Enabled: false
123
+ Style/LambdaCall:
124
+ Enabled: false
125
+ Style/LineEndConcatenation:
126
+ Enabled: false
127
+ Style/MethodCalledOnDoEndBlock:
128
+ Enabled: false
129
+ Style/ModuleFunction:
130
+ Enabled: false
131
+ Style/NegatedIf:
132
+ Enabled: false
133
+ Style/NegatedWhile:
134
+ Enabled: false
135
+ Style/Next:
136
+ Enabled: false
137
+ Style/NilComparison:
138
+ Enabled: false
139
+ Style/Not:
140
+ Enabled: false
141
+ Style/NumericLiterals:
142
+ Enabled: false
143
+ Style/NumericPredicate:
144
+ Enabled: false
145
+ Style/OneLineConditional:
146
+ Enabled: false
147
+ Style/ParenthesesAroundCondition:
148
+ Enabled: false
149
+ Style/PercentLiteralDelimiters:
150
+ Enabled: false
151
+ Style/PerlBackrefs:
152
+ Enabled: false
153
+ Style/PreferredHashMethods:
154
+ Enabled: false
155
+ Style/Proc:
156
+ Enabled: false
157
+ Style/RaiseArgs:
158
+ Enabled: false
159
+ Style/RedundantParentheses:
160
+ Enabled: false
161
+ Style/RegexpLiteral:
162
+ Enabled: false
163
+ Style/SelfAssignment:
164
+ Enabled: false
165
+ Style/SignalException:
166
+ Enabled: false
167
+ Style/SingleLineBlockParams:
168
+ Enabled: false
169
+ Style/SingleLineMethods:
170
+ Enabled: false
171
+ Style/SpecialGlobalVars:
172
+ Enabled: false
12
173
  Style/StringLiterals:
13
174
  EnforcedStyle: single_quotes
175
+ Style/SymbolArray:
176
+ Enabled: false
177
+ Style/TrailingCommaInArguments:
178
+ EnforcedStyleForMultiline: consistent_comma
179
+ Style/TrailingCommaInArrayLiteral:
180
+ EnforcedStyleForMultiline: consistent_comma
181
+ Style/TrailingCommaInHashLiteral:
182
+ EnforcedStyleForMultiline: consistent_comma
183
+ Style/TrivialAccessors:
184
+ Enabled: false
185
+ Style/WhenThen:
186
+ Enabled: false
187
+ Style/WhileUntilModifier:
188
+ Enabled: false
189
+ Style/WordArray:
190
+ Enabled: false
191
+ Style/VariableInterpolation:
192
+ Enabled: false
@@ -0,0 +1 @@
1
+ 2.6.3
@@ -1,12 +1,27 @@
1
+ dist: trusty
1
2
  language: ruby
2
- sudo: false
3
- cache: bundler
4
- script: "bundle exec rake"
3
+ dist: xenial
5
4
  rvm:
6
- - 2.2.6
7
- - 2.3.3
8
- - 2.4.0
9
- - 2.5.1
5
+ - 2.4.6
6
+ - 2.5.5
7
+ - 2.6.3
10
8
  gemfile:
11
- - gemfiles/4.2.gemfile
12
- - gemfiles/5.0.gemfile
9
+ - gemfiles/rails_4_2.gemfile
10
+ - gemfiles/rails_5_0.gemfile
11
+ - gemfiles/rails_5_1.gemfile
12
+ - gemfiles/rails_5_2.gemfile
13
+ - gemfiles/rails_6_0.gemfile
14
+ matrix:
15
+ exclude:
16
+ - rvm: 2.4.6
17
+ gemfile: gemfiles/rails_6_0.gemfile
18
+ - rvm: 2.6.3
19
+ gemfile: gemfiles/rails_4_2.gemfile
20
+ # Source: <https://docs.travis-ci.com/user/languages/ruby/#bundler-20>
21
+ before_install:
22
+ - gem update --system '2.7.8' --no-document
23
+ - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
24
+ - gem install bundler -v '< 2' --no-document
25
+ - nvm use v11.0.0
26
+ install: "bundle install --jobs=3 --retry=3 --path vendor/bundle"
27
+ script: "bundle exec rake"
data/Appraisals CHANGED
@@ -1,18 +1,116 @@
1
+ # Note: All of the dependencies here were obtained by running `rails new` with
2
+ # various versions of Rails and copying lines from the generated Gemfile. It's
3
+ # best to keep the gems here in the same order as they're listed there so you
4
+ # can compare them more easily.
5
+
6
+ shared_rails_dependencies = proc do
7
+ gem 'sqlite3', platform: :ruby
8
+ end
9
+
10
+ shared_spring_dependencies = proc do
11
+ gem 'spring'
12
+ gem 'spring-commands-rspec'
13
+ end
14
+
15
+ shared_test_dependencies = proc do
16
+ gem 'minitest-reporters'
17
+ end
18
+
1
19
  shared_dependencies = proc do
2
- gem 'listen'
3
- gem 'sass-rails'
4
- gem 'sqlite3'
5
- gem 'rspec', '~> 3.0'
6
- gem 'shoulda-context'
7
- gem 'shoulda-matchers', '~> 3.0'
20
+ instance_eval(&shared_rails_dependencies)
21
+ instance_eval(&shared_spring_dependencies)
22
+ instance_eval(&shared_test_dependencies)
8
23
  end
9
24
 
10
- appraise '4.2' do
25
+ appraise 'rails_4_2' do
11
26
  instance_eval(&shared_dependencies)
12
- gem 'rails', '4.2.10'
27
+
28
+ gem 'rails', '~> 4.2.10'
29
+ gem 'sass-rails', '~> 5.0'
30
+ gem 'uglifier', '>= 1.3.0'
31
+ gem 'coffee-rails', '~> 4.1.0'
32
+ gem 'jquery-rails'
33
+ gem 'turbolinks'
34
+ gem 'jbuilder', '~> 2.0'
35
+ gem 'sdoc', '~> 0.4.0', group: :doc
36
+ gem 'bcrypt', '~> 3.1.7'
37
+
38
+ # Other dependencies we use
39
+ gem 'activeresource', '4.0.0'
40
+ gem 'json', '~> 1.4'
41
+ gem 'protected_attributes', '~> 1.0.6'
13
42
  end
14
43
 
15
- appraise '5.0' do
44
+ appraise 'rails_5_0' do
16
45
  instance_eval(&shared_dependencies)
17
- gem 'rails', '5.0.1'
46
+
47
+ gem 'rails', '~> 5.0.7'
48
+ gem 'rails-controller-testing', '>= 1.0.1'
49
+ gem 'puma', '~> 3.0'
50
+ gem 'sass-rails', '~> 5.0'
51
+ gem 'jquery-rails'
52
+ gem 'turbolinks', '~> 5'
53
+ gem 'jbuilder', '~> 2.5'
54
+ gem 'bcrypt', '~> 3.1.7'
55
+ gem 'listen', '~> 3.0.5'
56
+ gem 'spring-watcher-listen', '~> 2.0.0'
57
+ end
58
+
59
+ appraise 'rails_5_1' do
60
+ instance_eval(&shared_dependencies)
61
+ gem 'rails', '~> 5.1.6'
62
+ gem 'rails-controller-testing', '>= 1.0.1'
63
+ gem 'puma', '~> 3.7'
64
+ gem 'sass-rails', '~> 5.0'
65
+ gem 'turbolinks', '~> 5'
66
+ gem 'jbuilder', '~> 2.5'
67
+ gem 'bcrypt', '~> 3.1.7'
68
+ gem 'capybara', '~> 2.13'
69
+ gem 'selenium-webdriver'
70
+ gem 'listen', '>= 3.0.5', '< 3.2'
71
+ gem 'spring-watcher-listen', '~> 2.0.0'
72
+ end
73
+
74
+ appraise 'rails_5_2' do
75
+ instance_eval(&shared_dependencies)
76
+
77
+ gem 'rails', '~> 5.2.2'
78
+ gem 'rails-controller-testing', '>= 1.0.1'
79
+ gem 'puma', '~> 3.11'
80
+ gem 'bootsnap', '>= 1.1.0', require: false
81
+ gem 'sass-rails', '~> 5.0'
82
+ gem 'turbolinks', '~> 5'
83
+ gem 'jbuilder', '~> 2.5'
84
+ gem 'bcrypt', '~> 3.1.7'
85
+ gem 'capybara', '~> 3.1.1'
86
+ gem 'selenium-webdriver'
87
+ gem 'chromedriver-helper'
88
+ gem 'listen', '>= 3.0.5', '< 3.2'
89
+ gem 'spring-watcher-listen', '~> 2.0.0'
90
+ end
91
+
92
+ if (
93
+ Gem::Requirement.new('>= 2.5.0').satisfied_by?(Gem::Version.new(RUBY_VERSION))
94
+ )
95
+ appraise 'rails_6_0' do
96
+ instance_eval(&shared_dependencies)
97
+
98
+ gem 'rails', '~> 6.0.2'
99
+ gem 'puma', '~> 4.1'
100
+ gem 'sass-rails', '>= 6'
101
+ gem 'webpacker', '~> 4.0'
102
+ gem 'turbolinks', '~> 5'
103
+ gem 'jbuilder', '~> 2.7'
104
+ gem 'bcrypt', '~> 3.1.7'
105
+ gem 'bootsnap', '>= 1.4.2', require: false
106
+ gem 'listen', '>= 3.0.5', '< 3.2'
107
+ gem 'spring-watcher-listen', '~> 2.0.0'
108
+ gem 'capybara', '>= 2.15'
109
+ gem 'selenium-webdriver'
110
+ gem 'webdrivers'
111
+
112
+ # Other dependencies
113
+ gem 'rails-controller-testing', '>= 1.0.4'
114
+ gem 'pg', '~> 1.1', platform: :ruby
115
+ end
18
116
  end
data/Gemfile CHANGED
@@ -1,10 +1,14 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gemspec
4
+
3
5
  gem 'appraisal', '~> 2.1'
4
- gem 'rails', '>= 4.2', '< 6'
5
- gem 'pry'
6
- gem 'pry-byebug'
7
- gem 'sqlite3', '~> 1.3.11'
6
+ gem 'bundler', '~> 1.0'
7
+ gem 'm'
8
8
  gem 'minitest', '~> 5.0'
9
9
  gem 'minitest-reporters', '~> 1.0'
10
- gem 'm'
10
+ gem 'mry'
11
+ gem 'pry-byebug'
12
+ gem 'rubocop'
13
+ gem 'snowglobe'
14
+ gem 'warnings_logger'
data/README.md CHANGED
@@ -1,26 +1,28 @@
1
- # Shoulda [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![Downloads][downloads-badge]
1
+ # Shoulda [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![Downloads][downloads-badge] [![Hound][hound-badge]][hound]
2
2
 
3
3
  [version-badge]: http://img.shields.io/gem/v/shoulda.svg
4
4
  [rubygems]: http://rubygems.org/gems/shoulda
5
5
  [travis-badge]: http://img.shields.io/travis/thoughtbot/shoulda/master.svg
6
6
  [travis]: http://travis-ci.org/thoughtbot/shoulda
7
7
  [downloads-badge]: http://img.shields.io/gem/dtv/shoulda.svg
8
+ [hound-badge]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
9
+ [hound]: https://houndci.com
8
10
 
9
11
  Shoulda helps you write more understandable, maintainable Rails-specific tests
10
- using Minitest.
12
+ under Minitest.
11
13
 
12
- The `shoulda` gem doesn't contain any code of its own; it actually brings
13
- behavior from two other gems:
14
+ ## Overview
15
+
16
+ As a meta gem, the `shoulda` gem doesn't contain any code of its own but rather
17
+ brings in behavior from two other gems:
14
18
 
15
19
  * [Shoulda Context]
16
20
  * [Shoulda Matchers]
17
21
 
18
- See the READMEs for these projects for more information.
19
-
20
22
  [Shoulda Context]: https://github.com/thoughtbot/shoulda-context
21
23
  [Shoulda Matchers]: https://github.com/thoughtbot/shoulda-matchers
22
24
 
23
- ## Overview
25
+ For instance:
24
26
 
25
27
  ```ruby
26
28
  require "test_helper"
@@ -48,41 +50,46 @@ end
48
50
  Here, the `context` and `should` methods come from Shoulda Context; matchers
49
51
  (e.g. `have_many`, `allow_value`) come from Shoulda Matchers.
50
52
 
53
+ See the READMEs for these projects for more information.
54
+
51
55
  ## Compatibility
52
56
 
53
- Shoulda is tested and supported against Ruby 2.2-2.4, Rails 4.2-5.0, and
54
- Minitest 5.
57
+ Shoulda Matchers is [tested][travis] and supported against Ruby 2.4+, Rails 5.x,
58
+ Rails 4.2.x, RSpec 3.x, and Minitest 5.x.
55
59
 
56
60
  ## Contributing
57
61
 
58
62
  Shoulda is open source, and we are grateful for [everyone][contributors] who's
59
63
  contributed so far.
60
64
 
65
+ [contributors]: https://github.com/thoughtbot/shoulda/contributors
66
+
61
67
  If you'd like to contribute, please take a look at the
62
68
  [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
63
69
  pull request.
64
70
 
65
- [contributors]: https://github.com/thoughtbot/shoulda/contributors
66
-
67
71
  ## Versioning
68
72
 
69
73
  Shoulda follows Semantic Versioning 2.0 as defined at <http://semver.org>.
70
74
 
71
75
  ## License
72
76
 
73
- Shoulda is copyright © 2006-2017 [thoughtbot, inc][thoughtbot]. It is free
74
- software, and may be redistributed under the terms specified in the
75
- [MIT-LICENSE](MIT-LICENSE) file.
77
+ Shoulda is copyright © 2006-2019 thoughtbot, inc. It is free software, and may
78
+ be redistributed under the terms specified in the [MIT-LICENSE](MIT-LICENSE)
79
+ file.
76
80
 
77
81
  ## About thoughtbot
78
82
 
79
- [<img src="http://presskit.thoughtbot.com/images/signature.svg" width="250" alt="thoughtbot logo">][thoughtbot]
83
+ ![thoughtbot][thoughtbot-logo]
84
+
85
+ [thoughtbot-logo]: https://thoughtbot.com/brand_assets/93:44.svg
80
86
 
81
87
  Shoulda is maintained and funded by thoughtbot, inc. The names and logos for
82
88
  thoughtbot are trademarks of thoughtbot, inc.
83
89
 
84
- We are passionate about open source software. See [our other
85
- projects][community]. We are [available for hire][thoughtbot].
90
+ We love open source software! See [our other projects][community] or [hire
91
+ us][hire] to design, develop, and grow your product.
86
92
 
87
93
  [community]: https://thoughtbot.com/community?utm_source=github
94
+ [hire]: https://thoughtbot.com/hire-us?utm_source=github
88
95
  [thoughtbot]: https://thoughtbot.com?utm_source=github