license_finder 0.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. data/.gitignore +12 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +15 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +22 -0
  6. data/Rakefile +21 -0
  7. data/bin/license_finder +54 -0
  8. data/db/migrate/201303290935_create_dependencies.rb +14 -0
  9. data/db/migrate/201303291155_create_licenses.rb +13 -0
  10. data/db/migrate/201303291402_create_approvals.rb +13 -0
  11. data/db/migrate/201303291456_create_ancestries.rb +9 -0
  12. data/db/migrate/201303291519_create_bundler_groups.rb +13 -0
  13. data/db/migrate/201303291720_move_manual_from_approvals_to_licenses.rb +11 -0
  14. data/db/migrate/201303291753_allow_null_license_names.rb +7 -0
  15. data/db/migrate/201304011027_allow_null_dependency_version.rb +7 -0
  16. data/db/migrate/201304020947_change_table_name_licenses_to_license_aliases.rb +5 -0
  17. data/features/approve_dependencies.feature +14 -0
  18. data/features/html_report.feature +38 -0
  19. data/features/ignore_bundle_groups.feature +11 -0
  20. data/features/license_finder.feature +47 -0
  21. data/features/license_finder_rake_task.feature +37 -0
  22. data/features/rails_rake.feature +9 -0
  23. data/features/set_license.feature +12 -0
  24. data/features/step_definitions/license_finder_steps.rb +25 -0
  25. data/features/step_definitions/steps.rb +376 -0
  26. data/features/text_report.feature +27 -0
  27. data/features/whitelist.feature +24 -0
  28. data/files/license_finder.yml +8 -0
  29. data/lib/data/licenses/Apache2.txt +172 -0
  30. data/lib/data/licenses/BSD.txt +24 -0
  31. data/lib/data/licenses/GPLv2.txt +339 -0
  32. data/lib/data/licenses/ISC.txt +2 -0
  33. data/lib/data/licenses/LGPL.txt +165 -0
  34. data/lib/data/licenses/MIT.txt +9 -0
  35. data/lib/data/licenses/NewBSD.txt +21 -0
  36. data/lib/data/licenses/Ruby.txt +52 -0
  37. data/lib/data/licenses/SimplifiedBSD.txt +23 -0
  38. data/lib/license_finder.rb +47 -0
  39. data/lib/license_finder/bundle.rb +48 -0
  40. data/lib/license_finder/bundle_syncer.rb +11 -0
  41. data/lib/license_finder/bundled_gem.rb +48 -0
  42. data/lib/license_finder/cli.rb +49 -0
  43. data/lib/license_finder/configuration.rb +71 -0
  44. data/lib/license_finder/dependency_report.rb +30 -0
  45. data/lib/license_finder/gem_saver.rb +69 -0
  46. data/lib/license_finder/html_report.rb +14 -0
  47. data/lib/license_finder/license.rb +90 -0
  48. data/lib/license_finder/license/apache2.rb +8 -0
  49. data/lib/license_finder/license/bsd.rb +4 -0
  50. data/lib/license_finder/license/gplv2.rb +4 -0
  51. data/lib/license_finder/license/isc.rb +3 -0
  52. data/lib/license_finder/license/lgpl.rb +3 -0
  53. data/lib/license_finder/license/mit.rb +23 -0
  54. data/lib/license_finder/license/new_bsd.rb +8 -0
  55. data/lib/license_finder/license/ruby.rb +11 -0
  56. data/lib/license_finder/license/simplified_bsd.rb +8 -0
  57. data/lib/license_finder/license_files.rb +36 -0
  58. data/lib/license_finder/license_url.rb +12 -0
  59. data/lib/license_finder/platform.rb +32 -0
  60. data/lib/license_finder/possible_license_file.rb +32 -0
  61. data/lib/license_finder/railtie.rb +7 -0
  62. data/lib/license_finder/reporter.rb +20 -0
  63. data/lib/license_finder/tables.rb +7 -0
  64. data/lib/license_finder/tables/approval.rb +4 -0
  65. data/lib/license_finder/tables/bundler_group.rb +4 -0
  66. data/lib/license_finder/tables/dependency.rb +31 -0
  67. data/lib/license_finder/tables/license_alias.rb +22 -0
  68. data/lib/license_finder/text_report.rb +9 -0
  69. data/lib/license_finder/yml_to_sql.rb +127 -0
  70. data/lib/tasks/license_finder.rake +7 -0
  71. data/lib/templates/html_report.erb +111 -0
  72. data/lib/templates/text_report.erb +3 -0
  73. data/license_finder.gemspec +36 -0
  74. data/readme.md +115 -0
  75. data/spec/fixtures/APACHE-2-LICENSE +202 -0
  76. data/spec/fixtures/GPLv2 +339 -0
  77. data/spec/fixtures/ISC-LICENSE +10 -0
  78. data/spec/fixtures/MIT-LICENSE +22 -0
  79. data/spec/fixtures/MIT-LICENSE-with-varied-disclaimer +22 -0
  80. data/spec/fixtures/README-with-MIT-LICENSE +222 -0
  81. data/spec/fixtures/license_directory/COPYING +0 -0
  82. data/spec/fixtures/license_directory/LICENSE/BSD-2-Clause.txt +25 -0
  83. data/spec/fixtures/license_directory/LICENSE/GPL-2.0.txt +339 -0
  84. data/spec/fixtures/license_directory/LICENSE/LICENSE +191 -0
  85. data/spec/fixtures/license_directory/LICENSE/MIT.txt +21 -0
  86. data/spec/fixtures/license_directory/LICENSE/RUBY.txt +60 -0
  87. data/spec/fixtures/license_names/COPYING.txt +0 -0
  88. data/spec/fixtures/license_names/LICENSE +0 -0
  89. data/spec/fixtures/license_names/Licence.rdoc +0 -0
  90. data/spec/fixtures/license_names/Mit-License +0 -0
  91. data/spec/fixtures/license_names/README.rdoc +0 -0
  92. data/spec/fixtures/mit_licensed_gem/LICENSE +22 -0
  93. data/spec/fixtures/nested_gem/vendor/LICENSE +0 -0
  94. data/spec/fixtures/nested_readme/vendor/README +0 -0
  95. data/spec/fixtures/other_licensed_gem/LICENSE +3 -0
  96. data/spec/fixtures/readme/Project ReadMe b/data/spec/fixtures/readme/Project → ReadMe +0 -0
  97. data/spec/fixtures/readme/README +0 -0
  98. data/spec/fixtures/readme/Readme.markdown +0 -0
  99. data/spec/fixtures/utf8_gem/README +210 -0
  100. data/spec/lib/license_finder/bundle_spec.rb +61 -0
  101. data/spec/lib/license_finder/bundle_syncer_spec.rb +16 -0
  102. data/spec/lib/license_finder/bundled_gem_spec.rb +62 -0
  103. data/spec/lib/license_finder/cli_spec.rb +38 -0
  104. data/spec/lib/license_finder/configuration_spec.rb +70 -0
  105. data/spec/lib/license_finder/gem_saver_spec.rb +155 -0
  106. data/spec/lib/license_finder/html_report_spec.rb +84 -0
  107. data/spec/lib/license_finder/license/apache_spec.rb +7 -0
  108. data/spec/lib/license_finder/license/bsd_spec.rb +41 -0
  109. data/spec/lib/license_finder/license/gplv2_spec.rb +7 -0
  110. data/spec/lib/license_finder/license/isc_spec.rb +7 -0
  111. data/spec/lib/license_finder/license/lgpl_spec.rb +7 -0
  112. data/spec/lib/license_finder/license/mit_spec.rb +33 -0
  113. data/spec/lib/license_finder/license/new_bsd_spec.rb +35 -0
  114. data/spec/lib/license_finder/license/ruby_spec.rb +19 -0
  115. data/spec/lib/license_finder/license/simplified_bsd_spec.rb +7 -0
  116. data/spec/lib/license_finder/license_files_spec.rb +50 -0
  117. data/spec/lib/license_finder/license_spec.rb +45 -0
  118. data/spec/lib/license_finder/license_url_spec.rb +20 -0
  119. data/spec/lib/license_finder/possible_license_file_spec.rb +37 -0
  120. data/spec/lib/license_finder/reporter_spec.rb +4 -0
  121. data/spec/lib/license_finder/tables/dependency_spec.rb +102 -0
  122. data/spec/lib/license_finder/tables/license_alias_spec.rb +54 -0
  123. data/spec/lib/license_finder/text_report_spec.rb +31 -0
  124. data/spec/lib/license_finder/yml_to_sql_spec.rb +99 -0
  125. data/spec/lib/license_finder_spec.rb +82 -0
  126. data/spec/spec_helper.rb +31 -0
  127. data/spec/support/license_examples.rb +30 -0
  128. metadata +435 -0
