cucumber-gherkin 23.0.1 → 26.2.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
2
  SHA256:
3
- metadata.gz: 92e8633ce3259f5f5667b48c7c6a90db7e26c3dd2c7b22ee4ce739557d8184d8
4
- data.tar.gz: cd3632fd9b741e133c307a0c9d346111374e23270ebdaddd61ba04274703e0f6
3
+ metadata.gz: af2b5602cd53419921854a98f765dceb9bb7f7eeff21e916f645d714db6fecda
4
+ data.tar.gz: 302c22cb981324b42974325f61a0eb3c5ee20dc8eaf2cbd7e90c2f893dc31209
5
5
  SHA512:
6
- metadata.gz: e30b4e2d3810caded572fae28310668537ff81b33659fbd7a8b634ded7247d8f324eab81a67216c4093147dec31be93d986e1a30ee72d781ece050c1c27192c7
7
- data.tar.gz: 9837170de884a9f01c939f9fa005132db1ef44d91517f54726397cb6c3caac6316f0ca2dc537d1314fd8a7da04857a192f3c949a15210ac7c51433c7650879b8
6
+ metadata.gz: 8d07a4dd58a8e9fc773a8361036badbfa7abd550b7bbbd63ccfaf43a8454491236657134371790580de3ef3c2f7acba8d4dfc65c9143e92d44acedd7841e783b
7
+ data.tar.gz: b107c64e600c1841b4ea275ee70eaac3426fe6e4c435e8da74883f944d0089a212b0646c40a0f2f26fe367e04a6f8027db8d44e3ca0fa4e719f2e645fe50fa40
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Gherkin for Ruby
2
2
 
