@amirdaraee/namewise 0.3.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.
Files changed (105) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.yml +82 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.yml +61 -0
  3. package/.github/workflows/auto-release.yml +78 -0
  4. package/.github/workflows/ci.yml +78 -0
  5. package/.github/workflows/publish.yml +43 -0
  6. package/.github/workflows/test.yml +37 -0
  7. package/CHANGELOG.md +128 -0
  8. package/LICENSE +21 -0
  9. package/README.md +251 -0
  10. package/dist/cli/commands.d.ts +3 -0
  11. package/dist/cli/commands.d.ts.map +1 -0
  12. package/dist/cli/commands.js +19 -0
  13. package/dist/cli/commands.js.map +1 -0
  14. package/dist/cli/rename.d.ts +2 -0
  15. package/dist/cli/rename.d.ts.map +1 -0
  16. package/dist/cli/rename.js +136 -0
  17. package/dist/cli/rename.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +13 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/parsers/excel-parser.d.ts +6 -0
  23. package/dist/parsers/excel-parser.d.ts.map +1 -0
  24. package/dist/parsers/excel-parser.js +42 -0
  25. package/dist/parsers/excel-parser.js.map +1 -0
  26. package/dist/parsers/factory.d.ts +7 -0
  27. package/dist/parsers/factory.d.ts.map +1 -0
  28. package/dist/parsers/factory.js +29 -0
  29. package/dist/parsers/factory.js.map +1 -0
  30. package/dist/parsers/pdf-parser.d.ts +7 -0
  31. package/dist/parsers/pdf-parser.d.ts.map +1 -0
  32. package/dist/parsers/pdf-parser.js +67 -0
  33. package/dist/parsers/pdf-parser.js.map +1 -0
  34. package/dist/parsers/text-parser.d.ts +6 -0
  35. package/dist/parsers/text-parser.d.ts.map +1 -0
  36. package/dist/parsers/text-parser.js +39 -0
  37. package/dist/parsers/text-parser.js.map +1 -0
  38. package/dist/parsers/word-parser.d.ts +6 -0
  39. package/dist/parsers/word-parser.d.ts.map +1 -0
  40. package/dist/parsers/word-parser.js +44 -0
  41. package/dist/parsers/word-parser.js.map +1 -0
  42. package/dist/services/ai-factory.d.ts +5 -0
  43. package/dist/services/ai-factory.d.ts.map +1 -0
  44. package/dist/services/ai-factory.js +15 -0
  45. package/dist/services/ai-factory.js.map +1 -0
  46. package/dist/services/claude-service.d.ts +9 -0
  47. package/dist/services/claude-service.d.ts.map +1 -0
  48. package/dist/services/claude-service.js +113 -0
  49. package/dist/services/claude-service.js.map +1 -0
  50. package/dist/services/file-renamer.d.ts +12 -0
  51. package/dist/services/file-renamer.d.ts.map +1 -0
  52. package/dist/services/file-renamer.js +99 -0
  53. package/dist/services/file-renamer.js.map +1 -0
  54. package/dist/services/openai-service.d.ts +9 -0
  55. package/dist/services/openai-service.d.ts.map +1 -0
  56. package/dist/services/openai-service.js +112 -0
  57. package/dist/services/openai-service.js.map +1 -0
  58. package/dist/types/index.d.ts +61 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +2 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/utils/file-templates.d.ts +18 -0
  63. package/dist/utils/file-templates.d.ts.map +1 -0
  64. package/dist/utils/file-templates.js +232 -0
  65. package/dist/utils/file-templates.js.map +1 -0
  66. package/dist/utils/naming-conventions.d.ts +4 -0
  67. package/dist/utils/naming-conventions.d.ts.map +1 -0
  68. package/dist/utils/naming-conventions.js +55 -0
  69. package/dist/utils/naming-conventions.js.map +1 -0
  70. package/package.json +75 -0
  71. package/src/cli/commands.ts +20 -0
  72. package/src/cli/rename.ts +157 -0
  73. package/src/index.ts +17 -0
  74. package/src/parsers/excel-parser.ts +49 -0
  75. package/src/parsers/factory.ts +34 -0
  76. package/src/parsers/pdf-parser.ts +78 -0
  77. package/src/parsers/text-parser.ts +43 -0
  78. package/src/parsers/word-parser.ts +50 -0
  79. package/src/services/ai-factory.ts +16 -0
  80. package/src/services/claude-service.ts +114 -0
  81. package/src/services/file-renamer.ts +123 -0
  82. package/src/services/openai-service.ts +113 -0
  83. package/src/types/index.ts +71 -0
  84. package/src/types/pdf-extraction.d.ts +7 -0
  85. package/src/utils/file-templates.ts +275 -0
  86. package/src/utils/naming-conventions.ts +67 -0
  87. package/tests/data/empty-file.txt +0 -0
  88. package/tests/data/sample-markdown.md +9 -0
  89. package/tests/data/sample-pdf.pdf +0 -0
  90. package/tests/data/sample-text.txt +25 -0
  91. package/tests/integration/end-to-end.test.ts +209 -0
  92. package/tests/integration/workflow.test.ts +336 -0
  93. package/tests/mocks/mock-ai-service.ts +58 -0
  94. package/tests/unit/cli/commands.test.ts +163 -0
  95. package/tests/unit/parsers/factory.test.ts +100 -0
  96. package/tests/unit/parsers/pdf-parser.test.ts +63 -0
  97. package/tests/unit/parsers/text-parser.test.ts +85 -0
  98. package/tests/unit/services/ai-factory.test.ts +37 -0
  99. package/tests/unit/services/claude-service.test.ts +188 -0
  100. package/tests/unit/services/file-renamer.test.ts +299 -0
  101. package/tests/unit/services/openai-service.test.ts +196 -0
  102. package/tests/unit/utils/file-templates.test.ts +199 -0
  103. package/tests/unit/utils/naming-conventions.test.ts +88 -0
  104. package/tsconfig.json +20 -0
  105. package/vitest.config.ts +30 -0
