Refactoring: make PackageQuery work on PackageLike objects (not necessarily Packages). #71

This commit is contained in:
Andrey Smirnov
2015-03-18 23:25:20 +03:00
parent 36326788b0
commit 4d622e467c
2 changed files with 34 additions and 9 deletions
+15
View File
@@ -294,6 +294,21 @@ func (p *Package) MatchesDependency(dep Dependency) bool {
panic("unknown relation")
}
// GetName returns package name
func (p *Package) GetName() string {
return p.Name
}
// GetVersion returns package version
func (p *Package) GetVersion() string {
return p.Version
}
// GetArchitecture returns package arch
func (p *Package) GetArchitecture() string {
return p.Architecture
}
// GetDependencies compiles list of dependenices by flags from options
func (p *Package) GetDependencies(options int) (dependencies []string) {
deps := p.Deps()
+19 -9
View File
@@ -7,6 +7,16 @@ import (
"strings"
)
// PackageLike is something like Package :) To be refined later
type PackageLike interface {
GetField(string) string
MatchesDependency(Dependency) bool
MatchesArchitecture(string) bool
GetName() string
GetVersion() string
GetArchitecture() string
}
// PackageCatalog is abstraction on top of PackageCollection and PackageList
type PackageCatalog interface {
Scan(q PackageQuery) (result *PackageList)
@@ -18,7 +28,7 @@ type PackageCatalog interface {
// PackageQuery is interface of predicate on Package
type PackageQuery interface {
// Matches calculates match of condition against package
Matches(pkg *Package) bool
Matches(pkg PackageLike) bool
// Fast returns if search strategy is possible for this query
Fast(list PackageCatalog) bool
// Query performs search on package list
@@ -63,7 +73,7 @@ type DependencyQuery struct {
}
// Matches if any of L, R matches
func (q *OrQuery) Matches(pkg *Package) bool {
func (q *OrQuery) Matches(pkg PackageLike) bool {
return q.L.Matches(pkg) || q.R.Matches(pkg)
}
@@ -89,7 +99,7 @@ func (q *OrQuery) String() string {
}
// Matches if both of L, R matches
func (q *AndQuery) Matches(pkg *Package) bool {
func (q *AndQuery) Matches(pkg PackageLike) bool {
return q.L.Matches(pkg) && q.R.Matches(pkg)
}
@@ -120,7 +130,7 @@ func (q *AndQuery) String() string {
}
// Matches if not matches
func (q *NotQuery) Matches(pkg *Package) bool {
func (q *NotQuery) Matches(pkg PackageLike) bool {
return !q.Q.Matches(pkg)
}
@@ -141,9 +151,9 @@ func (q *NotQuery) String() string {
}
// Matches on generic field
func (q *FieldQuery) Matches(pkg *Package) bool {
func (q *FieldQuery) Matches(pkg PackageLike) bool {
if q.Field == "$Version" {
return pkg.MatchesDependency(Dependency{Pkg: pkg.Name, Relation: q.Relation, Version: q.Value, Regexp: q.Regexp})
return pkg.MatchesDependency(Dependency{Pkg: pkg.GetName(), Relation: q.Relation, Version: q.Value, Regexp: q.Regexp})
}
if q.Field == "$Architecture" && q.Relation == VersionEqual {
return pkg.MatchesArchitecture(q.Value)
@@ -218,7 +228,7 @@ func (q *FieldQuery) String() string {
}
// Matches on dependency condition
func (q *DependencyQuery) Matches(pkg *Package) bool {
func (q *DependencyQuery) Matches(pkg PackageLike) bool {
return pkg.MatchesDependency(q.Dep)
}
@@ -247,8 +257,8 @@ func (q *DependencyQuery) String() string {
}
// Matches on specific properties
func (q *PkgQuery) Matches(pkg *Package) bool {
return pkg.Name == q.Pkg && pkg.Version == q.Version && pkg.Architecture == q.Arch
func (q *PkgQuery) Matches(pkg PackageLike) bool {
return pkg.GetName() == q.Pkg && pkg.GetVersion() == q.Version && pkg.GetArchitecture() == q.Arch
}
// Fast is always true for package query