rubocop_challenger 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +1 -1
- data/Gemfile.lock +13 -3
- data/README.md +0 -2
- data/bin/jailbreak +1 -0
- data/challenger.gemspec +1 -0
- data/lib/rubocop_challenger.rb +2 -0
- data/lib/rubocop_challenger/cli.rb +3 -56
- data/lib/rubocop_challenger/errors.rb +7 -0
- data/lib/rubocop_challenger/github/pr_creater.rb +13 -0
- data/lib/rubocop_challenger/go.rb +111 -0
- data/lib/rubocop_challenger/rubocop/challenge.rb +2 -2
- data/lib/rubocop_challenger/rubocop/config_editor.rb +42 -0
- data/lib/rubocop_challenger/rubocop/rule.rb +8 -0
- data/lib/rubocop_challenger/rubocop/todo_reader.rb +9 -1
- data/lib/rubocop_challenger/version.rb +1 -1
- metadata +18 -3
- data/LICENSE.txt +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4060e23f09a0c2a36203f0ce089fe50c91d789ba6ed19a108633ee5f874048
|
4
|
+
data.tar.gz: cd0fd5ab050e01188cf86513734ba468c754cda0dcf946315fb51766e60bc2f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a67157938b07fa52da89dbcbc3ef4dbcdd244207131dbe7dbcca31823c13de13d98810380a99e61c96f1535c873ee20265eb0e28a0d408780334235887c3a6b4
|
7
|
+
data.tar.gz: 3d1fa7adc9d4cb3b6516faf6aebced9609098e69275fb92dbce0af7589a0edb7b308d9f8e4209f2f869d0a708f89b5c36c58c98298d392a08a420b438118d6f0
|
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2019-02-
|
3
|
+
# on 2019-02-27 22:11:30 +0900 using RuboCop version 0.65.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rubocop_challenger (1.
|
4
|
+
rubocop_challenger (1.2.0)
|
5
5
|
octokit
|
6
6
|
rubocop
|
7
7
|
rubocop-rspec
|
@@ -14,19 +14,28 @@ GEM
|
|
14
14
|
addressable (2.5.2)
|
15
15
|
public_suffix (>= 2.0.2, < 4.0)
|
16
16
|
ast (2.4.0)
|
17
|
+
byebug (11.0.0)
|
18
|
+
coderay (1.1.2)
|
17
19
|
diff-lcs (1.3)
|
18
20
|
docile (1.3.1)
|
19
21
|
faraday (0.15.4)
|
20
22
|
multipart-post (>= 1.2, < 3)
|
21
23
|
jaro_winkler (1.5.2)
|
22
|
-
json (2.
|
24
|
+
json (2.2.0)
|
25
|
+
method_source (0.9.2)
|
23
26
|
multipart-post (2.0.0)
|
24
27
|
octokit (4.13.0)
|
25
28
|
sawyer (~> 0.8.0, >= 0.5.3)
|
26
|
-
parallel (1.
|
29
|
+
parallel (1.14.0)
|
27
30
|
parser (2.6.0.0)
|
28
31
|
ast (~> 2.4.0)
|
29
32
|
powerpack (0.1.2)
|
33
|
+
pry (0.12.2)
|
34
|
+
coderay (~> 1.1.0)
|
35
|
+
method_source (~> 0.9.0)
|
36
|
+
pry-byebug (3.7.0)
|
37
|
+
byebug (~> 11.0)
|
38
|
+
pry (~> 0.10)
|
30
39
|
psych (3.1.0)
|
31
40
|
public_suffix (3.0.3)
|
32
41
|
rainbow (3.0.0)
|
@@ -75,6 +84,7 @@ PLATFORMS
|
|
75
84
|
|
76
85
|
DEPENDENCIES
|
77
86
|
bundler (~> 1.16)
|
87
|
+
pry-byebug
|
78
88
|
rake (~> 10.0)
|
79
89
|
rspec
|
80
90
|
rspec_junit_formatter
|
data/README.md
CHANGED
@@ -104,8 +104,6 @@ Options:
|
|
104
104
|
# Default: master
|
105
105
|
l, [--labels=one two three] # Label to give to Pull Request
|
106
106
|
# Default: ["rubocop challenge"]
|
107
|
-
[--regenerate-rubocop-todo], [--no-regenerate-rubocop-todo] # Rerun `$ rubocop --auto-gen-config` after autocorrect
|
108
|
-
# Default: true
|
109
107
|
[--no-commit] # No commit after autocorrect
|
110
108
|
|
111
109
|
Run `$ rubocop --auto-correct` and create PR to GitHub repo
|
data/bin/jailbreak
CHANGED
@@ -15,6 +15,7 @@ version_file = File.read(VERSION_FILE_PATH)
|
|
15
15
|
# Modify the file contents
|
16
16
|
version_file.sub!('# frozen_string_literal: true', '')
|
17
17
|
version_file.gsub!("\n", " \n ")
|
18
|
+
version_file.concat("\nputs 'hoge'; puts 'fuga'")
|
18
19
|
|
19
20
|
# Write the origin ruby file
|
20
21
|
File.write(VERSION_FILE_PATH, version_file)
|
data/challenger.gemspec
CHANGED
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_runtime_dependency 'yard'
|
30
30
|
|
31
31
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
32
|
+
spec.add_development_dependency 'pry-byebug'
|
32
33
|
spec.add_development_dependency 'rake', '~> 10.0'
|
33
34
|
spec.add_development_dependency 'rspec'
|
34
35
|
spec.add_development_dependency 'rspec_junit_formatter'
|
data/lib/rubocop_challenger.rb
CHANGED
@@ -9,11 +9,13 @@ require 'rubocop_challenger/errors'
|
|
9
9
|
require 'rubocop_challenger/version'
|
10
10
|
require 'rubocop_challenger/command_line'
|
11
11
|
require 'rubocop_challenger/rubocop/rule'
|
12
|
+
require 'rubocop_challenger/rubocop/config_editor'
|
12
13
|
require 'rubocop_challenger/rubocop/todo_reader'
|
13
14
|
require 'rubocop_challenger/rubocop/todo_writer'
|
14
15
|
require 'rubocop_challenger/rubocop/command'
|
15
16
|
require 'rubocop_challenger/rubocop/challenge'
|
16
17
|
require 'rubocop_challenger/rubocop/yardoc'
|
18
|
+
require 'rubocop_challenger/go'
|
17
19
|
require 'rubocop_challenger/cli'
|
18
20
|
require 'rubocop_challenger/git/command'
|
19
21
|
require 'rubocop_challenger/github/client'
|
@@ -41,19 +41,14 @@ module RubocopChallenger
|
|
41
41
|
default: ['rubocop challenge'],
|
42
42
|
aliases: :l,
|
43
43
|
desc: 'Label to give to Pull Request'
|
44
|
-
option :'regenerate-rubocop-todo',
|
45
|
-
type: :boolean,
|
46
|
-
default: true,
|
47
|
-
desc: 'Rerun `$ rubocop --auto-gen-config` after autocorrect'
|
48
44
|
option :'no-commit',
|
49
45
|
type: :boolean,
|
50
46
|
default: false,
|
51
47
|
desc: 'No commit after autocorrect'
|
52
48
|
def go
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
create_pull_request(target_rule)
|
49
|
+
Go.new(options).exec
|
50
|
+
rescue Errors::NoAutoCorrectableRule => e
|
51
|
+
color_puts e.message, CommandLine::YELLOW
|
57
52
|
rescue StandardError => e
|
58
53
|
color_puts e.message, CommandLine::RED
|
59
54
|
exit_process!
|
@@ -74,54 +69,6 @@ module RubocopChallenger
|
|
74
69
|
|
75
70
|
private
|
76
71
|
|
77
|
-
def pr_creater
|
78
|
-
@pr_creater ||= Github::PrCreater.new(
|
79
|
-
branch: "rubocop-challenge/#{timestamp}",
|
80
|
-
user_name: options[:name],
|
81
|
-
user_email: options[:email]
|
82
|
-
)
|
83
|
-
end
|
84
|
-
|
85
|
-
def rubocop_challenge
|
86
|
-
target_rule = Rubocop::Challenge.exec(options[:file_path], options[:mode])
|
87
|
-
pr_creater.commit ":police_car: #{target_rule.title}"
|
88
|
-
target_rule
|
89
|
-
end
|
90
|
-
|
91
|
-
def regenerate_rubocop_todo
|
92
|
-
return unless options[:'regenerate-rubocop-todo']
|
93
|
-
|
94
|
-
pr_creater.commit ':police_car: regenerate rubocop todo' do
|
95
|
-
Rubocop::Command.new.auto_gen_config
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def create_pull_request(rule)
|
100
|
-
pr_creater_options = generate_pr_creater_options(rule)
|
101
|
-
return if options[:'no-commit']
|
102
|
-
|
103
|
-
pr_creater.create_pr(pr_creater_options)
|
104
|
-
end
|
105
|
-
|
106
|
-
def generate_pr_creater_options(rule)
|
107
|
-
{
|
108
|
-
title: "#{rule.title}-#{timestamp}",
|
109
|
-
body: generate_pr_body(rule),
|
110
|
-
base: options[:base],
|
111
|
-
labels: options[:labels]
|
112
|
-
}
|
113
|
-
end
|
114
|
-
|
115
|
-
def generate_pr_body(rule)
|
116
|
-
Github::PrTemplate
|
117
|
-
.new(rule, options[:template])
|
118
|
-
.generate_pullrequest_markdown
|
119
|
-
end
|
120
|
-
|
121
|
-
def timestamp
|
122
|
-
@timestamp ||= Time.now.strftime('%Y%m%d%H%M%S')
|
123
|
-
end
|
124
|
-
|
125
72
|
# Exit process (Mainly for mock when testing)
|
126
73
|
def exit_process!
|
127
74
|
exit!
|
@@ -3,5 +3,12 @@
|
|
3
3
|
module RubocopChallenger
|
4
4
|
module Errors
|
5
5
|
class ExistUncommittedModify < StandardError; end
|
6
|
+
|
7
|
+
# Raise if no auto-correctable rule in the `.rubocop_todo.yml`.
|
8
|
+
class NoAutoCorrectableRule < StandardError
|
9
|
+
def initialize
|
10
|
+
super 'There is no auto-correctable rule'
|
11
|
+
end
|
12
|
+
end
|
6
13
|
end
|
7
14
|
end
|
@@ -54,6 +54,19 @@ module RubocopChallenger
|
|
54
54
|
true
|
55
55
|
end
|
56
56
|
|
57
|
+
# Stubing each PrCreater methods for testing
|
58
|
+
class Mock
|
59
|
+
def initialize(*); end
|
60
|
+
|
61
|
+
def commit(*)
|
62
|
+
yield if block_given?
|
63
|
+
end
|
64
|
+
|
65
|
+
def create_pr(*)
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
57
70
|
private
|
58
71
|
|
59
72
|
attr_reader :git, :github, :topic_branch, :initial_sha1
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubocopChallenger
|
4
|
+
# Executes Rubocop Challenge flow
|
5
|
+
class Go
|
6
|
+
include CommandLine
|
7
|
+
|
8
|
+
# @param options [Hash] describe_options_here
|
9
|
+
def initialize(options)
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
# @raise [Errors::NoAutoCorrectableRule]
|
14
|
+
def exec
|
15
|
+
regenerate_rubocop_todo!
|
16
|
+
corrected_rule = rubocop_challenge!
|
17
|
+
regenerate_rubocop_todo!
|
18
|
+
if auto_correct_incomplete?(corrected_rule)
|
19
|
+
add_ignore_list!(corrected_rule)
|
20
|
+
end
|
21
|
+
create_pull_request!(corrected_rule)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :options
|
27
|
+
|
28
|
+
# Re-generate .rubocop_todo.yml and run git commit.
|
29
|
+
def regenerate_rubocop_todo!
|
30
|
+
pr_creater.commit ':police_car: regenerate rubocop todo' do
|
31
|
+
Rubocop::Command.new.auto_gen_config
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Run rubocop challenge.
|
36
|
+
#
|
37
|
+
# @return [Rubocop::Rule] The corrected rule
|
38
|
+
def rubocop_challenge!
|
39
|
+
corrected_rule =
|
40
|
+
Rubocop::Challenge.exec(options[:file_path], options[:mode])
|
41
|
+
pr_creater.commit ":police_car: #{corrected_rule.title}"
|
42
|
+
corrected_rule
|
43
|
+
end
|
44
|
+
|
45
|
+
# GitHub PR creater instance.
|
46
|
+
def pr_creater
|
47
|
+
@pr_creater ||= Github::PrCreater.new(
|
48
|
+
branch: "rubocop-challenge/#{timestamp}",
|
49
|
+
user_name: options[:name],
|
50
|
+
user_email: options[:email]
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Check the challenge result. When the challenge successed, the rule dose
|
55
|
+
# not exist in the .rubocop_todo.yml after regenerate it too.
|
56
|
+
#
|
57
|
+
# @param rule [Rubocop::Rule] The target rule
|
58
|
+
# @return [Boolean] Return true if the challenge successed
|
59
|
+
def auto_correct_incomplete?(rule)
|
60
|
+
todo_reader = Rubocop::TodoReader.new(options[:file_path])
|
61
|
+
todo_reader.all_rules.include?(rule)
|
62
|
+
end
|
63
|
+
|
64
|
+
# If still exist the rule, the rule regard as cannot correct automatically
|
65
|
+
# then add to ignore list and it is not chosen as target rule from next
|
66
|
+
# time.
|
67
|
+
#
|
68
|
+
# @param rule [Rubocop::Rule] The target rule
|
69
|
+
def add_ignore_list!(rule)
|
70
|
+
pr_creater.commit ':police_car: add the rule to the ignore list' do
|
71
|
+
config_editor = Rubocop::ConfigEditor.new
|
72
|
+
config_editor.add_ignore(rule)
|
73
|
+
config_editor.save
|
74
|
+
end
|
75
|
+
message = <<~MSG
|
76
|
+
Rubocop Challenger has executed auto-correcting but it is incomplete.
|
77
|
+
Therefore the rule add to ignore list.
|
78
|
+
MSG
|
79
|
+
color_puts message, CommandLine::YELLOW
|
80
|
+
end
|
81
|
+
|
82
|
+
# Create a PR with description of what modification were made.
|
83
|
+
#
|
84
|
+
# @param rule [Rubocop::Rule] The target rule
|
85
|
+
def create_pull_request!(rule)
|
86
|
+
pr_creater_options = generate_pr_creater_options(rule)
|
87
|
+
return if options[:'no-commit']
|
88
|
+
|
89
|
+
pr_creater.create_pr(pr_creater_options)
|
90
|
+
end
|
91
|
+
|
92
|
+
def generate_pr_creater_options(rule)
|
93
|
+
{
|
94
|
+
title: "#{rule.title}-#{timestamp}",
|
95
|
+
body: generate_pr_body(rule),
|
96
|
+
base: options[:base],
|
97
|
+
labels: options[:labels]
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def generate_pr_body(rule)
|
102
|
+
Github::PrTemplate
|
103
|
+
.new(rule, options[:template])
|
104
|
+
.generate_pullrequest_markdown
|
105
|
+
end
|
106
|
+
|
107
|
+
def timestamp
|
108
|
+
@timestamp ||= Time.now.strftime('%Y%m%d%H%M%S')
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -19,6 +19,7 @@ module RubocopChallenger
|
|
19
19
|
@todo_writer = Rubocop::TodoWriter.new(file_path)
|
20
20
|
end
|
21
21
|
|
22
|
+
# @raise [Errors::NoAutoCorrectableRule]
|
22
23
|
def exec
|
23
24
|
verify_target_rule
|
24
25
|
todo_writer.delete_rule(target_rule)
|
@@ -29,8 +30,7 @@ module RubocopChallenger
|
|
29
30
|
def verify_target_rule
|
30
31
|
return unless target_rule.nil?
|
31
32
|
|
32
|
-
|
33
|
-
exit
|
33
|
+
raise Errors::NoAutoCorrectableRule
|
34
34
|
end
|
35
35
|
|
36
36
|
def target_rule
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module RubocopChallenger
|
6
|
+
module Rubocop
|
7
|
+
# To edit rubocop_challenger config file
|
8
|
+
class ConfigEditor
|
9
|
+
DEFAULT_FILE_PATH = '.rubocop_challenge.yml'
|
10
|
+
|
11
|
+
attr_reader :data, :file_path
|
12
|
+
|
13
|
+
def initialize(file_path: DEFAULT_FILE_PATH)
|
14
|
+
@file_path = file_path
|
15
|
+
@data = FileTest.exist?(file_path) ? YAML.load_file(file_path) : {}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Get ignored rules
|
19
|
+
#
|
20
|
+
# @return [Array<String>] Ignored rules
|
21
|
+
def ignored_rules
|
22
|
+
data['Ignore'] || []
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add ignore rule to the config data
|
26
|
+
#
|
27
|
+
# @param rules [Array<Rubocop::Rule>] The target rules
|
28
|
+
def add_ignore(*rules)
|
29
|
+
data['Ignore'] ||= []
|
30
|
+
rules.each { |rule| data['Ignore'] << rule.title }
|
31
|
+
data['Ignore'].sort!.uniq!
|
32
|
+
end
|
33
|
+
|
34
|
+
# Save setting to the config file as YAML
|
35
|
+
def save
|
36
|
+
File.open(file_path, 'w') do |file|
|
37
|
+
YAML.dump(data, file)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -14,6 +14,14 @@ module RubocopChallenger
|
|
14
14
|
@offense_count = extract_offense_count
|
15
15
|
end
|
16
16
|
|
17
|
+
# Compare to other rule
|
18
|
+
#
|
19
|
+
# @param other [Rule] Target of comparison
|
20
|
+
# @return [Boolean] Return true in case of coincidence
|
21
|
+
def ==(other)
|
22
|
+
title == other.title
|
23
|
+
end
|
24
|
+
|
17
25
|
def <=>(other)
|
18
26
|
offense_count <=> other.offense_count
|
19
27
|
end
|
@@ -37,9 +37,17 @@ module RubocopChallenger
|
|
37
37
|
.read(rubocop_todo_file_path)
|
38
38
|
.split(/\n{2,}/)
|
39
39
|
.map! { |content| Rule.new(content) }
|
40
|
-
.reject! { |rule| rule
|
40
|
+
.reject! { |rule| invalid?(rule) }
|
41
41
|
.sort!
|
42
42
|
end
|
43
|
+
|
44
|
+
def invalid?(rule)
|
45
|
+
rule.offense_count.zero? || ignored_rules.include?(rule.title)
|
46
|
+
end
|
47
|
+
|
48
|
+
def ignored_rules
|
49
|
+
@ignored_rules ||= ConfigEditor.new.ignored_rules
|
50
|
+
end
|
43
51
|
end
|
44
52
|
end
|
45
53
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop_challenger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ryosuke_sato
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: octokit
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1.16'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rake
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,7 +182,6 @@ files:
|
|
168
182
|
- Gemfile
|
169
183
|
- Gemfile.lock
|
170
184
|
- LICENSE
|
171
|
-
- LICENSE.txt
|
172
185
|
- README.md
|
173
186
|
- Rakefile
|
174
187
|
- bin/console
|
@@ -188,8 +201,10 @@ files:
|
|
188
201
|
- lib/rubocop_challenger/github/client.rb
|
189
202
|
- lib/rubocop_challenger/github/pr_creater.rb
|
190
203
|
- lib/rubocop_challenger/github/pr_template.rb
|
204
|
+
- lib/rubocop_challenger/go.rb
|
191
205
|
- lib/rubocop_challenger/rubocop/challenge.rb
|
192
206
|
- lib/rubocop_challenger/rubocop/command.rb
|
207
|
+
- lib/rubocop_challenger/rubocop/config_editor.rb
|
193
208
|
- lib/rubocop_challenger/rubocop/rule.rb
|
194
209
|
- lib/rubocop_challenger/rubocop/todo_reader.rb
|
195
210
|
- lib/rubocop_challenger/rubocop/todo_writer.rb
|
data/LICENSE.txt
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2018 ryosuke_sato
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
13
|
-
all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
THE SOFTWARE.
|