@@ -0,0 +1,82 @@
1
+ name: Bug Report
2
+ description: File a bug report to help us improve
3
+ title: "[Bug]: "
4
+ labels: ["bug", "triage"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for taking the time to fill out this bug report!
10
+
11
+ - type: input
12
+ id: version
13
+ attributes:
14
+ label: Version
15
+ description: What version of smart-rename are you using?
16
+ placeholder: ex. 0.1.0
17
+ validations:
18
+ required: true
19
+
20
+ - type: dropdown
21
+ id: os
22
+ attributes:
23
+ label: Operating System
24
+ description: What operating system are you using?
25
+ options:
26
+ - Windows
27
+ - macOS
28
+ - Linux
29
+ - Other
30
+ validations:
31
+ required: true
32
+
33
+ - type: input
34
+ id: node-version
35
+ attributes:
36
+ label: Node.js Version
37
+ description: What version of Node.js are you using?
38
+ placeholder: ex. 20.0.0
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: what-happened
44
+ attributes:
45
+ label: What happened?
46
+ description: A clear and concise description of what the bug is.
47
+ placeholder: Tell us what you see!
48
+ validations:
49
+ required: true
50
+
51
+ - type: textarea
52
+ id: steps
53
+ attributes:
54
+ label: Steps to Reproduce
55
+ description: Steps to reproduce the behavior
56
+ placeholder: |
57
+ 1. Run command '...'
58
+ 2. With files '...'
59
+ 3. See error
60
+ validations:
61
+ required: true
62
+
63
+ - type: textarea
64
+ id: expected
65
+ attributes:
66
+ label: Expected Behavior
67
+ description: What did you expect to happen?
68
+ validations:
69
+ required: true
70
+
71
+ - type: textarea
72
+ id: logs
73
+ attributes:
74
+ label: Error Messages/Logs
75
+ description: If applicable, add error messages or logs
76
+ render: shell
77
+
78
+ - type: textarea
79
+ id: additional
80
+ attributes:
81
+ label: Additional Context
82
+ description: Add any other context about the problem here
@@ -0,0 +1,61 @@
1
+ name: Feature Request
2
+ description: Suggest an idea for this project
3
+ title: "[Feature]: "
4
+ labels: ["enhancement", "feature-request"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for suggesting a new feature!
10
+
11
+ - type: textarea
12
+ id: problem
13
+ attributes:
14
+ label: Problem Description
15
+ description: Is your feature request related to a problem? Please describe.
16
+ placeholder: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
17
+
18
+ - type: textarea
19
+ id: solution
20
+ attributes:
21
+ label: Proposed Solution
22
+ description: Describe the solution you'd like
23
+ placeholder: A clear and concise description of what you want to happen.
24
+ validations:
25
+ required: true
26
+
27
+ - type: textarea
28
+ id: alternatives
29
+ attributes:
30
+ label: Alternative Solutions
31
+ description: Describe alternatives you've considered
32
+ placeholder: A clear and concise description of any alternative solutions or features you've considered.
33
+
34
+ - type: dropdown
35
+ id: priority
36
+ attributes:
37
+ label: Priority
38
+ description: How important is this feature to you?
39
+ options:
40
+ - Low
41
+ - Medium
42
+ - High
43
+ - Critical
44
+ validations:
45
+ required: true
46
+
47
+ - type: checkboxes
48
+ id: implementation
49
+ attributes:
50
+ label: Implementation
51
+ description: Would you be willing to help implement this feature?
52
+ options:
53
+ - label: I would like to implement this feature
54
+ - label: I need help implementing this feature
55
+ - label: I can provide feedback during implementation
56
+
57
+ - type: textarea
58
+ id: additional
59
+ attributes:
60
+ label: Additional Context
61
+ description: Add any other context, screenshots, or examples about the feature request here.
@@ -0,0 +1,78 @@
1
+ name: Auto Release
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ paths:
7
+ - 'package.json'
8
+
9
+ jobs:
10
+ check-version:
11
+ runs-on: ubuntu-latest
12
+ outputs:
13
+ should-release: ${{ steps.version-check.outputs.should-release }}
14
+ new-version: ${{ steps.version-check.outputs.new-version }}
15
+
16
+ steps:
17
+ - name: Checkout code
18
+ uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Check if version changed
23
+ id: version-check
24
+ run: |
25
+ # Get current version from package.json
26
+ CURRENT_VERSION=$(node -p "require('./package.json').version")
27
+ echo "Current version: $CURRENT_VERSION"
28
+
29
+ # Check if tag already exists
30
+ if git tag --list | grep -q "^v$CURRENT_VERSION$"; then
31
+ echo "should-release=false" >> $GITHUB_OUTPUT
32
+ echo "Tag v$CURRENT_VERSION already exists"
33
+ else
34
+ echo "should-release=true" >> $GITHUB_OUTPUT
35
+ echo "new-version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
36
+ echo "New version detected: $CURRENT_VERSION"
37
+ fi
38
+
39
+ auto-release:
40
+ needs: check-version
41
+ runs-on: ubuntu-latest
42
+ if: needs.check-version.outputs.should-release == 'true'
43
+ permissions:
44
+ contents: write
45
+
46
+ steps:
47
+ - name: Checkout code
48
+ uses: actions/checkout@v4
49
+
50
+ - name: Setup Node.js
51
+ uses: actions/setup-node@v4
52
+ with:
53
+ node-version: '20.x'
54
+ cache: 'npm'
55
+ registry-url: 'https://registry.npmjs.org'
56
+
57
+ - name: Install dependencies
58
+ run: npm ci
59
+
60
+ - name: Run tests
61
+ run: npm run test:run
62
+
63
+ - name: Build project
64
+ run: npm run build
65
+
66
+ - name: Create and push tag
67
+ run: |
68
+ git config --local user.email "action@github.com"
69
+ git config --local user.name "GitHub Action"
70
+ git tag -a "v${{ needs.check-version.outputs.new-version }}" -m "Release v${{ needs.check-version.outputs.new-version }}"
71
+ git push origin "v${{ needs.check-version.outputs.new-version }}"
72
+ env:
73
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
74
+
75
+ - name: Publish to npm
76
+ run: npm publish
77
+ env:
78
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,78 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, develop ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ node-version: [18.x, 20.x, 22.x]
16
+
17
+ steps:
18
+ - name: Checkout code
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Setup Node.js ${{ matrix.node-version }}
22
+ uses: actions/setup-node@v4
23
+ with:
24
+ node-version: ${{ matrix.node-version }}
25
+ cache: 'npm'
26
+
27
+ - name: Install dependencies
28
+ run: npm ci
29
+
30
+ - name: Run linter (if available)
31
+ run: npm run lint --if-present
32
+
33
+ - name: Run tests
34
+ run: npm run test:run
35
+
36
+ - name: Run coverage
37
+ run: npm run test:coverage
38
+
39
+ - name: Build project
40
+ run: npm run build
41
+
42
+ - name: Test CLI
43
+ run: |
44
+ node dist/index.js --help
45
+ node dist/index.js --version
46
+
47
+ build:
48
+ needs: test
49
+ runs-on: ubuntu-latest
50
+ if: github.ref == 'refs/heads/main'
51
+
52
+ steps:
53
+ - name: Checkout code
54
+ uses: actions/checkout@v4
55
+
56
+ - name: Setup Node.js
57
+ uses: actions/setup-node@v4
58
+ with:
59
+ node-version: '20.x'
60
+ cache: 'npm'
61
+
62
+ - name: Install dependencies
63
+ run: npm ci
64
+
65
+ - name: Build project
66
+ run: npm run build
67
+
68
+ - name: Upload build artifacts
69
+ uses: actions/upload-artifact@v4
70
+ with:
71
+ name: build-artifacts
72
+ path: |
73
+ dist/
74
+ package.json
75
+ README.md
76
+ LICENSE
77
+ CHANGELOG.md
78
+ retention-days: 30
@@ -0,0 +1,43 @@
1
+ name: Publish Package
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ jobs:
8
+ publish-npm:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - uses: actions/setup-node@v4
13
+ with:
14
+ node-version: '22'
15
+ registry-url: https://registry.npmjs.org/
16
+ - run: npm ci
17
+ - run: npm run build
18
+ - run: npm run test:run
19
+ - run: npm publish
20
+ env:
21
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
22
+
23
+ publish-gpr:
24
+ runs-on: ubuntu-latest
25
+ permissions:
26
+ contents: read
27
+ packages: write
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - uses: actions/setup-node@v4
31
+ with:
32
+ node-version: '22'
33
+ registry-url: https://npm.pkg.github.com/
34
+ - run: npm ci
35
+ - run: npm run build
36
+ - run: npm run test:run
37
+ - name: Publish to GitHub Packages
38
+ run: |
39
+ echo "registry=https://npm.pkg.github.com/" > .npmrc
40
+ echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc
41
+ npm publish
42
+ env:
43
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,37 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ node-version: [18, 20, 22]
16
+
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Setup Node.js ${{ matrix.node-version }}
21
+ uses: actions/setup-node@v4
22
+ with:
23
+ node-version: ${{ matrix.node-version }}
24
+ cache: 'npm'
25
+
26
+ - name: Install dependencies
27
+ run: npm ci
28
+
29
+ - name: Build project
30
+ run: npm run build
31
+
32
+ - name: Run tests
33
+ run: npm run test:run
34
+
35
+ - name: Run coverage
36
+ run: npm run test:coverage
37
+ if: matrix.node-version == '22'
package/CHANGELOG.md ADDED
@@ -0,0 +1,128 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.3.0] - 2025-09-05
11
+
12
+ ### Added
13
+ - **🎯 Personal File Templates**: Customizable templates for different file categories
14
+ - `document`: Personal docs with name and date (e.g., `driving-license-amirhossein-20250213.pdf`)
15
+ - `movie`: Movies with release year (e.g., `the-dark-knight-2008.mkv`)
16
+ - `music`: Music with artist names (e.g., `the-beatles-hey-jude.mp3`)
17
+ - `series`: TV series with season/episode (e.g., `breaking-bad-s01e01.mkv`)
18
+ - `photo`: Photos with personal info (e.g., `vacation-paris-john-20240715.jpg`)
19
+ - `book`: Books with author names (e.g., `george-orwell-1984.pdf`)
20
+ - `general`: General files without special formatting
21
+ - **🤖 Smart File Categorization**: Automatically detects file type based on extension and content
22
+ - **👤 Personal Name Integration**: `-n, --name` option to include your name in documents
23
+ - **📅 Flexible Date Formats**: `-d, --date` option with formats:
24
+ - `YYYY-MM-DD`: 2025-09-05
25
+ - `YYYY`: 2025
26
+ - `YYYYMMDD`: 20250905
27
+ - `none`: No date (default)
28
+ - **📂 Category Templates**: `-t, --template` option to specify file category or use auto-detection
29
+
30
+ ### Enhanced
31
+ - AI prompts now include category-specific instructions for better filename generation
32
+ - File processing pipeline includes template application after AI generation
33
+ - Comprehensive test coverage with 131 tests (23 new tests for templates)
34
+
35
+ ### Examples
36
+ ```bash
37
+ # Personal documents with your name and date
38
+ namewise rename ./documents -t document -n "amirhossein" -d "YYYYMMDD" --dry-run
39
+ # Result: driving-license-amirhossein-20250905.pdf
40
+
41
+ # Movies with auto-detection
42
+ namewise rename ./movies --dry-run
43
+ # Result: the-dark-knight-2008.mkv
44
+
45
+ # Series with season/episode detection
46
+ namewise rename ./shows --dry-run
47
+ # Result: breaking-bad-s01e01.mkv
48
+
49
+ # Music with artist names
50
+ namewise rename ./music -t music --dry-run
51
+ # Result: the-beatles-hey-jude.mp3
52
+ ```
53
+
54
+ ## [0.2.0] - 2025-09-05
55
+
56
+ ### Added
57
+ - **Naming Convention Customization**: Added `-c, --case` option to choose naming convention
58
+ - `kebab-case`: lowercase-with-hyphens (default)
59
+ - `snake_case`: lowercase_with_underscores
60
+ - `camelCase`: camelCaseFormat
61
+ - `PascalCase`: PascalCaseFormat
62
+ - `lowercase`: lowercaseformat
63
+ - `UPPERCASE`: UPPERCASEFORMAT
64
+ - AI services now receive naming convention instructions and generate appropriately formatted filenames
65
+ - Enhanced filename sanitization with convention-aware processing
66
+
67
+ ### Example Usage
68
+ ```bash
69
+ # Use snake_case naming
70
+ namewise rename ./docs --case snake_case --dry-run
71
+
72
+ # Use camelCase naming
73
+ namewise rename ./docs --case camelCase --provider openai
74
+ ```
75
+
76
+ ## [0.1.5] - 2025-09-05
77
+
78
+ ### Improved
79
+ - Enhanced CLI user experience with single-line progress display that updates in place
80
+ - Improved results output format: clear `original-name → new-name` display instead of confusing double checkmarks
81
+ - Added progress counter showing current file being processed `(3/7)`
82
+ - Cleaner console output with proper line clearing after processing
83
+
84
+ ## [0.1.4] - 2025-09-05
85
+
86
+ ### Fixed
87
+ - Fixed console output formatting where `\n` was displayed as literal text instead of newlines
88
+ - Console output now properly displays line breaks for better readability
89
+
90
+ ## [0.1.3] - 2025-09-05
91
+
92
+ ### Changed
93
+ - Package renamed from `ai-rename` to `namewise` (clearer branding and avoids confusion with existing ai-renamer package)
94
+ - CLI binary name changed from `ai-rename` to `namewise`
95
+ - All documentation and references updated to reflect new name
96
+
97
+ ## [0.1.1] - 2025-09-05
98
+
99
+ ### Changed
100
+ - Package renamed from `smart-rename` to `ai-rename` (original name was taken on NPM)
101
+ - CLI binary name changed from `smart-rename` to `ai-rename`
102
+ - All documentation and references updated to reflect new name
103
+
104
+ ## [0.1.0] - 2025-09-05
105
+
106
+ ### Added
107
+ - Initial beta release of AI Rename
108
+ - AI-powered file renaming using Claude or OpenAI
109
+ - Support for PDF, Word, Excel, and text files
110
+ - Dry-run mode for safe previewing
111
+ - File conflict detection and prevention
112
+ - Configurable file size limits
113
+ - Interactive API key prompts
114
+ - Comprehensive test suite (65 tests, 90%+ branch coverage)
115
+ - CLI with intuitive commands and options
116
+
117
+ ### Features
118
+ - **Document Parsers**: PDF, DOCX, DOC, XLSX, XLS, TXT, MD, RTF
119
+ - **AI Providers**: Claude (Anthropic) and OpenAI support
120
+ - **Safety Features**: Dry-run mode, conflict detection, error handling
121
+ - **Configuration**: Flexible options for provider, API keys, and file sizes
122
+
123
+ ### Technical
124
+ - TypeScript implementation with strict typing
125
+ - ESM module support
126
+ - Node.js 18+ compatibility
127
+ - Vitest testing framework
128
+ - Commander.js CLI framework
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 smart-rename
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 all
13
+ 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 THE
21
+ SOFTWARE.