@@ -0,0 +1,38 @@
1
+ require "spec_helper"
2
+
3
+ module LicenseFinder
4
+ describe CLI do
5
+ describe "#execute!(options)" do
6
+ before { CLI.stub(:check_for_action_items) }
7
+
8
+ context "when the approve option is provided" do
9
+ it "should approve the requested gem" do
10
+ dependency = double('dependency', :name => nil)
11
+ dependency.should_receive(:approve!)
12
+
13
+ Dependency.stub(:first).with(name: 'foo').and_return(dependency)
14
+
15
+ CLI.execute! approve: true, dependency: 'foo'
16
+ end
17
+ end
18
+
19
+ context "when the -l (--license) switch is provided" do
20
+ it "should update the license on the requested gem" do
21
+ dependency = double :dependency, :name => nil
22
+ dependency.should_receive(:set_license_manually).with("foo")
23
+
24
+ Dependency.stub(:first).with(name: "foo_gem").and_return dependency
25
+
26
+ CLI.execute! license: "foo", dependency: 'foo_gem'
27
+ end
28
+ end
29
+
30
+ context "when no options are provided" do
31
+ it "should check for action items" do
32
+ CLI.should_receive(:check_for_action_items)
33
+ CLI.execute!
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,70 @@
1
+ require "spec_helper"
2
+
3
+ module LicenseFinder
4
+ describe Configuration do
5
+ let(:config) { described_class.new }
6
+
7
+ let(:klass) { described_class }
8
+
9
+ describe '.new' do
10
+ let(:attributes) do
11
+ {
12
+ "whitelist" => ["FooLicense", "BarLicense"],
13
+ "ignore_groups" => [:test, :development],
14
+ "dependencies_file_dir" => "."
15
+ }
16
+ end
17
+
18
+ subject { klass.new(attributes) }
19
+
20
+ context "with known attributes" do
21
+ it "should set the all of the attributes on the instance" do
22
+ subject.whitelist.should == attributes['whitelist']
23
+ subject.ignore_groups.should == attributes['ignore_groups']
24
+ subject.dependencies_dir.should == attributes['dependencies_file_dir']
25
+ end
26
+ end
27
+
28
+ it "uses absolute path in database_path" do
29
+ subject.database_path.should_not start_with(".")
30
+ end
31
+ end
32
+
33
+ describe "#whitelist" do
34
+ it "should default to an empty array" do
35
+ klass.new.whitelist.should == []
36
+ end
37
+ end
38
+
39
+ describe "whitelisted?" do
40
+ context "canonical name whitelisted" do
41
+ before { config.whitelist = [License::Apache2.names[rand(License::Apache2.names.count)]]}
42
+
43
+ let(:possible_license_names) { License::Apache2.names }
44
+
45
+ it "should return true if if the license is the canonical name, pretty name, or alternative name of the license" do
46
+ possible_license_names.each do |name|
47
+ config.whitelisted?(name).should be_true, "expected #{name} to be whitelisted, but wasn't."
48
+ end
49
+ end
50
+
51
+ it "should be case-insensitive" do
52
+ possible_license_names.map(&:downcase).each do |name|
53
+ config.whitelisted?(name).should be_true, "expected #{name} to be whitelisted, but wasn't"
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ describe "#ignore_groups" do
60
+ it "should default to an empty array" do
61
+ config.ignore_groups.should == []
62
+ end
63
+
64
+ it "should always return symbolized versions of the ignore groups" do
65
+ config.ignore_groups = %w[test development]
66
+ config.ignore_groups.should == [:test, :development]
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,155 @@
1
+ require 'spec_helper'
2
+
3
+ module LicenseFinder
4
+ describe GemSaver do
5
+ let(:gemspec) do
6
+ Gem::Specification.new do |s|
7
+ s.name = 'spec_name'
8
+ s.version = '2.1.3'
9
+ s.summary = 'summary'
10
+ s.description = 'description'
11
+ s.homepage = 'homepage'
12
+
13
+ s.add_dependency 'foo'
14
+ end
15
+ end
16
+
17
+ describe "#save" do
18
+ let(:bundled_gem) { BundledGem.new(gemspec) }
19
+ subject { described_class.find_or_initialize_by_name('spec_name', bundled_gem).save }
20
+
21
+ context "when the dependency is new" do
22
+ it "persists gem data" do
23
+ subject.id.should be
24
+ subject.name.should == "spec_name"
25
+ subject.version.should == "2.1.3"
26
+ subject.summary.should == "summary"
27
+ subject.description.should == "description"
28
+ subject.homepage.should == "homepage"
29
+ end
30
+
31
+ it "associates children" do
32
+ subject.children.map(&:name).should == ['foo']
33
+ end
34
+
35
+ it "marks depenency as unapproved by default" do
36
+ subject.approval.state.should == nil
37
+ end
38
+
39
+ context "with a bundler dependency" do
40
+ let(:bundled_gem) { BundledGem.new(gemspec, stub(:bundler_dependency, groups: %w[1 2 3]))}
41
+
42
+ it "saves the bundler groups" do
43
+ subject.bundler_groups.map(&:name).should =~ %w[1 2 3]
44
+ end
45
+ end
46
+ end
47
+
48
+ context "when the dependency already existed" do
49
+ let!(:old_copy) do
50
+ Dependency.create(
51
+ name: 'spec_name',
52
+ version: '0.1.2',
53
+ summary: 'old summary',
54
+ description: 'old desription',
55
+ homepage: 'old homepage'
56
+ )
57
+ end
58
+
59
+ it "merges in the latest data" do
60
+ subject.id.should == old_copy.id
61
+ subject.name.should == old_copy.name
62
+ subject.version.should == "2.1.3"
63
+ subject.summary.should == "summary"
64
+ subject.description.should == "description"
65
+ subject.homepage.should == "homepage"
66
+ end
67
+
68
+ it "keeps a manually assigned license" do
69
+ old_copy.license = LicenseAlias.create(name: 'foo', manual: true)
70
+ old_copy.save
71
+ subject.license.name.should == 'foo'
72
+ end
73
+
74
+ it "keeps approval" do
75
+ old_copy.approval = Approval.create(state: true)
76
+ old_copy.save
77
+ subject.approval.state.should == true
78
+ end
79
+
80
+ it "ensures correct children are associated" do
81
+ old_copy.add_child Dependency.new(name: 'bob')
82
+ old_copy.add_child Dependency.new(name: 'joe')
83
+ old_copy.children.each(&:save)
84
+ subject.children.map(&:name).should =~ ['foo']
85
+ end
86
+
87
+ context "with a bundler dependency" do
88
+ let(:bundled_gem) { BundledGem.new(gemspec, stub(:bundler_dependency, groups: %w[1 2 3]))}
89
+
90
+ before do
91
+ old_copy.add_bundler_group BundlerGroup.find_or_create(name: 'a')
92
+ old_copy.add_bundler_group BundlerGroup.find_or_create(name: 'b')
93
+ end
94
+
95
+ it "ensures the correct bundler groups are associated" do
96
+ subject.bundler_groups.map(&:name).should =~ %w[1 2 3]
97
+ end
98
+ end
99
+
100
+ context "license changes to something other than 'other'" do
101
+ before do
102
+ old_copy.license = LicenseAlias.create(name: 'other')
103
+ old_copy.save
104
+ gemspec.license = "new license"
105
+ end
106
+
107
+ context "new license is whitelisted" do
108
+ before { LicenseFinder.config.stub(:whitelist).and_return [gemspec.license] }
109
+
110
+ it "should set the approval to true" do
111
+ subject.should be_approved
112
+ end
113
+ end
114
+
115
+ context "new license is not whitelisted" do
116
+ it "should set the approval to false" do
117
+ subject.should_not be_approved
118
+ end
119
+ end
120
+ end
121
+
122
+ context "license changes to unknown (i.e., 'other')" do
123
+ before do
124
+ old_copy.license = LicenseAlias.create(name: 'MIT')
125
+ old_copy.approval = Approval.create(state: false)
126
+ old_copy.save
127
+ gemspec.license = "other"
128
+ end
129
+
130
+ it "should not change the license" do
131
+ subject.license.name.should == 'MIT'
132
+ end
133
+
134
+ it "should not change the approval" do
135
+ subject.should_not be_approved
136
+ end
137
+ end
138
+
139
+ context "license does not change" do
140
+ before do
141
+ old_copy.license = LicenseAlias.create(name: 'MIT')
142
+ old_copy.approval = Approval.create(state: false)
143
+ old_copy.save
144
+ gemspec.license = "MIT"
145
+ end
146
+
147
+ it "should not change the license or approval" do
148
+ subject.should_not be_approved
149
+ subject.license.name.should == "MIT"
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,84 @@
1
+ require "spec_helper"
2
+ require "capybara"
3
+
4
+ module LicenseFinder
5
+ describe HtmlReport do
6
+ describe "#to_s" do
7
+ let(:dependency) do
8
+ dep = Dependency.new name: "the-name"
9
+ dep.license = LicenseAlias.create name: 'MIT'
10
+ dep.approval = Approval.create state: true
11
+ dep
12
+ end
13
+
14
+ subject { Capybara.string(HtmlReport.new([dependency]).to_s) }
15
+
16
+ context "when the dependency is approved" do
17
+ it "should add an approved class to dependency's container" do
18
+ should have_selector ".approved"
19
+ end
20
+
21
+ it "does not list the dependency in the action items" do
22
+ should_not have_selector ".action-items"
23
+ end
24
+ end
25
+
26
+ context "when the dependency is not approved" do
27
+ before { dependency.approval.state = false }
28
+
29
+ it "should not add an approved class to he dependency's container" do
30
+ should have_selector ".unapproved"
31
+ end
32
+
33
+ it "lists the dependency in the action items" do
34
+ should have_selector ".action-items li"
35
+ end
36
+ end
37
+
38
+ context "when the gem has at least one bundler group" do
39
+ before { dependency.stub(bundler_groups: [stub(name: "group")]) }
40
+ it "should show the bundler group(s) in parens" do
41
+ should have_text "(group)"
42
+ end
43
+ end
44
+
45
+ context "when the gem has no bundler groups" do
46
+ before { dependency.stub(bundler_groups: []) }
47
+
48
+ it "should not show any parens or bundler group info" do
49
+ should_not have_text "()"
50
+ end
51
+
52
+ end
53
+
54
+ context "when the gem has at least one parent" do
55
+ before { dependency.stub(parents: [stub(:name => "foo parent")]) }
56
+ it "should include a parents section" do
57
+ should have_text "Parents"
58
+ should have_text "foo parent"
59
+ end
60
+ end
61
+
62
+ context "when the gem has no parents" do
63
+ it "should not include any parents section in the output" do
64
+ should_not have_text "Parents"
65
+ end
66
+ end
67
+
68
+ context "when the gem has at least one child" do
69
+ before { dependency.stub(children: [stub(:name => "foo child")]) }
70
+
71
+ it "should include a Children section" do
72
+ should have_text "Children"
73
+ should have_text "foo child"
74
+ end
75
+ end
76
+
77
+ context "when the gem has no children" do
78
+ it "should not include any Children section in the output" do
79
+ should_not have_text "Children"
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenseFinder::License::Apache2 do
4
+ subject { LicenseFinder::License::Apache2.new("") }
5
+
6
+ it_behaves_like "a license matcher"
7
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenseFinder::License::BSD do
4
+ subject { LicenseFinder::License::BSD.new("") }
5
+
6
+ it_behaves_like "a license matcher"
7
+
8
+ it "should match regardless of organization or copyright holder names or quotes" do
9
+ license = LicenseFinder::License::BSD.new <<-LICENSE
10
+ Copyright (c) 2000, Widgets, Inc.
11
+ All rights reserved.
12
+
13
+ Redistribution and use in source and binary forms, with or without
14
+ modification, are permitted provided that the following conditions are met:
15
+ 1. Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+ 2. Redistributions in binary form must reproduce the above copyright
18
+ notice, this list of conditions and the following disclaimer in the
19
+ documentation and/or other materials provided with the distribution.
20
+ 3. All advertising materials mentioning features or use of this software
21
+ must display the following acknowledgement:
22
+ This product includes software developed by <organization>.
23
+ 4. Neither the name of foo bar *%*%*%*% nor the
24
+ names of its contributors may be used to endorse or promote products
25
+ derived from this software without specific prior written permission.
26
+
27
+ THIS SOFTWARE IS PROVIDED BY awesome *$*$* copyright name 'AS IS' AND ANY
28
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
29
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
31
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
32
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
33
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
34
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
+ LICENSE
38
+
39
+ license.should be_matches
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenseFinder::License::GPLv2 do
4
+ subject { LicenseFinder::License::GPLv2.new("") }
5
+
6
+ it_behaves_like "a license matcher"
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenseFinder::License::ISC do
4
+ subject { LicenseFinder::License::ISC.new("") }
5
+
6
+ it_behaves_like "a license matcher"
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenseFinder::License::LGPL do
4
+ subject { LicenseFinder::License::LGPL.new("") }
5
+
6
+ it_behaves_like "a license matcher"
7
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe LicenseFinder::License::MIT do
4
+ subject { LicenseFinder::License::MIT.new("") }
5
+
6
+ it_behaves_like "a license matcher"
7
+
8
+ describe "#matches?" do
9
+ it "should return true if the text contains the MIT url" do
10
+ subject.text = "MIT License is awesome http://opensource.org/licenses/mit-license"
11
+ should be_matches
12
+
13
+ subject.text = "MIT Licence is awesome http://www.opensource.org/licenses/mit-license"
14
+ should be_matches
15
+ end
16
+
17
+ it "should return true if the text contains 'The MIT License'" do
18
+ subject.text = "The MIT License"
19
+ should be_matches
20
+
21
+ subject.text = "The MIT Licence"
22
+ should be_matches
23
+ end
24
+
25
+ it "should return true if the text contains 'is released under the MIT license'" do
26
+ subject.text = "is released under the MIT license"
27
+ should be_matches
28
+
29
+ subject.text = "is released under the MIT licence"
30
+ should be_matches
31
+ end
32
+ end
33
+ end