egn 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  repl.rb
19
+ .coveralls.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ - "2.1.0"
6
+ script: bundle exec rspec spec
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
+ [![Build Status](https://travis-ci.org/gmitrev/egn.svg?branch=master)](https://travis-ci.org/gmitrev/egn)
2
+ [![Coverage Status](https://coveralls.io/repos/gmitrev/egn/badge.png?branch=master)](https://coveralls.io/r/gmitrev/egn?branch=master)
3
+ [![Code Climate](https://codeclimate.com/github/gmitrev/egn.png)](https://codeclimate.com/github/gmitrev/egn)
1
4
  # Egn
2
5
 
3
- TODO: Write a gem description
6
+ EGN(ЕГН) is the national identification number of Bulgarian citizens. This gem
7
+ provides ways to generate, validate and parse any given valid number for
8
+ information.
4
9
 
5
10
  ## Installation
6
11
 
@@ -18,7 +23,42 @@ Or install it yourself as:
18
23
 
19
24
  ## Usage
20
25
 
21
- TODO: Write usage instructions here
26
+ require "egn"
27
+
28
+ # Quickly generate a random number
29
+ Egn.generate
30
+ # => "6101047500"
31
+
32
+ # Validate a given number
33
+ Egn.validate("6101047500")
34
+ # => true
35
+
36
+ # Create an new EGN object with a random number
37
+ egn = Egn::Egn.new
38
+ # => 9212094524
39
+
40
+ # OR generate EGN for a specific date
41
+ egn = Egn::Egn.new({year: 1945, month: 5, day: 8})
42
+ # => 4505085346
43
+
44
+ # OR parse an existing one
45
+ egn = Egn.parse("6101047500")
46
+ # => 6101047500
47
+
48
+ egn.birth_date
49
+ # => #<Date: 1961-01-04 ((2437304j,0s,0n),+0s,2299161j)>
50
+
51
+ egn.year
52
+ # => 1961
53
+
54
+ egn.month
55
+ # => 1
56
+
57
+ egn.day
58
+ # => 10
59
+
60
+ egn.valid?
61
+ # => true
22
62
 
23
63
  ## Contributing
24
64
 
data/Rakefile CHANGED
@@ -1 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'coveralls/rake/task'
4
+ Coveralls::RakeTask.new
5
+ task :test_with_coveralls => [:spec, :features, 'coveralls:push']
data/egn.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Egn::VERSION
9
9
  spec.authors = ["gmitrev"]
10
10
  spec.email = ["gvmitrev@gmail.com"]
11
- spec.description = %q{Generator, validator and info parser for EGN/EIK numbers}
12
- spec.summary = %q{An easy way to generate and validate EGN/EIK numbers and parse them for useful information}
11
+ spec.description = %q{Generator, validator and info parser for EGN numbers}
12
+ spec.summary = %q{An easy way to generate and validate EGN numbers and parse them for useful information}
13
13
  spec.homepage = "https://github.com/gmitrev/egn"
14
14
  spec.license = "MIT"
15
15
 
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec", "~> 2.6"
24
+ spec.add_development_dependency "coveralls"
24
25
  end
data/lib/egn/egn.rb ADDED
@@ -0,0 +1,60 @@
1
+ # The main data class
2
+ module Egn
3
+ class Egn
4
+ attr_reader :number, :birth_date
5
+
6
+ # Creates a new EGN object. Has different effects depending on the argument.
7
+ # When no arguments are given, it generates a new random EGN
8
+ # When a String is given, it is assumed that it is an EGN and is parsed
9
+ # When a hash is given, a new EGN is generated with the provided options
10
+ def initialize(args=nil)
11
+
12
+ if args.nil?
13
+ @number = Generator.generate
14
+ else
15
+ case args
16
+ when Hash
17
+ @number = Generator.generate(args)
18
+ when String
19
+ @number = args
20
+ raise ArgumentError, "Invalid EGN" unless self.valid?
21
+ else
22
+ raise ArgumentError, "Egn#new should be called either with an EGN or with an options hash"
23
+ end
24
+ end
25
+
26
+ parse!
27
+ end
28
+
29
+ # Is the number valid?
30
+ def valid?
31
+ @valid ||= Validator.validate(@number)
32
+ end
33
+
34
+ def day
35
+ @birth_date.day
36
+ end
37
+
38
+ def month
39
+ @birth_date.month
40
+ end
41
+
42
+ def year
43
+ @birth_date.year
44
+ end
45
+
46
+ def to_s
47
+ @number
48
+ end
49
+
50
+ private
51
+
52
+ # Extract the birth_date, sex and region
53
+ def parse!
54
+ info = Parser.new(@number)
55
+
56
+ @birth_date = info.date
57
+ end
58
+
59
+ end
60
+ end
data/lib/egn/generator.rb CHANGED
@@ -1,21 +1,27 @@
1
+ # Generates a random valid EGN
1
2
  module Egn
2
3
  module Generator
3
4
 
4
- PARITY_WEIGHTS = [2,4,8,5,10,9,7,3,6]
5
+ # The generated EGN will be completely random if no opitons are given.
6
+ # options is a hash that may have the following keys: :year, :month and :date
7
+ def self.generate(options={})
8
+ date = Util.time_rand
5
9
 
6
- def self.egn
7
- date = time_rand
8
- year = date.year
9
- mon = date.month
10
- day = date.day
10
+ options = {
11
+ year: date.year,
12
+ month: date.month,
13
+ day: date.day
14
+ }.merge(options)
11
15
 
12
- cent = year - (year % 100)
16
+ validate!(options)
17
+
18
+ century = options[:year] - (options[:year] % 100)
13
19
  sex = Random.rand(1..2)
14
20
 
15
- if cent == 1800
16
- mon += 20
17
- elsif cent == 2000
18
- mon += 40
21
+ if century == 1800
22
+ options[:month] += 20
23
+ elsif century == 2000
24
+ options[:month] += 40
19
25
  end
20
26
 
21
27
  region = Random.rand(0..999)
@@ -26,21 +32,18 @@ module Egn
26
32
  region += 1
27
33
  end
28
34
 
29
- final_year = year - cent
30
- egn = final_year.to_s.rjust(2, '0') + mon.to_s.rjust(2, '0') + day.to_s.rjust(2,'0') + region.to_s.rjust(3,'0')
35
+ final_year = options[:year] - century
36
+ egn = final_year.to_s.rjust(2, '0') + options[:month].to_s.rjust(2, '0') + options[:day].to_s.rjust(2,'0') + region.to_s.rjust(3,'0')
31
37
 
32
- return egn + egn_checksum(egn).to_s
38
+ return egn + Util.egn_checksum(egn).to_s
33
39
  end
34
40
 
35
- def self.egn_checksum(egn)
36
- sum = egn.split('').map(&:to_i).zip(PARITY_WEIGHTS).map { |n| n.reduce(:*) }.reduce(:+)
37
-
38
- rest = sum % 11
39
- rest < 10 ? rest : 0
41
+ # Check if the options contain a date that is valid and be turned into an EGN
42
+ def self.validate!(options)
43
+ raise ArgumentError, "Year out of bounds" unless (1800..2099).include?(options[:year])
44
+ raise ArgumentError, "Month out of bounds" unless (1..12).include?(options[:month])
45
+ raise ArgumentError, "Day out of bounds" unless (1..31).include?(options[:day])
40
46
  end
41
47
 
42
- def self.time_rand(from = 0.0, to = Time.now)
43
- Time.at(from + rand * (to.to_f - from.to_f))
44
- end
45
48
  end
46
49
  end
data/lib/egn/parser.rb CHANGED
@@ -1,34 +1,17 @@
1
1
  module Egn
2
2
  class Parser
3
+ attr_reader :date, :sex
3
4
 
5
+ # Parses the given EGN and returns all information that can be
6
+ # extracted from it: date, sex and region
4
7
  def initialize(egn)
5
- return ArgumentError, 'invalid length (should == 10)' unless egn.length == 10
8
+ raise ArgumentError, "Invalid EGN" unless Validator.validate(egn)
6
9
 
7
- @year, @month, @day = egn.scan(/.{1,2}/)
8
- @month = @month.to_i
9
- @day = @day.to_i
10
-
11
- case @month
12
- when (1..12)
13
- @year = "19#{@year}"
14
- when (21..32)
15
- @month -= 20
16
- @year = "18#{@year}"
17
- when (41..52)
18
- @month -= 40
19
- @year = "20#{@year}"
20
- end
21
- @year = @year.to_i
22
-
23
- raise ArgumentError, "invalid date" unless Date.valid_date? @year, @month, @day
24
- end
25
-
26
- def birth_date
27
- Date.parse("#{@year}-#{@month}-#{@day}")
28
- end
29
-
30
- def gender
10
+ # Extract the correct date
11
+ year, month, day = egn.scan(/.{1,2}/).map(&:to_i)
12
+ year, month = Util.determine_date(year, month)
31
13
 
14
+ @date = Date.new(year.to_i, month, day)
32
15
  end
33
16
 
34
17
  end
data/lib/egn/util.rb ADDED
@@ -0,0 +1,41 @@
1
+ # Contains some utility methods that are used by the other classes
2
+ module Egn
3
+ module Util
4
+ WEIGHTS = [2,4,8,5,10,9,7,3,6]
5
+
6
+ # The EGN can have three different formats depending on the century. It can
7
+ # be determined by examining the month.
8
+ # The rules are as follows:
9
+ # * For people born in 1900..1999 the month does not change
10
+ # * For people born in 1800..1899 the month is +20 (e.g January is 21)
11
+ # * For people born in 2000..2099 the month is +40 (e.g December is 52)
12
+ def self.determine_date(year, month)
13
+ case month
14
+ when (1..12)
15
+ year = "19#{year}"
16
+ when (21..32)
17
+ month -= 20
18
+ year = "18#{year}"
19
+ when (41..52)
20
+ month -= 40
21
+ year = "20#{year}"
22
+ end
23
+
24
+ [year.to_i, month]
25
+ end
26
+
27
+ # The checksum is calculated from the first 9 digits.
28
+ def self.egn_checksum(egn)
29
+ sum = egn.split('').map(&:to_i).zip(WEIGHTS).map { |n| n.reduce(:*) }.reduce(:+)
30
+
31
+ rest = sum % 11
32
+ rest < 10 ? rest : 0
33
+ end
34
+
35
+ # Get a random date
36
+ def self.time_rand(from = 0.0, to = Time.now)
37
+ Time.at(from + rand * (to.to_f - from.to_f))
38
+ end
39
+
40
+ end
41
+ end
data/lib/egn/validator.rb CHANGED
@@ -1,29 +1,18 @@
1
1
  module Egn
2
- module Validator
2
+ class Validator
3
3
 
4
- def self.egn(egn)
4
+ # Checks if a given EGN is valid
5
+ def self.validate(egn)
5
6
  return false unless egn.length == 10
6
7
 
7
- year, month, day = egn.scan(/.{1,2}/)
8
- month = month.to_i
9
- day = day.to_i
10
-
11
- case month
12
- when (1..12)
13
- year = "19#{year}"
14
- when (21..32)
15
- month -= 20
16
- year = "18#{year}"
17
- when (41..52)
18
- month -= 40
19
- year = "20#{year}"
20
- end
21
- year = year.to_i
8
+ # Extract the correct year and month
9
+ year, month, day = egn.scan(/.{1,2}/).map(&:to_i)
10
+ year, month = Util.determine_date(year, month)
22
11
 
23
12
  return false unless Date.valid_date? year, month, day
24
13
 
25
- checksum = Generator.egn_checksum egn[0,9]
26
-
14
+ # Calculate the checksum and check if the given one is correct
15
+ checksum = Util.egn_checksum egn[0,9]
27
16
  checksum == egn[9].to_i
28
17
  end
29
18
 
data/lib/egn/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Egn
2
- VERSION = "0.2.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/egn.rb CHANGED
@@ -1,22 +1,27 @@
1
1
  require "date"
2
2
 
3
- require "egn/generator"
3
+ require "egn/egn"
4
4
  require "egn/parser"
5
5
  require "egn/validator"
6
+ require "egn/generator"
6
7
  require "egn/version"
8
+ require "egn/util"
7
9
 
8
10
  module Egn
9
11
 
10
- def self.generate
11
- Generator.egn
12
+ # Quick generate: returns a new number
13
+ def self.generate(options={})
14
+ Generator.generate(options)
12
15
  end
13
16
 
17
+ # Quick validate
14
18
  def self.validate(egn)
15
- Validator.egn(egn)
19
+ Validator.validate(egn)
16
20
  end
17
21
 
22
+ # Quick parse
18
23
  def self.parse(egn)
19
- Parser.new(egn)
24
+ Egn.new(egn)
20
25
  end
21
26
 
22
27
  end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Egn" do
4
+
5
+ describe '.initialize' do
6
+
7
+ context "invoked with no args" do
8
+
9
+ it 'generates a valid number' do
10
+ egn = Egn::Egn.new
11
+
12
+ expect(egn).to be_valid
13
+ end
14
+
15
+ it 'returns different number every time' do
16
+ egn1 = Egn::Egn.new
17
+ egn2 = Egn::Egn.new
18
+
19
+ expect(egn1.number).not_to eq egn2.number
20
+ end
21
+
22
+ it "delegates the creation to Generators::Egn" do
23
+
24
+ Egn::Generator.should_receive(:generate).and_return "6101047500"
25
+
26
+ Egn::Egn.new
27
+ end
28
+
29
+ end
30
+
31
+ context "invoked with an EGN " do
32
+
33
+ it "returns a new Egn object if the provided EGN is valid" do
34
+ egn = Egn::Egn.new('6101047500')
35
+
36
+ expect(egn).to be_valid
37
+ end
38
+
39
+ it "raises an ArgumentError if the provided EGN is not valid" do
40
+ expect{
41
+ Egn::Egn.new("I'm invalid")
42
+ }.to raise_error ArgumentError
43
+ end
44
+
45
+ end
46
+
47
+ context "invoked with an options hash" do
48
+
49
+ it "passes the options to the #generate method" do
50
+ options = {
51
+ year: 1960,
52
+ month: 12
53
+ }
54
+
55
+ Egn::Generator.should_receive(:generate).with(options).and_return('6012081988')
56
+
57
+ Egn::Egn.new(options)
58
+ end
59
+
60
+ end
61
+
62
+ context "invoked with something else" do
63
+ it 'raises an ArgumentError' do
64
+ expect{
65
+ Egn::Egn.new([1,2,'hi'])
66
+ }.to raise_error ArgumentError
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "valid?" do
72
+ it 'delegates the validation to Validators::Egn' do
73
+ egn = Egn::Egn.new
74
+ Egn::Validator.should_receive(:validate).with(egn.number)
75
+ egn.valid?
76
+ end
77
+ end
78
+
79
+
80
+ describe 'validating'
81
+
82
+ describe 'parsing'
83
+
84
+ end
85
+
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe Egn::Generator do
4
+
5
+ describe "#generate" do
6
+ context "invoked with no arguments" do
7
+
8
+ it 'generates a valid number' do
9
+ egn = Egn::Generator.generate
10
+
11
+ expect(egn).not_to be_empty
12
+ end
13
+
14
+ it 'returns different number every time' do
15
+ egn1 = Egn::Generator.generate
16
+ egn2 = Egn::Generator.generate
17
+
18
+ expect(egn1).not_to eq egn2
19
+ end
20
+
21
+ end
22
+
23
+ context "invoked with arguments" do
24
+ it "generates a new EGN considering the given options" do
25
+ number = Egn::Generator.generate(year: 1990, month: 12, day: 30, sex: :m)
26
+ egn = Egn::Egn.new(number)
27
+
28
+ expect(egn).to be_valid
29
+ end
30
+
31
+ it "generates a new EGN with the given year" do
32
+ number = Egn::Generator.generate(year: 1990)
33
+ egn = Egn::Egn.new(number)
34
+
35
+ expect(egn.year).to eq(1990)
36
+ end
37
+
38
+ it "generates a new EGN with the given month" do
39
+ number = Egn::Generator.generate(month: 6)
40
+ egn = Egn::Egn.new(number)
41
+
42
+ expect(egn.month).to eq(6)
43
+ end
44
+
45
+ it "generates a new EGN with the given day" do
46
+ number = Egn::Generator.generate(day: 15)
47
+ egn = Egn::Egn.new(number)
48
+
49
+ expect(egn.day).to eq(15)
50
+ end
51
+
52
+ it "validates the options" do
53
+
54
+ options = {year: 1960, month: 6, day: 3}
55
+
56
+ Egn::Generator.should_receive(:validate!).with(options)
57
+
58
+ Egn::Generator.generate(options)
59
+ end
60
+
61
+
62
+ end
63
+ end
64
+
65
+ describe "#validate!" do
66
+
67
+ it "raises an exception if invalid year is given" do
68
+ expect{
69
+ Egn::Generator.generate(year: 1500)
70
+ }.to raise_error ArgumentError
71
+ end
72
+
73
+ it "raises an exception if invalid month is given" do
74
+ expect{
75
+ Egn::Generator.generate(month: 15)
76
+ }.to raise_error ArgumentError
77
+ end
78
+
79
+ it "raises an exception if invalid day is given" do
80
+ expect{
81
+ Egn::Generator.generate(day: 33)
82
+ }.to raise_error ArgumentError
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Egn::Parser do
4
+
5
+ describe "#initialize" do
6
+ it "raises an exception if the argument is invalid" do
7
+ expect{ Egn::Parser.new("12345678") }.to raise_error ArgumentError
8
+ end
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Egn::Validator do
4
+
5
+ describe "#validate" do
6
+
7
+ it "fails for strings with incorrect size" do
8
+ expect(Egn::Validator.validate("123456789")).to be_false
9
+ expect(Egn::Validator.validate("12345678901")).to be_false
10
+ end
11
+
12
+ it "fails for incorrect dates" do
13
+
14
+ expect(Egn::Validator.validate("6101347500")).to be_false
15
+ end
16
+
17
+ it "checks 500 000 of the generated numbers", :brute do
18
+ egns = Array.new(500_000).map{ |i| Egn.generate }
19
+ egns.each do |egn|
20
+ result = Egn::Validator.validate(egn)
21
+ puts egn unless result
22
+ expect(result).to be_true
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,17 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'egn'
5
+
6
+ require 'coveralls'
7
+ Coveralls.wear!
8
+
9
+ RSpec.configure do |config|
10
+ config.treat_symbols_as_metadata_keys_with_true_values = true
11
+ config.run_all_when_everything_filtered = true
12
+ config.filter_run :focus
13
+ config.filter_run_excluding :brute
14
+
15
+
16
+ config.order = 'random'
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-19 00:00:00.000000000 Z
12
+ date: 2014-03-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -59,7 +59,23 @@ dependencies:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '2.6'
62
- description: Generator, validator and info parser for EGN/EIK numbers
62
+ - !ruby/object:Gem::Dependency
63
+ name: coveralls
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Generator, validator and info parser for EGN numbers
63
79
  email:
64
80
  - gvmitrev@gmail.com
65
81
  executables: []
@@ -67,17 +83,25 @@ extensions: []
67
83
  extra_rdoc_files: []
68
84
  files:
69
85
  - .gitignore
86
+ - .rspec
87
+ - .travis.yml
70
88
  - Gemfile
71
89
  - LICENSE
72
- - LICENSE.txt
73
90
  - README.md
74
91
  - Rakefile
75
92
  - egn.gemspec
76
93
  - lib/egn.rb
94
+ - lib/egn/egn.rb
77
95
  - lib/egn/generator.rb
78
96
  - lib/egn/parser.rb
97
+ - lib/egn/util.rb
79
98
  - lib/egn/validator.rb
80
99
  - lib/egn/version.rb
100
+ - spec/egn/egn_spec.rb
101
+ - spec/egn/generator_spec.rb
102
+ - spec/egn/parser_spec.rb
103
+ - spec/egn/validator_spec.rb
104
+ - spec/spec_helper.rb
81
105
  homepage: https://github.com/gmitrev/egn
82
106
  licenses:
83
107
  - MIT
@@ -91,18 +115,28 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
115
  - - ! '>='
92
116
  - !ruby/object:Gem::Version
93
117
  version: '0'
118
+ segments:
119
+ - 0
120
+ hash: 152494033
94
121
  required_rubygems_version: !ruby/object:Gem::Requirement
95
122
  none: false
96
123
  requirements:
97
124
  - - ! '>='
98
125
  - !ruby/object:Gem::Version
99
126
  version: '0'
127
+ segments:
128
+ - 0
129
+ hash: 152494033
100
130
  requirements: []
101
131
  rubyforge_project:
102
132
  rubygems_version: 1.8.23
103
133
  signing_key:
104
134
  specification_version: 3
105
- summary: An easy way to generate and validate EGN/EIK numbers and parse them for useful
135
+ summary: An easy way to generate and validate EGN numbers and parse them for useful
106
136
  information
107
- test_files: []
108
- has_rdoc:
137
+ test_files:
138
+ - spec/egn/egn_spec.rb
139
+ - spec/egn/generator_spec.rb
140
+ - spec/egn/parser_spec.rb
141
+ - spec/egn/validator_spec.rb
142
+ - spec/spec_helper.rb
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 gmitrev
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.