3
- Gherkin parser/compiler for Ruby. Please see [Gherkin](https://github.com/cucumber/common/tree/main/gherkin) for details.
3
+ Gherkin parser/compiler for Ruby. Please see [Gherkin](https://github.com/cucumber/gherkin) for details.
4
4
 
5
5
  ## To build
6
6
 
@@ -116,6 +116,7 @@ module Gherkin
116
116
  step = Cucumber::Messages::Step.new(
117
117
  location: get_location(step_line, 0),
118
118
  keyword: step_line.matched_keyword,
119
+ keyword_type: step_line.matched_keyword_type,
119
120
  text: step_line.matched_text,
120
121
  data_table: data_table,
121
122
  doc_string: doc_string,
@@ -1,3 +1,4 @@
1
+ require 'cucumber/messages'
1
2
  require 'json'
2
3
 
3
4
  module Gherkin
@@ -277,6 +277,55 @@
277
277
  "Əgər ",
278
278
  "Nə vaxt ki "
279
279
  ]
280
+ },
281
+ "be": {
282
+ "and": [
283
+ "* ",
284
+ "I ",
285
+ "Ды ",
286
+ "Таксама "
287
+ ],
288
+ "background": [
289
+ "Кантэкст"
290
+ ],
291
+ "but": [
292
+ "* ",
293
+ "Але ",
294
+ "Інакш "
295
+ ],
296
+ "examples": [
297
+ "Прыклады"
298
+ ],
299
+ "feature": [
300
+ "Функцыянальнасць",
301
+ "Фіча"
302
+ ],
303
+ "given": [
304
+ "* ",
305
+ "Няхай ",
306
+ "Дадзена "
307
+ ],
308
+ "name": "Belarusian",
309
+ "native": "Беларуская",
310
+ "rule": [
311
+ "Правілы"
312
+ ],
313
+ "scenario": [
314
+ "Сцэнарый",
315
+ "Cцэнар"
316
+ ],
317
+ "scenarioOutline": [
318
+ "Шаблон сцэнарыя",
319
+ "Узор сцэнара"
320
+ ],
321
+ "then": [
322
+ "* ",
323
+ "Тады "
324
+ ],
325
+ "when": [
326
+ "* ",
327
+ "Калі "
328
+ ]
280
329
  },
281
330
  "bg": {
282
331
  "and": [
@@ -967,9 +1016,12 @@
967
1016
  ],
968
1017
  "when": [
969
1018
  "* ",
970
- "Tha ",
971
- "Þa ",
972
- "Ða "
1019
+ "Bæþsealf ",
1020
+ "Bæþsealfa ",
1021
+ "Bæþsealfe ",
1022
+ "Ciricæw ",
1023
+ "Ciricæwe ",
1024
+ "Ciricæwa "
973
1025
  ]
974
1026
  },
975
1027
  "en-pirate": {
@@ -1882,6 +1934,7 @@
1882
1934
  "ja": {
1883
1935
  "and": [
1884
1936
  "* ",
1937
+ "且つ",
1885
1938
  "かつ"
1886
1939
  ],
1887
1940
  "background": [
@@ -1889,6 +1942,7 @@
1889
1942
  ],
1890
1943
  "but": [
1891
1944
  "* ",
1945
+ "然し",
1892
1946
  "しかし",
1893
1947
  "但し",
1894
1948
  "ただし"
@@ -1908,7 +1962,7 @@
1908
1962
  "name": "Japanese",
1909
1963
  "native": "日本語",
1910
1964
  "rule": [
1911
- "Rule"
1965
+ "ルール"
1912
1966
  ],
1913
1967
  "scenario": [
1914
1968
  "シナリオ"
@@ -1979,44 +2033,57 @@
1979
2033
  "ka": {
1980
2034
  "and": [
1981
2035
  "* ",
1982
- "და"
2036
+ "და ",
2037
+ "ასევე "
1983
2038
  ],
1984
2039
  "background": [
1985
2040
  "კონტექსტი"
1986
2041
  ],
1987
2042
  "but": [
1988
2043
  "* ",
1989
- "მაგ­რამ"
2044
+ "მაგრამ ",
2045
+ "თუმცა "
1990
2046
  ],
1991
2047
  "examples": [
1992
2048
  "მაგალითები"
1993
2049
  ],
1994
2050
  "feature": [
1995
- "თვისება"
2051
+ "თვისება",
2052
+ "მოთხოვნა"
1996
2053
  ],
1997
2054
  "given": [
1998
2055
  "* ",
1999
- "მოცემული"
2056
+ "მოცემული ",
2057
+ "მოცემულია ",
2058
+ "ვთქვათ "
2000
2059
  ],
2001
2060
  "name": "Georgian",
2002
- "native": "ქართველი",
2061
+ "native": "ქართული",
2003
2062
  "rule": [
2004
- "Rule"
2063
+ "წესი"
2005
2064
  ],
2006
2065
  "scenario": [
2007
2066
  "მაგალითად",
2008
- "სცენარის"
2067
+ "მაგალითი",
2068
+ "მაგ",
2069
+ "სცენარი"
2009
2070
  ],
2010
2071
  "scenarioOutline": [
2011
- "სცენარის ნიმუში"
2072
+ "სცენარის ნიმუში",
2073
+ "სცენარის შაბლონი",
2074
+ "ნიმუში",
2075
+ "შაბლონი"
2012
2076
  ],
2013
2077
  "then": [
2014
2078
  "* ",
2015
- "მაშინ"
2079
+ "მაშინ "
2016
2080
  ],
2017
2081
  "when": [
2018
2082
  "* ",
2019
- "როდესაც"
2083
+ "როდესაც ",
2084
+ "როცა ",
2085
+ "როგორც კი ",
2086
+ "თუ "
2020
2087
  ]
2021
2088
  },
2022
2089
  "kn": {
@@ -2395,7 +2462,7 @@
2395
2462
  "and": [
2396
2463
  "* ",
2397
2464
  "र ",
2398
- "अनी "
2465
+ "अनि "
2399
2466
  ],
2400
2467
  "background": [
2401
2468
  "पृष्ठभूमी"
@@ -2764,7 +2831,8 @@
2764
2831
  "Функция",
2765
2832
  "Функциональность",
2766
2833
  "Функционал",
2767
- "Свойство"
2834
+ "Свойство",
2835
+ "Фича"
2768
2836
  ],
2769
2837
  "given": [
2770
2838
  "* ",
@@ -3459,7 +3527,7 @@
3459
3527
  ],
3460
3528
  "given": [
3461
3529
  "* ",
3462
- "Агар "
3530
+ "Belgilangan "
3463
3531
  ],
3464
3532
  "name": "Uzbek",
3465
3533
  "native": "Узбекча",
@@ -3555,7 +3623,8 @@
3555
3623
  "name": "Chinese simplified",
3556
3624
  "native": "简体中文",
3557
3625
  "rule": [
3558
- "Rule"
3626
+ "Rule",
3627
+ "规则"
3559
3628
  ],
3560
3629
  "scenario": [
3561
3630
  "场景",
@@ -3668,5 +3737,54 @@
3668
3737
  "* ",
3669
3738
  "जेव्हा "
3670
3739
  ]
3740
+ },
3741
+ "amh": {
3742
+ "and": [
3743
+ "* ",
3744
+ "እና "
3745
+ ],
3746
+ "background": [
3747
+ "ቅድመ ሁኔታ",
3748
+ "መነሻ",
3749
+ "መነሻ ሀሳብ"
3750
+ ],
3751
+ "but": [
3752
+ "* ",
3753
+ "ግን "
3754
+ ],
3755
+ "examples": [
3756
+ "ምሳሌዎች",
3757
+ "ሁናቴዎች"
3758
+ ],
3759
+ "feature": [
3760
+ "ስራ",
3761
+ "የተፈለገው ስራ",
3762
+ "የሚፈለገው ድርጊት"
3763
+ ],
3764
+ "given": [
3765
+ "* ",
3766
+ "የተሰጠ "
3767
+ ],
3768
+ "name": "Amharic",
3769
+ "native": "አማርኛ",
3770
+ "rule": [
3771
+ "ህግ"
3772
+ ],
3773
+ "scenario": [
3774
+ "ምሳሌ",
3775
+ "ሁናቴ"
3776
+ ],
3777
+ "scenarioOutline": [
3778
+ "ሁናቴ ዝርዝር",
3779
+ "ሁናቴ አብነት"
3780
+ ],
3781
+ "then": [
3782
+ "* ",
3783
+ "ከዚያ "
3784
+ ],
3785
+ "when": [
3786
+ "* ",
3787
+ "መቼ "
3788
+ ]
3671
3789
  }
3672
3790
  }
@@ -1,3 +1,5 @@
1
+ require 'cucumber/messages'
2
+
1
3
  module Gherkin
2
4
  module Pickles
3
5
  class Compiler
@@ -56,12 +58,17 @@ module Gherkin
56
58
  end
57
59
 
58
60
  def compile_scenario(inherited_tags, background_steps, scenario, language, pickles, source)
59
- steps = scenario.steps.empty? ? [] : [].concat(pickle_steps(background_steps))
60
-
61
61
  tags = [].concat(inherited_tags).concat(scenario.tags)
62
62
 
63
- scenario.steps.each do |step|
64
- steps.push(pickle_step(step))
63
+ last_keyword_type = Cucumber::Messages::PickleStepType::UNKNOWN
64
+ steps = []
65
+ unless scenario.steps.empty?
66
+ [].concat(background_steps).concat(scenario.steps).each do |step|
67
+ last_keyword_type =
68
+ step.keyword_type == Cucumber::Messages::StepKeywordType::CONJUNCTION ?
69
+ last_keyword_type : step.keyword_type
70
+ steps.push(Cucumber::Messages::PickleStep.new(**pickle_step_props(step, [], nil, last_keyword_type)))
71
+ end
65
72
  end
66
73
 
67
74
  pickle = Cucumber::Messages::Pickle.new(
@@ -81,12 +88,25 @@ module Gherkin
81
88
  variable_cells = examples.table_header.cells
82
89
  examples.table_body.each do |values_row|
83
90
  value_cells = values_row.cells
84
- steps = scenario.steps.empty? ? [] : [].concat(pickle_steps(background_steps))
85
91
  tags = [].concat(inherited_tags).concat(scenario.tags).concat(examples.tags)
86
92
 
87
- scenario.steps.each do |scenario_step|
88
- step_props = pickle_step_props(scenario_step, variable_cells, values_row)
89
- steps.push(Cucumber::Messages::PickleStep.new(**step_props))
93
+ last_keyword_type = nil
94
+ steps = []
95
+ unless scenario.steps.empty?
96
+ background_steps.each do |step|
97
+ last_keyword_type =
98
+ step.keyword_type == Cucumber::Messages::StepKeywordType::CONJUNCTION ?
99
+ last_keyword_type : step.keyword_type
100
+ step_props = pickle_step_props(step, [], nil, last_keyword_type)
101
+ steps.push(Cucumber::Messages::PickleStep.new(**step_props))
102
+ end
103
+ scenario.steps.each do |step|
104
+ last_keyword_type =
105
+ step.keyword_type == Cucumber::Messages::StepKeywordType::CONJUNCTION ?
106
+ last_keyword_type : step.keyword_type
107
+ step_props = pickle_step_props(step, variable_cells, values_row, last_keyword_type)
108
+ steps.push(Cucumber::Messages::PickleStep.new(**step_props))
109
+ end
90
110
  end
91
111
 
92
112
  pickle = Cucumber::Messages::Pickle.new(
@@ -115,21 +135,12 @@ module Gherkin
115
135
  name
116
136
  end
117
137
 
118
- def pickle_steps(steps)
119
- steps.map do |step|
120
- pickle_step(step)
121
- end
122
- end
123
-
124
- def pickle_step(step)
125
- Cucumber::Messages::PickleStep.new(**pickle_step_props(step, [], nil))
126
- end
127
-
128
- def pickle_step_props(step, variable_cells, values_row)
138
+ def pickle_step_props(step, variable_cells, values_row, keyword_type)
129
139
  value_cells = values_row ? values_row.cells : []
130
140
  props = {
131
141
  id: @id_generator.new_id,
132
142
  ast_node_ids: [step.id],
143
+ type: keyword_type,
133
144
  text: interpolate(step.text, variable_cells, value_cells),
134
145
  }
135
146
  if values_row
data/lib/gherkin/token.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Gherkin
2
2
  class Token < Struct.new(:line, :location)
3
3
  attr_accessor :matched_type, :matched_text, :matched_keyword, :matched_indent,
4
- :matched_items, :matched_gherkin_dialect
4
+ :matched_items, :matched_gherkin_dialect, :matched_keyword_type
5
5
 
6
6
  def eof?
7
7
  line.nil?
@@ -30,7 +30,7 @@ module Gherkin
30
30
  token.location[:line],
31
31
  token.location[:column],
32
32
  token.matched_type,
33
- token.matched_keyword,
33
+ token.matched_keyword ? sprintf("(%s)%s", token.matched_keyword_type, token.matched_keyword) : "",
34
34
  token.matched_text,
35
35
  Array(token.matched_items).map { |i| "#{i.column}:#{i.text}"}.join(',')
36
36
  end
@@ -1,3 +1,4 @@
1
+ require 'cucumber/messages'
1
2
  require_relative 'dialect'
2
3
  require_relative 'errors'
3
4
 
@@ -20,7 +21,7 @@ module Gherkin
20
21
  def match_TagLine(token)
21
22
  return false unless token.line.start_with?('@')
22
23
 
23
- set_token_matched(token, :TagLine, nil, nil, nil, token.line.tags)
24
+ set_token_matched(token, :TagLine, nil, nil, nil, nil, token.line.tags)
24
25
  true
25
26
  end
26
27
 
@@ -48,7 +49,8 @@ module Gherkin
48
49
  def match_TableRow(token)
49
50
  return false unless token.line.start_with?('|')
50
51
  # TODO: indent
51
- set_token_matched(token, :TableRow, nil, nil, nil, token.line.table_cells)
52
+ set_token_matched(token, :TableRow, nil, nil, nil, nil,
53
+ token.line.table_cells)
52
54
  true
53
55
  end
54
56
 
@@ -128,18 +130,40 @@ module Gherkin
128
130
  return false unless keyword
129
131
 
130
132
  title = token.line.get_rest_trimmed(keyword.length)
131
- set_token_matched(token, :StepLine, title, keyword)
133
+ keyword_types = @keyword_types[keyword]
134
+ keyword_type = keyword_types[0]
135
+ if keyword_types.length() > 1
136
+ keyword_type = Cucumber::Messages::StepKeywordType::UNKNOWN
137
+ end
138
+
139
+ set_token_matched(token,
140
+ :StepLine, title, keyword, nil, keyword_type)
132
141
  return true
133
142
  end
134
143
 
135
144
  private
136
145
 
146
+ def add_keyword_type_mappings(keywords, type)
147
+ keywords.each do |keyword|
148
+ if not @keyword_types.has_key?(keyword)
149
+ @keyword_types[keyword] = []
150
+ end
151
+ @keyword_types[keyword] += [type]
152
+ end
153
+ end
154
+
137
155
  def change_dialect(dialect_name, location)
138
156
  dialect = Dialect.for(dialect_name)
139
157
  raise NoSuchLanguageException.new(dialect_name, location) if dialect.nil?
140
158
 
141
159
  @dialect_name = dialect_name
142
160
  @dialect = dialect
161
+ @keyword_types = {}
162
+ add_keyword_type_mappings(@dialect.given_keywords, Cucumber::Messages::StepKeywordType::CONTEXT)
163
+ add_keyword_type_mappings(@dialect.when_keywords, Cucumber::Messages::StepKeywordType::ACTION)
164
+ add_keyword_type_mappings(@dialect.then_keywords, Cucumber::Messages::StepKeywordType::OUTCOME)
165
+ add_keyword_type_mappings(@dialect.and_keywords + @dialect.but_keywords,
166
+ Cucumber::Messages::StepKeywordType::CONJUNCTION)
143
167
  end
144
168
 
145
169
  def match_title_line(token, token_type, keywords)
@@ -152,12 +176,13 @@ module Gherkin
152
176
  true
153
177
  end
154
178
 
155
- def set_token_matched(token, matched_type, text = nil, keyword = nil, indent = nil, items = [])
179
+ def set_token_matched(token, matched_type, text = nil, keyword = nil, indent = nil, keyword_type = nil, items = [])
156
180
  token.matched_type = matched_type
157
181
  token.matched_text = text && text.chomp
158
182
  token.matched_keyword = keyword
159
183
  token.matched_indent = indent || (token.line && token.line.indent) || 0
160
184
  token.matched_items = items
185
+ token.matched_keyword_type = keyword_type
161
186
  token.location[:column] = token.matched_indent + 1
162
187
  token.matched_gherkin_dialect = @dialect_name
163
188
  end
@@ -4,7 +4,7 @@ require 'gherkin'
4
4
  describe Gherkin do
5
5
  it "can process feature file paths" do
6
6
  messages = Gherkin.from_paths(
7
- ["testdata/good/minimal.feature"],
7
+ ["../testdata/good/minimal.feature"],
8
8
  {include_source: true,
9
9
  include_gherkin_document: true,
10
10
  include_pickles: true}
@@ -14,7 +14,7 @@ describe Gherkin do
14
14
  end
15
15
 
16
16
  it "can process feature file content" do
17
- data = File.open("testdata/good/minimal.feature", 'r:UTF-8', &:read)
17
+ data = File.open("../testdata/good/minimal.feature", 'r:UTF-8', &:read)
18
18
 
19
19
  messages = Gherkin.from_source(
20
20
  "uri",
@@ -28,7 +28,7 @@ describe Gherkin do
28
28
  end
29
29
 
30
30
  it "can set the default dialect for the feature file content" do
31
- data = File.open("testdata/good/i18n_no.feature", 'r:UTF-8', &:read)
31
+ data = File.open("../testdata/good/i18n_no.feature", 'r:UTF-8', &:read)
32
32
  data_without_language_header = data.split("\n")[1..-1].join("\n")
33
33
 
34
34
  messages = Gherkin.from_source(
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber-gherkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 23.0.1
4
+ version: 26.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gáspár Nagy
@@ -10,28 +10,28 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-03-31 00:00:00.000000000 Z
13
+ date: 2023-04-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: cucumber-messages
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
20
- - !ruby/object:Gem::Version
21
- version: '18.0'
22
19
  - - ">="
23
20
  - !ruby/object:Gem::Version
24
- version: 18.0.0
21
+ version: 19.1.4
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '22.1'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
28
28
  requirements:
29
- - - "~>"
30
- - !ruby/object:Gem::Version
31
- version: '18.0'
32
29
  - - ">="
33
30
  - !ruby/object:Gem::Version
34
- version: 18.0.0
31
+ version: 19.1.4
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '22.1'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rake
37
37
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +80,6 @@ executables:
80
80
  extensions: []
81
81
  extra_rdoc_files: []
82
82
  files:
83
- - LICENSE
84
83
  - README.md
85
84
  - bin/gherkin
86
85
  - bin/gherkin-ruby
@@ -106,15 +105,15 @@ files:
106
105
  - spec/gherkin/parser_spec.rb
107
106
  - spec/gherkin/query_spec.rb
108
107
  - spec/gherkin/stream/parser_message_stream_spec.rb
109
- homepage: https://github.com/cucumber/gherkin-ruby
108
+ homepage: https://github.com/cucumber/gherkin
110
109
  licenses:
111
110
  - MIT
112
111
  metadata:
113
- bug_tracker_uri: https://github.com/cucumber/cucumber/issues
114
- changelog_uri: https://github.com/cucumber/common/blob/main/gherkin/CHANGELOG.md
112
+ bug_tracker_uri: https://github.com/cucumber/gherkin/issues
113
+ changelog_uri: https://github.com/cucumber/gherkin/blob/main/CHANGELOG.md
115
114
  documentation_uri: https://cucumber.io/docs/gherkin/
116
115
  mailing_list_uri: https://groups.google.com/forum/#!forum/cukes
117
- source_code_uri: https://github.com/cucumber/common/blob/main/gherkin/ruby
116
+ source_code_uri: https://github.com/cucumber/gherkin/blob/main/ruby
118
117
  post_install_message:
119
118
  rdoc_options:
120
119
  - "--charset=UTF-8"
@@ -131,15 +130,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
130
  - !ruby/object:Gem::Version
132
131
  version: '0'
133
132
  requirements: []
134
- rubygems_version: 3.1.2
133
+ rubygems_version: 3.2.22
135
134
  signing_key:
136
135
  specification_version: 4
137
- summary: cucumber-gherkin-23.0.1
136
+ summary: cucumber-gherkin-26.2.0
138
137
  test_files:
139
138
  - spec/capture_warnings.rb
140
- - spec/gherkin/gherkin_line_spec.rb
141
139
  - spec/gherkin/dialect_spec.rb
140
+ - spec/gherkin/gherkin_line_spec.rb
141
+ - spec/gherkin/gherkin_spec.rb
142
142
  - spec/gherkin/parser_spec.rb
143
- - spec/gherkin/stream/parser_message_stream_spec.rb
144
143
  - spec/gherkin/query_spec.rb
145
- - spec/gherkin/gherkin_spec.rb
144
+ - spec/gherkin/stream/parser_message_stream_spec.rb
data/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) Cucumber Ltd, Gaspar Nagy, Björn Rasmusson, Peter Sergeant
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.