Models API
The models package defines the data structures used throughout the Python Requirements Parser.
Overview
The models package contains the core data structures that represent parsed requirements and their metadata.
go
import "github.com/scagogogo/python-requirements-parser/pkg/models"
Requirement Struct
The Requirement
struct is the primary data structure representing a single line from a requirements.txt file.
go
type Requirement struct {
// Basic package information
Name string `json:"name"`
Version string `json:"version,omitempty"`
Extras []string `json:"extras,omitempty"`
Markers string `json:"markers,omitempty"`
Comment string `json:"comment,omitempty"`
OriginalLine string `json:"original_line,omitempty"`
// Position information for minimal diff editing
PositionInfo *PositionInfo `json:"position_info,omitempty"`
// Type identification flags
IsComment bool `json:"is_comment,omitempty"`
IsEmpty bool `json:"is_empty,omitempty"`
IsFileRef bool `json:"is_file_ref,omitempty"`
IsConstraint bool `json:"is_constraint,omitempty"`
IsEditable bool `json:"is_editable,omitempty"`
IsVCS bool `json:"is_vcs,omitempty"`
IsURL bool `json:"is_url,omitempty"`
// Special content fields
FileRef string `json:"file_ref,omitempty"`
ConstraintFile string `json:"constraint_file,omitempty"`
URL string `json:"url,omitempty"`
VCSType string `json:"vcs_type,omitempty"`
GlobalOptions map[string]string `json:"global_options,omitempty"`
HashOptions []string `json:"hash_options,omitempty"`
}
Basic Package Information
Name
- Type:
string
- Description: The package name
- Example:
"flask"
,"django"
,"requests"
go
req := &models.Requirement{Name: "flask"}
Version
- Type:
string
- Description: Version constraint specification
- Example:
"==2.0.1"
,">=3.2.0,<4.0.0"
,"~=1.1.2"
go
req := &models.Requirement{
Name: "django",
Version: ">=3.2.0,<4.0.0",
}
Extras
- Type:
[]string
- Description: List of optional extras to install
- Example:
["rest", "auth"]
fordjango[rest,auth]
go
req := &models.Requirement{
Name: "django",
Extras: []string{"rest", "auth"},
}
Markers
- Type:
string
- Description: Environment markers for conditional installation
- Example:
"python_version >= '3.7'"
,"platform_system == 'Windows'"
go
req := &models.Requirement{
Name: "pywin32",
Markers: "platform_system == 'Windows'",
}
Comment
- Type:
string
- Description: Inline comment text (without the # symbol)
- Example:
"Web framework"
forflask==2.0.1 # Web framework
go
req := &models.Requirement{
Name: "flask",
Version: "==2.0.1",
Comment: "Web framework",
}
OriginalLine
- Type:
string
- Description: The complete original line from the requirements file
- Purpose: Preserves exact formatting and content
go
req := &models.Requirement{
Name: "flask",
Version: "==2.0.1",
Comment: "Web framework",
OriginalLine: "flask==2.0.1 # Web framework",
}
Position Information
PositionInfo
- Type:
*PositionInfo
- Description: Detailed position information for minimal diff editing
- Usage: Used by PositionAwareEditor to make precise edits
go
req := &models.Requirement{
Name: "flask",
PositionInfo: &models.PositionInfo{
LineNumber: 2,
StartColumn: 0,
EndColumn: 25,
VersionStartColumn: 5,
VersionEndColumn: 12,
},
}
Type Identification Flags
IsComment
- Type:
bool
- Description: True if this line is a comment
- Example:
true
for# This is a comment
IsEmpty
- Type:
bool
- Description: True if this line is empty or contains only whitespace
- Example:
true
for empty lines
IsFileRef
- Type:
bool
- Description: True if this line references another requirements file
- Example:
true
for-r requirements-dev.txt
IsConstraint
- Type:
bool
- Description: True if this line references a constraints file
- Example:
true
for-c constraints.txt
IsEditable
- Type:
bool
- Description: True if this is an editable installation
- Example:
true
for-e git+https://github.com/user/project.git
IsVCS
- Type:
bool
- Description: True if this is a VCS (version control system) dependency
- Example:
true
forgit+https://github.com/user/project.git
IsURL
- Type:
bool
- Description: True if this is a URL dependency
- Example:
true
forhttps://example.com/package.whl
Special Content Fields
FileRef
- Type:
string
- Description: Path to referenced requirements file
- Example:
"requirements-dev.txt"
for-r requirements-dev.txt
ConstraintFile
- Type:
string
- Description: Path to referenced constraints file
- Example:
"constraints.txt"
for-c constraints.txt
URL
- Type:
string
- Description: URL for URL or VCS dependencies
- Example:
"https://github.com/user/project.git"
VCSType
- Type:
string
- Description: Type of version control system
- Values:
"git"
,"hg"
,"svn"
,"bzr"
GlobalOptions
- Type:
map[string]string
- Description: Global pip options
- Example:
{"index-url": "https://pypi.example.com"}
HashOptions
- Type:
[]string
- Description: Hash verification options
- Example:
["sha256:abcdef1234567890"]
PositionInfo Struct
The PositionInfo
struct provides detailed position information for minimal diff editing.
go
type PositionInfo struct {
LineNumber int `json:"line_number"`
StartColumn int `json:"start_column"`
EndColumn int `json:"end_column"`
VersionStartColumn int `json:"version_start_column,omitempty"`
VersionEndColumn int `json:"version_end_column,omitempty"`
CommentStartColumn int `json:"comment_start_column,omitempty"`
}
Fields
LineNumber
- Type:
int
- Description: Line number in the original file (1-based)
- Example:
5
for the 5th line
StartColumn
- Type:
int
- Description: Starting column of the requirement (0-based)
- Example:
0
for requirements starting at the beginning of the line
EndColumn
- Type:
int
- Description: Ending column of the requirement (0-based, exclusive)
- Example:
25
for a requirement ending at column 24
VersionStartColumn
- Type:
int
- Description: Starting column of the version constraint (0-based)
- Example:
5
forflask==2.0.1
(version starts at column 5)
VersionEndColumn
- Type:
int
- Description: Ending column of the version constraint (0-based, exclusive)
- Example:
12
forflask==2.0.1
(version ends at column 11)
CommentStartColumn
- Type:
int
- Description: Starting column of the comment (0-based)
- Example:
15
forflask==2.0.1 # comment
(comment starts at column 15)
Usage Examples
Basic Package Requirement
go
req := &models.Requirement{
Name: "flask",
Version: "==2.0.1",
Comment: "Web framework",
OriginalLine: "flask==2.0.1 # Web framework",
}
fmt.Printf("Package: %s %s\n", req.Name, req.Version)
// Output: Package: flask ==2.0.1
Package with Extras
go
req := &models.Requirement{
Name: "django",
Version: ">=3.2.0",
Extras: []string{"rest", "auth"},
OriginalLine: "django[rest,auth]>=3.2.0",
}
fmt.Printf("Package: %s%v %s\n", req.Name, req.Extras, req.Version)
// Output: Package: django[rest auth] >=3.2.0
Package with Environment Markers
go
req := &models.Requirement{
Name: "pywin32",
Version: ">=1.0",
Markers: "platform_system == 'Windows'",
OriginalLine: "pywin32>=1.0; platform_system == 'Windows'",
}
if req.Markers != "" {
fmt.Printf("Conditional package: %s %s (%s)\n", req.Name, req.Version, req.Markers)
}
// Output: Conditional package: pywin32 >=1.0 (platform_system == 'Windows')
VCS Dependency
go
req := &models.Requirement{
Name: "myproject",
IsVCS: true,
IsEditable: true,
VCSType: "git",
URL: "https://github.com/user/myproject.git",
OriginalLine: "-e git+https://github.com/user/myproject.git#egg=myproject",
}
if req.IsVCS {
fmt.Printf("VCS package: %s from %s (%s)\n", req.Name, req.URL, req.VCSType)
}
// Output: VCS package: myproject from https://github.com/user/myproject.git (git)
File Reference
go
req := &models.Requirement{
IsFileRef: true,
FileRef: "requirements-dev.txt",
OriginalLine: "-r requirements-dev.txt",
}
if req.IsFileRef {
fmt.Printf("File reference: %s\n", req.FileRef)
}
// Output: File reference: requirements-dev.txt
Comment Line
go
req := &models.Requirement{
IsComment: true,
Comment: "Production dependencies",
OriginalLine: "# Production dependencies",
}
if req.IsComment {
fmt.Printf("Comment: %s\n", req.Comment)
}
// Output: Comment: Production dependencies
Type Checking Helpers
You can use the type flags to categorize requirements:
go
func categorizeRequirement(req *models.Requirement) string {
switch {
case req.IsComment:
return "comment"
case req.IsEmpty:
return "empty"
case req.IsFileRef:
return "file_reference"
case req.IsConstraint:
return "constraint_reference"
case req.IsVCS:
return "vcs_dependency"
case req.IsURL:
return "url_dependency"
case req.Name != "":
return "package_dependency"
default:
return "unknown"
}
}
// Usage
for _, req := range requirements {
category := categorizeRequirement(req)
fmt.Printf("Line: %s -> Category: %s\n", req.OriginalLine, category)
}
JSON Serialization
All model structs support JSON serialization:
go
req := &models.Requirement{
Name: "flask",
Version: "==2.0.1",
Comment: "Web framework",
}
// Serialize to JSON
data, err := json.Marshal(req)
if err != nil {
log.Fatal(err)
}
// Deserialize from JSON
var newReq models.Requirement
err = json.Unmarshal(data, &newReq)
if err != nil {
log.Fatal(err)
}
Next Steps
- Parser API - Learn how to parse requirements into these models
- Editors API - Learn how to edit and manipulate these models
- Examples - See practical usage examples