Fixed json input parsing
This commit is contained in:
parent
8c8af7dcaa
commit
cd6870fa1a
36
README.md
36
README.md
|
@ -21,8 +21,9 @@ if err != nil {
|
|||
|
||||
## Input Format
|
||||
|
||||
The input JSON file should contain an array of entries, where each entry has the following structure:
|
||||
The library supports two JSON input formats:
|
||||
|
||||
### Format 1: Direct Array
|
||||
```json
|
||||
[
|
||||
{
|
||||
|
@ -37,6 +38,39 @@ The input JSON file should contain an array of entries, where each entry has the
|
|||
]
|
||||
```
|
||||
|
||||
### Format 2: Categorized Object
|
||||
```json
|
||||
{
|
||||
"accepted": [
|
||||
{
|
||||
"paper": {
|
||||
"title": "Paper Title",
|
||||
"abstract": "Paper Abstract",
|
||||
"arxiv_id": "2301.00000"
|
||||
},
|
||||
"decision": "accept",
|
||||
"explanation": "Explanation for the decision"
|
||||
}
|
||||
],
|
||||
"rejected": [
|
||||
{
|
||||
"paper": {
|
||||
"title": "Another Paper",
|
||||
"abstract": "Another Abstract",
|
||||
"arxiv_id": "2301.00001"
|
||||
},
|
||||
"decision": "reject",
|
||||
"explanation": "Explanation for rejection"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Both formats support the same entry structure, with each entry containing:
|
||||
- A paper object with title, abstract, and arXiv ID
|
||||
- A decision (accept/reject, case-insensitive)
|
||||
- An explanation for the decision
|
||||
|
||||
## Output Format
|
||||
|
||||
The library generates a Markdown file that:
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
[
|
||||
{
|
||||
"paper": {
|
||||
"title": "Deep Learning Advances in Computer Vision",
|
||||
"abstract": "This paper presents recent advances in deep learning approaches for computer vision tasks. We discuss novel architectures that have achieved state-of-the-art results in image classification, object detection, and semantic segmentation.\n\nOur comprehensive analysis shows that attention mechanisms and multi-scale feature fusion are key components for improving model performance.",
|
||||
"arxiv_id": "2301.0001"
|
||||
},
|
||||
"decision": "accept",
|
||||
"explanation": "Excellent comprehensive review with novel insights. The analysis of attention mechanisms is particularly valuable."
|
||||
},
|
||||
{
|
||||
"paper": {
|
||||
"title": "Quantum Computing: A Survey of Current Challenges",
|
||||
"abstract": "We survey the current challenges in quantum computing, focusing on error correction, qubit coherence, and scalability issues. The paper provides a systematic review of recent approaches to these challenges.",
|
||||
"arxiv_id": "2301.0002"
|
||||
},
|
||||
"decision": "accept",
|
||||
"explanation": "Well-structured survey that effectively summarizes the field's major challenges."
|
||||
},
|
||||
{
|
||||
"paper": {
|
||||
"title": "Blockchain in Healthcare",
|
||||
"abstract": "This paper proposes a blockchain-based system for managing electronic health records. We discuss implementation details and potential privacy concerns.",
|
||||
"arxiv_id": "2301.0003"
|
||||
},
|
||||
"decision": "reject",
|
||||
"explanation": "The proposed system lacks novelty and does not adequately address existing privacy solutions in the field."
|
||||
}
|
||||
]
|
|
@ -0,0 +1,38 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"gitea.r8z.us/stwhite/paperformatter"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Check if input and output files are provided
|
||||
if len(os.Args) != 3 {
|
||||
fmt.Println("Usage: go run main.go <input.json> <output.md>")
|
||||
fmt.Println("Example: go run main.go input.json output.md")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
inputFile := os.Args[1]
|
||||
outputFile := os.Args[2]
|
||||
|
||||
// Format the papers
|
||||
err := paperformatter.FormatPapers(inputFile, outputFile)
|
||||
if err != nil {
|
||||
switch e := err.(type) {
|
||||
case *paperformatter.ValidationError:
|
||||
log.Fatalf("Validation error: %v", e)
|
||||
case *paperformatter.FileError:
|
||||
log.Fatalf("File error: %v", e)
|
||||
case *paperformatter.JSONError:
|
||||
log.Fatalf("JSON error: %v", e)
|
||||
default:
|
||||
log.Fatalf("Error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("Successfully formatted papers from %s to %s\n", inputFile, outputFile)
|
||||
}
|
|
@ -61,10 +61,21 @@ func FormatPapers(inputFile, outputFile string) error {
|
|||
}
|
||||
}
|
||||
|
||||
// Try to parse as direct array first
|
||||
var entries []Entry
|
||||
if err := json.Unmarshal(data, &entries); err != nil {
|
||||
// If that fails, try parsing as object with accepted/rejected arrays
|
||||
var input struct {
|
||||
Accepted []Entry `json:"accepted"`
|
||||
Rejected []Entry `json:"rejected,omitempty"`
|
||||
}
|
||||
if err := json.Unmarshal(data, &input); err != nil {
|
||||
return &JSONError{Wrapped: err}
|
||||
}
|
||||
// Combine accepted and rejected entries
|
||||
entries = append(entries, input.Accepted...)
|
||||
entries = append(entries, input.Rejected...)
|
||||
}
|
||||
|
||||
// Validate all entries before processing
|
||||
for i, entry := range entries {
|
||||
|
|
|
@ -141,6 +141,42 @@ func TestFormatPapers(t *testing.T) {
|
|||
wantErr: true,
|
||||
errContains: "decision must be either 'accept' or 'reject'",
|
||||
},
|
||||
{
|
||||
name: "categorized format",
|
||||
input: `{
|
||||
"accepted": [
|
||||
{
|
||||
"paper": {
|
||||
"title": "Test Paper 1",
|
||||
"abstract": "Abstract 1",
|
||||
"arxiv_id": "2301.0001"
|
||||
},
|
||||
"decision": "accept",
|
||||
"explanation": "Good paper"
|
||||
}
|
||||
],
|
||||
"rejected": [
|
||||
{
|
||||
"paper": {
|
||||
"title": "Test Paper 2",
|
||||
"abstract": "Abstract 2",
|
||||
"arxiv_id": "2301.0002"
|
||||
},
|
||||
"decision": "reject",
|
||||
"explanation": "Needs work"
|
||||
}
|
||||
]
|
||||
}`,
|
||||
wantErr: false,
|
||||
checkOutput: func(t *testing.T, output string) {
|
||||
if !strings.Contains(output, "## Test Paper 1") {
|
||||
t.Error("Output missing accepted paper")
|
||||
}
|
||||
if !strings.Contains(output, "## Test Paper 2") {
|
||||
t.Error("Output missing rejected paper")
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "case insensitive decision",
|
||||
input: `[
|
||||
|
|
Loading…
Reference in New Issue