Marshal JSON of package without escapes

Otherwise >, < get escaped as JSON does that in favour of browsers
This commit is contained in:
Ettore Di Giacinto
2019-11-29 19:01:50 +01:00
parent fa46601638
commit 4031a4ae81
3 changed files with 51 additions and 11 deletions

View File

@@ -354,7 +354,6 @@ func (cs *LuetCompiler) ComputeDepTree(p CompilationSpec) (solver.PackagesAssert
for _, assertion := range dependencies { //highly dependent on the order for _, assertion := range dependencies { //highly dependent on the order
if assertion.Value { if assertion.Value {
nthsolution, err := s.Install([]pkg.Package{assertion.Package}) nthsolution, err := s.Install([]pkg.Package{assertion.Package})
if err != nil { if err != nil {
return nil, errors.Wrap(err, "While computing a solution for "+p.GetPackage().GetName()) return nil, errors.Wrap(err, "While computing a solution for "+p.GetPackage().GetName())

View File

@@ -94,7 +94,13 @@ func (db *InMemoryDatabase) GetPackage(ID string) (Package, error) {
p := &DefaultPackage{} p := &DefaultPackage{}
if err := json.Unmarshal(enc, &p); err != nil { rawIn := json.RawMessage(enc)
bytes, err := rawIn.MarshalJSON()
if err != nil {
return &DefaultPackage{}, err
}
if err := json.Unmarshal(bytes, &p); err != nil {
return nil, err return nil, err
} }
return p, nil return p, nil
@@ -120,7 +126,7 @@ func (db *InMemoryDatabase) CreatePackage(p Package) (string, error) {
return "", errors.New("InMemoryDatabase suports only DefaultPackage") return "", errors.New("InMemoryDatabase suports only DefaultPackage")
} }
res, err := json.Marshal(pd) res, err := pd.JSON()
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -138,7 +144,7 @@ func (db *InMemoryDatabase) encodePackage(p Package) (string, string, error) {
return "", "", errors.New("InMemoryDatabase suports only DefaultPackage") return "", "", errors.New("InMemoryDatabase suports only DefaultPackage")
} }
res, err := json.Marshal(pd) res, err := pd.JSON()
if err != nil { if err != nil {
return "", "", err return "", "", err
} }

View File

@@ -77,13 +77,33 @@ type Tree interface {
// >> Unmarshallers // >> Unmarshallers
// DefaultPackageFromYaml decodes a package from yaml bytes // DefaultPackageFromYaml decodes a package from yaml bytes
func DefaultPackageFromYaml(source []byte) (DefaultPackage, error) { func DefaultPackageFromYaml(yml []byte) (DefaultPackage, error) {
var pkg DefaultPackage
err := yaml.Unmarshal(source, &pkg) var unescaped DefaultPackage
source, err := yaml.YAMLToJSON(yml)
if err != nil { if err != nil {
return pkg, err return DefaultPackage{}, err
} }
return pkg, nil
rawIn := json.RawMessage(source)
bytes, err := rawIn.MarshalJSON()
if err != nil {
return DefaultPackage{}, err
}
err = json.Unmarshal(bytes, &unescaped)
if err != nil {
return DefaultPackage{}, err
}
return unescaped, nil
}
// Major and minor gets escaped when marshalling in JSON, making compiler fails recognizing selectors for expansion
func (t *DefaultPackage) JSON() ([]byte, error) {
buffer := &bytes.Buffer{}
encoder := json.NewEncoder(buffer)
encoder.SetEscapeHTML(false)
err := encoder.Encode(t)
return buffer.Bytes(), err
} }
// DefaultPackage represent a standard package definition // DefaultPackage represent a standard package definition
@@ -113,7 +133,7 @@ func NewPackage(name, version string, requires []*DefaultPackage, conflicts []*D
} }
func (p *DefaultPackage) String() string { func (p *DefaultPackage) String() string {
b, err := json.Marshal(p) b, err := p.JSON()
if err != nil { if err != nil {
return fmt.Sprintf("{ id: \"%d\", name: \"%s\" }", p.ID, p.Name) return fmt.Sprintf("{ id: \"%d\", name: \"%s\" }", p.ID, p.Name)
} }
@@ -167,7 +187,12 @@ func (p *DefaultPackage) Encode(db PackageDatabase) (string, error) {
} }
func (p *DefaultPackage) Yaml() ([]byte, error) { func (p *DefaultPackage) Yaml() ([]byte, error) {
y, err := yaml.Marshal(p) j, err := p.JSON()
if err != nil {
return []byte{}, err
}
y, err := yaml.JSONToYAML(j)
if err != nil { if err != nil {
return []byte{}, err return []byte{}, err
@@ -281,11 +306,19 @@ func (pack *DefaultPackage) RequiresContains(definitiondb PackageDatabase, s Pac
p = pack //relax things p = pack //relax things
//return false, errors.Wrap(err, "Package not found in definition db") //return false, errors.Wrap(err, "Package not found in definition db")
} }
w := definitiondb.World()
for _, re := range p.GetRequires() { for _, re := range p.GetRequires() {
if re.Matches(s) { if re.Matches(s) {
return true, nil return true, nil
} }
packages, _ := re.Expand(&w)
for _, pa := range packages {
if pa.Matches(s) {
return true, nil
}
}
if contains, err := re.RequiresContains(definitiondb, s); err == nil && contains { if contains, err := re.RequiresContains(definitiondb, s); err == nil && contains {
return true, nil return true, nil
} }
@@ -341,12 +374,14 @@ func (pack *DefaultPackage) BuildFormula(definitiondb PackageDatabase, db Packag
if err != nil { if err != nil {
// return nil, errors.Wrap(err, "Couldn't find required package in db definition") // return nil, errors.Wrap(err, "Couldn't find required package in db definition")
packages, err := requiredDef.Expand(&w) packages, err := requiredDef.Expand(&w)
// Info("Expanded", packages, err)
if err != nil || len(packages) == 0 { if err != nil || len(packages) == 0 {
required = requiredDef required = requiredDef
} else { } else {
required = Best(packages) required = Best(packages)
} }
//required = &DefaultPackage{Name: "test"}
} }
encodedB, err := required.Encode(db) encodedB, err := required.Encode(db)