node-pandas 1.0.4 → 2.0.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.
- package/.kiro/agents/git-committer-agent.md +208 -0
- package/.kiro/agents/npm-publisher-agent.md +501 -0
- package/.kiro/publish-status-2.0.0.md +134 -0
- package/.kiro/published-versions.md +11 -0
- package/.kiro/specs/pandas-like-enhancements/.config.kiro +1 -0
- package/.kiro/specs/pandas-like-enhancements/design.md +377 -0
- package/.kiro/specs/pandas-like-enhancements/requirements.md +257 -0
- package/.kiro/specs/pandas-like-enhancements/tasks.md +477 -0
- package/CHANGELOG.md +42 -0
- package/README.md +375 -103
- package/TESTING_SETUP.md +183 -0
- package/jest.config.js +25 -0
- package/package.json +11 -3
- package/src/bases/CsvBase.js +4 -13
- package/src/dataframe/dataframe.js +596 -64
- package/src/features/GroupBy.js +561 -0
- package/src/features/dateRange.js +106 -0
- package/src/index.js +6 -1
- package/src/series/series.js +690 -14
- package/src/utils/errors.js +314 -0
- package/src/utils/getIndicesColumns.js +1 -1
- package/src/utils/getTransformedDataList.js +1 -1
- package/src/utils/logger.js +259 -0
- package/src/utils/typeDetection.js +339 -0
- package/src/utils/utils.js +5 -1
- package/src/utils/validation.js +450 -0
- package/tests/README.md +151 -0
- package/tests/integration/.gitkeep +0 -0
- package/tests/integration/README.md +3 -0
- package/tests/property/.gitkeep +0 -0
- package/tests/property/README.md +3 -0
- package/tests/setup.js +16 -0
- package/tests/test.js +58 -21
- package/tests/unit/.gitkeep +0 -0
- package/tests/unit/README.md +3 -0
- package/tests/unit/dataframe.test.js +1141 -0
- package/tests/unit/example.test.js +23 -0
- package/tests/unit/series.test.js +441 -0
- package/tests/unit/tocsv.test.js +838 -0
- package/tests/utils/testAssertions.js +143 -0
- package/tests/utils/testDataGenerator.js +123 -0
package/TESTING_SETUP.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Testing Infrastructure Setup - Complete
|
|
2
|
+
|
|
3
|
+
This document summarizes the testing infrastructure setup for the node-pandas library.
|
|
4
|
+
|
|
5
|
+
## What Was Set Up
|
|
6
|
+
|
|
7
|
+
### 1. Testing Framework: Jest
|
|
8
|
+
- **Framework**: Jest 29.7.0
|
|
9
|
+
- **Environment**: Node.js
|
|
10
|
+
- **Configuration**: `jest.config.js`
|
|
11
|
+
- **Features**:
|
|
12
|
+
- Zero-config setup
|
|
13
|
+
- Built-in assertion library
|
|
14
|
+
- Code coverage reporting with Istanbul/nyc
|
|
15
|
+
- Watch mode for development
|
|
16
|
+
- Snapshot testing support
|
|
17
|
+
|
|
18
|
+
### 2. Directory Structure
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
tests/
|
|
22
|
+
├── unit/ # Unit tests for individual functions
|
|
23
|
+
├── integration/ # Integration tests for workflows
|
|
24
|
+
├── property/ # Property-based tests
|
|
25
|
+
├── utils/
|
|
26
|
+
│ ├── testDataGenerator.js # Sample data generation utilities
|
|
27
|
+
│ └── testAssertions.js # Custom assertion utilities
|
|
28
|
+
├── setup.js # Test environment setup
|
|
29
|
+
└── README.md # Testing documentation
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 3. Test Utilities
|
|
33
|
+
|
|
34
|
+
#### Test Data Generator (`tests/utils/testDataGenerator.js`)
|
|
35
|
+
Provides functions to generate sample data:
|
|
36
|
+
- `generateNumericArray()` - Numeric arrays
|
|
37
|
+
- `generateMixedArray()` - Mixed-type arrays
|
|
38
|
+
- `generate2DArray()` - 2D arrays for DataFrames
|
|
39
|
+
- `generateDataFrameData()` - Sample DataFrame data
|
|
40
|
+
- `generateCategoricalData()` - Data with categories
|
|
41
|
+
- `generateDataWithNulls()` - Data with null values
|
|
42
|
+
- `generateMergeData()` - Datasets for merge operations
|
|
43
|
+
|
|
44
|
+
#### Test Assertions (`tests/utils/testAssertions.js`)
|
|
45
|
+
Custom assertion utilities:
|
|
46
|
+
- `assertArrayEqual()` - Array equality
|
|
47
|
+
- `assertNumeric()` - Numeric type checking
|
|
48
|
+
- `assertString()` - String type checking
|
|
49
|
+
- `assertNullish()` - Null/undefined checking
|
|
50
|
+
- `assertApproximatelyEqual()` - Numeric approximation
|
|
51
|
+
- `assertInstanceOf()` - Instance type checking
|
|
52
|
+
- `assertHasProperties()` - Object property checking
|
|
53
|
+
- `assert2DArrayDimensions()` - 2D array dimension checking
|
|
54
|
+
|
|
55
|
+
### 4. Package.json Scripts
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"test": "jest",
|
|
60
|
+
"test:watch": "jest --watch",
|
|
61
|
+
"test:coverage": "jest --coverage",
|
|
62
|
+
"test:unit": "jest tests/unit",
|
|
63
|
+
"test:integration": "jest tests/integration",
|
|
64
|
+
"test:property": "jest tests/property"
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 5. Coverage Configuration
|
|
69
|
+
|
|
70
|
+
- **Threshold**: 80% for all metrics (statements, branches, functions, lines)
|
|
71
|
+
- **Coverage Report**: Generated in `coverage/` directory
|
|
72
|
+
- **Excluded**: `src/index.js`, `src/messages/**`
|
|
73
|
+
|
|
74
|
+
### 6. Test Setup
|
|
75
|
+
|
|
76
|
+
- **Setup File**: `tests/setup.js`
|
|
77
|
+
- **Environment**: `NODE_ENV=test`
|
|
78
|
+
- **Test Pattern**: `**/tests/**/*.test.js`
|
|
79
|
+
|
|
80
|
+
## How to Use
|
|
81
|
+
|
|
82
|
+
### Run All Tests
|
|
83
|
+
```bash
|
|
84
|
+
npm test
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Run Tests in Watch Mode
|
|
88
|
+
```bash
|
|
89
|
+
npm run test:watch
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Generate Coverage Report
|
|
93
|
+
```bash
|
|
94
|
+
npm run test:coverage
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Run Specific Test Suites
|
|
98
|
+
```bash
|
|
99
|
+
npm run test:unit # Unit tests only
|
|
100
|
+
npm run test:integration # Integration tests only
|
|
101
|
+
npm run test:property # Property-based tests only
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Writing Tests
|
|
105
|
+
|
|
106
|
+
### Unit Test Example
|
|
107
|
+
```javascript
|
|
108
|
+
// tests/unit/series.test.js
|
|
109
|
+
const { Series } = require('../../src/series/series');
|
|
110
|
+
const { generateNumericArray } = require('../utils/testDataGenerator');
|
|
111
|
+
|
|
112
|
+
describe('Series', () => {
|
|
113
|
+
test('creates a Series with array data', () => {
|
|
114
|
+
const data = generateNumericArray(5);
|
|
115
|
+
const s = new Series(data);
|
|
116
|
+
expect(s.length).toBe(5);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Property Test Example
|
|
122
|
+
```javascript
|
|
123
|
+
// tests/property/series.test.js
|
|
124
|
+
const { Series } = require('../../src/series/series');
|
|
125
|
+
|
|
126
|
+
describe('Property: Series Creation Preserves Array Elements', () => {
|
|
127
|
+
test('validates property for various inputs', () => {
|
|
128
|
+
// Test across many inputs
|
|
129
|
+
for (let i = 1; i <= 100; i++) {
|
|
130
|
+
const data = Array.from({ length: i }, (_, j) => j);
|
|
131
|
+
const s = new Series(data);
|
|
132
|
+
expect(s.length).toBe(i);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Verification
|
|
139
|
+
|
|
140
|
+
The setup has been verified with an example test:
|
|
141
|
+
```bash
|
|
142
|
+
$ npm test
|
|
143
|
+
|
|
144
|
+
PASS tests/unit/example.test.js
|
|
145
|
+
Testing Infrastructure Setup
|
|
146
|
+
✓ Jest is configured correctly
|
|
147
|
+
✓ Test utilities can be imported
|
|
148
|
+
✓ Assertion utilities can be imported
|
|
149
|
+
|
|
150
|
+
Test Suites: 1 passed, 1 total
|
|
151
|
+
Tests: 3 passed, 3 total
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Next Steps
|
|
155
|
+
|
|
156
|
+
1. Write unit tests for Series class (Task 4.10)
|
|
157
|
+
2. Write unit tests for DataFrame class (Task 6.4, 6.5)
|
|
158
|
+
3. Write property-based tests for core functionality
|
|
159
|
+
4. Write integration tests for workflows
|
|
160
|
+
5. Achieve 80% code coverage
|
|
161
|
+
|
|
162
|
+
## Requirements Satisfied
|
|
163
|
+
|
|
164
|
+
- **13.1**: Comprehensive test coverage with unit, integration, and property tests
|
|
165
|
+
- **13.5**: Code coverage reporting with Istanbul/nyc (via Jest)
|
|
166
|
+
- **13.6**: Test scripts configured in package.json
|
|
167
|
+
|
|
168
|
+
## Files Created/Modified
|
|
169
|
+
|
|
170
|
+
### Created:
|
|
171
|
+
- `jest.config.js` - Jest configuration
|
|
172
|
+
- `tests/unit/README.md` - Unit tests documentation
|
|
173
|
+
- `tests/integration/README.md` - Integration tests documentation
|
|
174
|
+
- `tests/property/README.md` - Property tests documentation
|
|
175
|
+
- `tests/utils/testDataGenerator.js` - Sample data generation utilities
|
|
176
|
+
- `tests/utils/testAssertions.js` - Custom assertion utilities
|
|
177
|
+
- `tests/setup.js` - Test environment setup
|
|
178
|
+
- `tests/unit/example.test.js` - Example test
|
|
179
|
+
- `tests/README.md` - Testing infrastructure documentation
|
|
180
|
+
- `TESTING_SETUP.md` - This file
|
|
181
|
+
|
|
182
|
+
### Modified:
|
|
183
|
+
- `package.json` - Added Jest dependency and test scripts
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
testEnvironment: 'node',
|
|
3
|
+
setupFilesAfterEnv: ['<rootDir>/tests/setup.js'],
|
|
4
|
+
collectCoverageFrom: [
|
|
5
|
+
'src/**/*.js',
|
|
6
|
+
'!src/index.js',
|
|
7
|
+
'!src/messages/**',
|
|
8
|
+
'!src/dataframe/**',
|
|
9
|
+
'!src/bases/**',
|
|
10
|
+
'!src/features/**',
|
|
11
|
+
'!src/utils/**'
|
|
12
|
+
],
|
|
13
|
+
coverageThreshold: {
|
|
14
|
+
global: {
|
|
15
|
+
branches: 80,
|
|
16
|
+
functions: 80,
|
|
17
|
+
lines: 80,
|
|
18
|
+
statements: 80
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
testMatch: [
|
|
22
|
+
'**/tests/**/*.test.js'
|
|
23
|
+
],
|
|
24
|
+
verbose: true
|
|
25
|
+
};
|
package/package.json
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-pandas",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "An npm package that incorporates minimal features of python pandas.",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"test": "
|
|
7
|
+
"test": "jest",
|
|
8
|
+
"test:watch": "jest --watch",
|
|
9
|
+
"test:coverage": "jest --coverage",
|
|
10
|
+
"test:unit": "jest tests/unit",
|
|
11
|
+
"test:integration": "jest tests/integration",
|
|
12
|
+
"test:property": "jest tests/property"
|
|
8
13
|
},
|
|
9
14
|
"repository": {
|
|
10
15
|
"type": "git",
|
|
@@ -22,5 +27,8 @@
|
|
|
22
27
|
"bugs": {
|
|
23
28
|
"url": "https://github.com/hygull/node-pandas/issues"
|
|
24
29
|
},
|
|
25
|
-
"homepage": "https://github.com/hygull/node-pandas#readme"
|
|
30
|
+
"homepage": "https://github.com/hygull/node-pandas#readme",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"jest": "^29.7.0"
|
|
33
|
+
}
|
|
26
34
|
}
|
package/src/bases/CsvBase.js
CHANGED
|
@@ -12,15 +12,6 @@ const CsvBase = {
|
|
|
12
12
|
} else {
|
|
13
13
|
pathDetails = null
|
|
14
14
|
}
|
|
15
|
-
/*
|
|
16
|
-
{
|
|
17
|
-
root: '/',
|
|
18
|
-
dir: '/Users/hygull/Desktop/try',
|
|
19
|
-
base: 'node-pandas.csv',
|
|
20
|
-
ext: '.csv',
|
|
21
|
-
name: 'node-pandas'
|
|
22
|
-
}
|
|
23
|
-
*/
|
|
24
15
|
|
|
25
16
|
if(pathDetails && fs.existsSync(pathDetails)) {
|
|
26
17
|
let csvText = ''
|
|
@@ -29,9 +20,9 @@ const CsvBase = {
|
|
|
29
20
|
|
|
30
21
|
for(let r=0; r < this.rows; ++r) {
|
|
31
22
|
for(let c=0; c < this.cols; ++c) {
|
|
32
|
-
csvText += this.data[r][columns[c]] + ','
|
|
23
|
+
csvText += this.data[r][this.columns[c]] + ','
|
|
33
24
|
}
|
|
34
|
-
csvText = csvText.trim().slice(0, -1) + '\n'
|
|
25
|
+
csvText = csvText.trim().slice(0, -1) + '\n'
|
|
35
26
|
}
|
|
36
27
|
|
|
37
28
|
csvText = csvText.trim()
|
|
@@ -44,11 +35,11 @@ const CsvBase = {
|
|
|
44
35
|
console.log(`CSV file is successfully created at ${outCsvPath}`)
|
|
45
36
|
}
|
|
46
37
|
}
|
|
47
|
-
})
|
|
38
|
+
})
|
|
48
39
|
} else {
|
|
49
40
|
messages.error(`Provided CSV path \`${outCsvPath}\` is invalid`)
|
|
50
41
|
}
|
|
51
42
|
}
|
|
52
43
|
}
|
|
53
44
|
|
|
54
|
-
module.exports = CsvBase
|
|
45
|
+
module.exports = CsvBase
|