Merge lp:~jimmiebtlr/juju-core/fix-no-peers-charm into lp:~go-bot/juju-core/trunk

Proposed by Jimmie Butler
Status: Rejected
Rejected by: William Reade
Proposed branch: lp:~jimmiebtlr/juju-core/fix-no-peers-charm
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 219 lines (+59/-24)
5 files modified
charm/meta.go (+9/-9)
charm/meta_test.go (+15/-6)
schema/schema.go (+20/-0)
schema/schema_test.go (+9/-9)
testing/repo/quantal/empty-fields/metadata.yaml (+6/-0)
To merge this branch: bzr merge lp:~jimmiebtlr/juju-core/fix-no-peers-charm
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+218195@code.launchpad.net

Description of the change

Allow charm with empty peers, provides, requires.

In the case that a null was read in for the maps, use
an empty map instead of throwing error. Added test case
to show error. Bug #1313793

https://codereview.appspot.com/98410043/

To post a comment you must log in.
Revision history for this message
John A Meinel (jameinel) wrote :

31 @@ -353,6 +359,7 @@
32 vpath[len(vpath)-1] = fmt.Sprint(k.Interface())
33 newv, err := c.value.Coerce(rv.MapIndex(k).Interface(), vpath)
34 if err != nil {
35 +
36 return nil, err
37 }
38 out[newk.(string)] = newv

I think this is a spurious change.

I'm a bit surprised we don't have a direct test of schema/* that would fit this change. I believe you have it covered, but only at the charm level.
Is there a test in schema that you could add that would be a bit more of a direct test?

Otherwise, LGTM.

Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :

I'll take a look at the schema/* tests, and see about removing the
extraneous space. Thanks for the feedback.

On Mon, May 5, 2014 at 9:23 PM, John A Meinel <email address hidden>wrote:

> 31 @@ -353,6 +359,7 @@
> 32 vpath[len(vpath)-1] = fmt.Sprint(k.Interface())
> 33 newv, err := c.value.Coerce(rv.MapIndex(k).Interface(), vpath)
> 34 if err != nil {
> 35 +
> 36 return nil, err
> 37 }
> 38 out[newk.(string)] = newv
>
> I think this is a spurious change.
>
> I'm a bit surprised we don't have a direct test of schema/* that would fit
> this change. I believe you have it covered, but only at the charm level.
> Is there a test in schema that you could add that would be a bit more of a
> direct test?
>
> Otherwise, LGTM.
> --
>
> https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charm/+merge/218195
> You are the owner of lp:~jimmiebtlr/juju-core/fix-no-peers-charm.
>

--
Thanks,
Jimmie Butler

Revision history for this message
William Reade (fwereade) wrote :

FWIW, if you're planning to fix schema stringMap to assume nil->empty-map (+1 to that approach) please make sure the other map types in schema are consistent.

Revision history for this message
William Reade (fwereade) wrote :

Thanks, this was definitely the right place to make the change. A few more comments:

10 + c.Assert(err, gc.IsNil)

Please check the content of the returned metadata, on general principles. If we end up with inconsistent sometimes-nil-sometimes-empty behaviour, please fix that too; a casual reading indicates that we won't but some tests might start failing because we now have empty maps where we expected nils.

24 + return make(map[string]interface{}), nil

mapC should be returning a map[interface{}]interface{}

35 + // handles case where map is empty
48 + // handles case where map is empty
61 + // handles case where map is empty

"treat nil value as empty map", perhaps? And, FWIW, I'd skip the blank lines around the stanzas you inserted, but YMMV legitimately.

Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :
Download full text (5.1 KiB)

Reviewers: mp+218195_code.launchpad.net,

Message:
Please take a look.

Description:
Allow charm with empty peers, provides, requires.

In the case that a null was read in for the maps, use
an empty map instead of throwing error. Added test case
to show error. Bug #1313793

https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charm/+merge/218195

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/98410043/

Affected files (+42, -8 lines):
   A [revision details]
   M charm/meta_test.go
   M schema/schema.go
   M schema/schema_test.go
   A testing/repo/quantal/empty-fields/metadata.yaml

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: tarmac-20140520024339-qids5ewddm0js4yq
+New revision: <email address hidden>

Index: charm/meta_test.go
=== modified file 'charm/meta_test.go'
--- charm/meta_test.go 2014-04-09 16:36:12 +0000
+++ charm/meta_test.go 2014-05-20 03:20:37 +0000
@@ -161,6 +161,12 @@
    Scope: charm.ScopeGlobal,
   })
   c.Assert(meta.Peers, gc.IsNil)
+
+ meta, err = charm.ReadMeta(repoMeta("empty-fields"))
+ c.Assert(meta.Provides, gc.DeepEquals, map[string]charm.Relation{})
+ c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
+ c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
+ c.Assert(err, gc.IsNil)
  }

  var relationsConstraintsTests = []struct {

Index: schema/schema.go
=== modified file 'schema/schema.go'
--- schema/schema.go 2014-01-15 10:50:11 +0000
+++ schema/schema.go 2014-05-20 03:20:37 +0000
@@ -293,6 +293,11 @@

  func (c mapC) Coerce(v interface{}, path []string) (interface{}, error) {
   rv := reflect.ValueOf(v)
+
+ // handles case where map is empty
+ if rv.Kind() == reflect.Invalid {
+ return make(map[interface{}]interface{}), nil
+ }
   if rv.Kind() != reflect.Map {
    return nil, error_{"map", v, path}
   }
@@ -334,6 +339,11 @@

  func (c stringMapC) Coerce(v interface{}, path []string) (interface{},
error) {
   rv := reflect.ValueOf(v)
+
+ // treat nil value as empty map
+ if rv.Kind() == reflect.Invalid {
+ return make(map[string]interface{}), nil
+ }
   if rv.Kind() != reflect.Map {
    return nil, error_{"map", v, path}
   }
@@ -399,6 +409,11 @@

  func (c fieldMapC) Coerce(v interface{}, path []string) (interface{},
error) {
   rv := reflect.ValueOf(v)
+
+ // treat nil value as empty map
+ if rv.Kind() == reflect.Invalid {
+ return make(map[string]interface{}), nil
+ }
   if rv.Kind() != reflect.Map {
    return nil, error_{"map", v, path}
   }
@@ -488,6 +503,11 @@

  func (c mapSetC) Coerce(v interface{}, path []string) (interface{}, error)
{
   rv := reflect.ValueOf(v)
+
+ // treat nil value as empty map
+ if rv.Kind() == reflect.Invalid {
+ return make(map[string]interface{}), nil
+ }
   if rv.Kind() != reflect.Map {
    return nil, error_{"map", v, path}
   }

Index: schema/schema_test.go
=== modified file 'schema/schema_test.go'
--- schema/schema_test.go 2014-01-14 13:10:26 +0000
+++ schema/schema_test.go 2014-05-20 03:20:3...

Read more...

Revision history for this message
Dave Cheney (dave-cheney) wrote :

On 2014/05/20 03:33:38, jimmiebtlr wrote:
> Please take a look.

This code looks fine but I don't feel I can +1 this change without some
discussion as this changes the behaviour of _all_ map, mapSet, etc
fields.

https://codereview.appspot.com/98410043/

Revision history for this message
William Reade (fwereade) wrote :

LGTM, I'd accept this as-is, but please take a little look at the
nil/map{} issue. If it's too complex, let me know, and I'll approve it.

Dave, thanks for the caution; but schema isn't as heavily used as one
might think (especially the map bits), and I think this is a good
change.

https://codereview.appspot.com/98410043/diff/1/charm/meta_test.go
File charm/meta_test.go (left):

https://codereview.appspot.com/98410043/diff/1/charm/meta_test.go#oldcode163
charm/meta_test.go:163: c.Assert(meta.Peers, gc.IsNil)
It's this bit that bugs me, that I alluded to yesterday -- having a Meta
type that sometimes has nil and sometimes has {} feels weirdly
inconsistent. It's not really a very big deal, but I'd appreciate a fix
if it's not excessively complex to change.

https://codereview.appspot.com/98410043/diff/1/schema/schema.go
File schema/schema.go (right):

https://codereview.appspot.com/98410043/diff/1/schema/schema.go#newcode297
schema/schema.go:297: // handles case where map is empty
treat nil value as empty map :)

https://codereview.appspot.com/98410043/

Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :

Ok, misunderstood that little bit. Basically it should return an empty map
rather than nil even if peers, requires, and provides are not mentioned in
the charm file. That will require a change in a different location,
meaning we may not need to change the map behavior at all.

On Tue, May 20, 2014 at 12:48 AM, William Reade <<email address hidden>
> wrote:

> LGTM, I'd accept this as-is, but please take a little look at the
> nil/map{} issue. If it's too complex, let me know, and I'll approve it.
>
> Dave, thanks for the caution; but schema isn't as heavily used as one
> might think (especially the map bits), and I think this is a good
> change.
>
>
> https://codereview.appspot.com/98410043/diff/1/charm/meta_test.go
> File charm/meta_test.go (left):
>
>
> https://codereview.appspot.com/98410043/diff/1/charm/meta_test.go#oldcode163
> charm/meta_test.go:163: c.Assert(meta.Peers, gc.IsNil)
> It's this bit that bugs me, that I alluded to yesterday -- having a Meta
> type that sometimes has nil and sometimes has {} feels weirdly
> inconsistent. It's not really a very big deal, but I'd appreciate a fix
> if it's not excessively complex to change.
>
> https://codereview.appspot.com/98410043/diff/1/schema/schema.go
> File schema/schema.go (right):
>
> https://codereview.appspot.com/98410043/diff/1/schema/schema.go#newcode297
> schema/schema.go:297: // handles case where map is empty
> treat nil value as empty map :)
>
> https://codereview.appspot.com/98410043/
>
> --
>
> https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charm/+merge/218195
> You are the owner of lp:~jimmiebtlr/juju-core/fix-no-peers-charm.
>

--
Thanks,
Jimmie Butler

Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :
Revision history for this message
William Reade (fwereade) wrote :

> Ok, misunderstood that little bit. Basically it should return an empty map
> rather than nil even if peers, requires, and provides are not mentioned in
> the charm file. That will require a change in a different location,
> meaning we may not need to change the map behavior at all.

An easy alternative would be to just return nil maps (of the right type) from the schema package. I'm not bothered about which we pick so much as I am about consistency.

Revision history for this message
William Reade (fwereade) wrote :
Revision history for this message
Jimmie Butler (jimmiebtlr) wrote :

Correct, thanks
On May 28, 2014 3:57 AM, "William Reade" <email address hidden>
wrote:

> The proposal to merge lp:~jimmiebtlr/juju-core/fix-no-peers-charm into
> lp:juju-core has been updated.
>
> Status: Needs review => Rejected
>
> For more details, see:
>
> https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charm/+merge/218195
> --
>
> https://code.launchpad.net/~jimmiebtlr/juju-core/fix-no-peers-charm/+merge/218195
> You are the owner of lp:~jimmiebtlr/juju-core/fix-no-peers-charm.
>

Unmerged revisions

2713. By Jimmie Butler

Go fmt.

2712. By Jimmie Butler

Change test order, put error check first.

2711. By Jimmie Butler

Change test order to check error first.

2710. By Jimmie Butler

Merge with most recent master.

2709. By Jimmie Butler

Merge in most recent master

2708. By Jimmie Butler

Remove unneeded statement in parseRelation.

2707. By Jimmie Butler

Merge master chanegs

2706. By Jimmie Butler

Add back commented empty charm fields test.

2705. By Jimmie Butler

Go fmt.

2704. By Jimmie Butler

Merge in most recent master

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'charm/meta.go'
--- charm/meta.go 2014-04-09 16:36:12 +0000
+++ charm/meta.go 2014-05-28 05:03:23 +0000
@@ -96,13 +96,13 @@
96 Summary string96 Summary string
97 Description string97 Description string
98 Subordinate bool98 Subordinate bool
99 Provides map[string]Relation `bson:",omitempty"`99 Provides map[string]Relation
100 Requires map[string]Relation `bson:",omitempty"`100 Requires map[string]Relation
101 Peers map[string]Relation `bson:",omitempty"`101 Peers map[string]Relation
102 Format int `bson:",omitempty"`102 Format int `bson:",omitempty"`
103 OldRevision int `bson:",omitempty"` // Obsolete103 OldRevision int `bson:",omitempty"` // Obsolete
104 Categories []string `bson:",omitempty"`104 Categories []string `bson:",omitempty"`
105 Series string `bson:",omitempty"`105 Series string `bson:",omitempty"`
106}106}
107107
108func generateRelationHooks(relName string, allHooks map[string]bool) {108func generateRelationHooks(relName string, allHooks map[string]bool) {
@@ -262,10 +262,10 @@
262}262}
263263
264func parseRelations(relations interface{}, role RelationRole) map[string]Relation {264func parseRelations(relations interface{}, role RelationRole) map[string]Relation {
265 result := make(map[string]Relation)
265 if relations == nil {266 if relations == nil {
266 return nil267 return result
267 }268 }
268 result := make(map[string]Relation)
269 for name, rel := range relations.(map[string]interface{}) {269 for name, rel := range relations.(map[string]interface{}) {
270 relMap := rel.(map[string]interface{})270 relMap := rel.(map[string]interface{})
271 relation := Relation{271 relation := Relation{
272272
=== modified file 'charm/meta_test.go'
--- charm/meta_test.go 2014-04-09 16:36:12 +0000
+++ charm/meta_test.go 2014-05-28 05:03:23 +0000
@@ -93,8 +93,8 @@
93 Interface: "mysql",93 Interface: "mysql",
94 Scope: charm.ScopeGlobal,94 Scope: charm.ScopeGlobal,
95 })95 })
96 c.Assert(meta.Requires, gc.IsNil)96 c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
97 c.Assert(meta.Peers, gc.IsNil)97 c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
9898
99 meta, err = charm.ReadMeta(repoMeta("riak"))99 meta, err = charm.ReadMeta(repoMeta("riak"))
100 c.Assert(err, gc.IsNil)100 c.Assert(err, gc.IsNil)
@@ -117,7 +117,7 @@
117 Limit: 1,117 Limit: 1,
118 Scope: charm.ScopeGlobal,118 Scope: charm.ScopeGlobal,
119 })119 })
120 c.Assert(meta.Requires, gc.IsNil)120 c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
121121
122 meta, err = charm.ReadMeta(repoMeta("terracotta"))122 meta, err = charm.ReadMeta(repoMeta("terracotta"))
123 c.Assert(err, gc.IsNil)123 c.Assert(err, gc.IsNil)
@@ -135,7 +135,7 @@
135 Limit: 1,135 Limit: 1,
136 Scope: charm.ScopeGlobal,136 Scope: charm.ScopeGlobal,
137 })137 })
138 c.Assert(meta.Requires, gc.IsNil)138 c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
139139
140 meta, err = charm.ReadMeta(repoMeta("wordpress"))140 meta, err = charm.ReadMeta(repoMeta("wordpress"))
141 c.Assert(err, gc.IsNil)141 c.Assert(err, gc.IsNil)
@@ -160,7 +160,13 @@
160 Optional: true,160 Optional: true,
161 Scope: charm.ScopeGlobal,161 Scope: charm.ScopeGlobal,
162 })162 })
163 c.Assert(meta.Peers, gc.IsNil)163 c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
164
165 meta, err = charm.ReadMeta(repoMeta("empty-fields"))
166 c.Assert(err, gc.IsNil)
167 c.Assert(meta.Provides, gc.DeepEquals, map[string]charm.Relation{})
168 c.Assert(meta.Requires, gc.DeepEquals, map[string]charm.Relation{})
169 c.Assert(meta.Peers, gc.DeepEquals, map[string]charm.Relation{})
164}170}
165171
166var relationsConstraintsTests = []struct {172var relationsConstraintsTests = []struct {
@@ -396,12 +402,15 @@
396 for i, codec := range codecs {402 for i, codec := range codecs {
397 c.Logf("codec %d", i)403 c.Logf("codec %d", i)
398 empty_input := charm.Meta{}404 empty_input := charm.Meta{}
405 empty_input.Provides = make(map[string]charm.Relation)
406 empty_input.Peers = make(map[string]charm.Relation)
407 empty_input.Requires = make(map[string]charm.Relation)
399 data, err := codec.Marshal(empty_input)408 data, err := codec.Marshal(empty_input)
400 c.Assert(err, gc.IsNil)409 c.Assert(err, gc.IsNil)
401 var empty_output charm.Meta410 var empty_output charm.Meta
402 err = codec.Unmarshal(data, &empty_output)411 err = codec.Unmarshal(data, &empty_output)
403 c.Assert(err, gc.IsNil)412 c.Assert(err, gc.IsNil)
404 c.Assert(empty_input, gc.DeepEquals, empty_output)413 c.Assert(empty_output, gc.DeepEquals, empty_input)
405 }414 }
406}415}
407416
408417
=== modified file 'schema/schema.go'
--- schema/schema.go 2014-01-15 10:50:11 +0000
+++ schema/schema.go 2014-05-28 05:03:23 +0000
@@ -293,6 +293,11 @@
293293
294func (c mapC) Coerce(v interface{}, path []string) (interface{}, error) {294func (c mapC) Coerce(v interface{}, path []string) (interface{}, error) {
295 rv := reflect.ValueOf(v)295 rv := reflect.ValueOf(v)
296
297 // treat nil value as empty map
298 if rv.Kind() == reflect.Invalid {
299 return make(map[interface{}]interface{}), nil
300 }
296 if rv.Kind() != reflect.Map {301 if rv.Kind() != reflect.Map {
297 return nil, error_{"map", v, path}302 return nil, error_{"map", v, path}
298 }303 }
@@ -334,6 +339,11 @@
334339
335func (c stringMapC) Coerce(v interface{}, path []string) (interface{}, error) {340func (c stringMapC) Coerce(v interface{}, path []string) (interface{}, error) {
336 rv := reflect.ValueOf(v)341 rv := reflect.ValueOf(v)
342
343 // treat nil value as empty map
344 if rv.Kind() == reflect.Invalid {
345 return make(map[string]interface{}), nil
346 }
337 if rv.Kind() != reflect.Map {347 if rv.Kind() != reflect.Map {
338 return nil, error_{"map", v, path}348 return nil, error_{"map", v, path}
339 }349 }
@@ -399,6 +409,11 @@
399409
400func (c fieldMapC) Coerce(v interface{}, path []string) (interface{}, error) {410func (c fieldMapC) Coerce(v interface{}, path []string) (interface{}, error) {
401 rv := reflect.ValueOf(v)411 rv := reflect.ValueOf(v)
412
413 // treat nil value as empty map
414 if rv.Kind() == reflect.Invalid {
415 return make(map[string]interface{}), nil
416 }
402 if rv.Kind() != reflect.Map {417 if rv.Kind() != reflect.Map {
403 return nil, error_{"map", v, path}418 return nil, error_{"map", v, path}
404 }419 }
@@ -488,6 +503,11 @@
488503
489func (c mapSetC) Coerce(v interface{}, path []string) (interface{}, error) {504func (c mapSetC) Coerce(v interface{}, path []string) (interface{}, error) {
490 rv := reflect.ValueOf(v)505 rv := reflect.ValueOf(v)
506
507 // treat nil value as empty map
508 if rv.Kind() == reflect.Invalid {
509 return make(map[string]interface{}), nil
510 }
491 if rv.Kind() != reflect.Map {511 if rv.Kind() != reflect.Map {
492 return nil, error_{"map", v, path}512 return nil, error_{"map", v, path}
493 }513 }
494514
=== modified file 'schema/schema_test.go'
--- schema/schema_test.go 2014-01-14 13:10:26 +0000
+++ schema/schema_test.go 2014-05-28 05:03:23 +0000
@@ -250,8 +250,8 @@
250 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")250 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")
251251
252 out, err = sch.Coerce(nil, aPath)252 out, err = sch.Coerce(nil, aPath)
253 c.Assert(out, gc.IsNil)253 c.Assert(err, gc.IsNil)
254 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got nothing")254 c.Assert(out, gc.DeepEquals, map[interface{}]interface{}{})
255255
256 out, err = sch.Coerce(map[int]int{1: 1}, aPath)256 out, err = sch.Coerce(map[int]int{1: 1}, aPath)
257 c.Assert(out, gc.IsNil)257 c.Assert(out, gc.IsNil)
@@ -274,12 +274,12 @@
274 c.Assert(out, gc.DeepEquals, map[string]interface{}{"a": int64(1), "b": int64(2)})274 c.Assert(out, gc.DeepEquals, map[string]interface{}{"a": int64(1), "b": int64(2)})
275275
276 out, err = sch.Coerce(42, aPath)276 out, err = sch.Coerce(42, aPath)
277 c.Assert(out, gc.IsNil)
278 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")277 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")
278 c.Assert(out, gc.IsNil)
279279
280 out, err = sch.Coerce(nil, aPath)280 out, err = sch.Coerce(nil, aPath)
281 c.Assert(out, gc.IsNil)281 c.Assert(err, gc.IsNil)
282 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got nothing")282 c.Assert(out, gc.DeepEquals, map[string]interface{}{})
283283
284 out, err = sch.Coerce(map[int]int{1: 1}, aPath)284 out, err = sch.Coerce(map[int]int{1: 1}, aPath)
285 c.Assert(out, gc.IsNil)285 c.Assert(out, gc.IsNil)
@@ -306,8 +306,8 @@
306 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")306 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got int\\(42\\)")
307307
308 out, err = sch.Coerce(nil, aPath)308 out, err = sch.Coerce(nil, aPath)
309 c.Assert(out, gc.IsNil)309 c.Assert(err, gc.IsNil)
310 c.Assert(err, gc.ErrorMatches, "<path>: expected map, got nothing")310 c.Assert(out, gc.DeepEquals, map[string]interface{}{})
311311
312 out, err = sch.Coerce(map[string]interface{}{"a": "A", "b": "C"}, aPath)312 out, err = sch.Coerce(map[string]interface{}{"a": "A", "b": "C"}, aPath)
313 c.Assert(out, gc.IsNil)313 c.Assert(out, gc.IsNil)
@@ -416,8 +416,8 @@
416 c.Assert(err, gc.ErrorMatches, `<path>: expected map, got int\(42\)`)416 c.Assert(err, gc.ErrorMatches, `<path>: expected map, got int\(42\)`)
417417
418 out, err = sch.Coerce(nil, aPath)418 out, err = sch.Coerce(nil, aPath)
419 c.Assert(out, gc.IsNil)419 c.Assert(err, gc.IsNil)
420 c.Assert(err, gc.ErrorMatches, `<path>: expected map, got nothing`)420 c.Assert(out, gc.DeepEquals, map[string]interface{}{})
421421
422 // First path entry shouldn't have dots in an error message.422 // First path entry shouldn't have dots in an error message.
423 out, err = sch.Coerce(map[string]int{"a": 1}, nil)423 out, err = sch.Coerce(map[string]int{"a": 1}, nil)
424424
=== added directory 'testing/repo/quantal/empty-fields'
=== added file 'testing/repo/quantal/empty-fields/metadata.yaml'
--- testing/repo/quantal/empty-fields/metadata.yaml 1970-01-01 00:00:00 +0000
+++ testing/repo/quantal/empty-fields/metadata.yaml 2014-05-28 05:03:23 +0000
@@ -0,0 +1,6 @@
1name: empty-fields
2summary: "Kerosene powered blender"
3description: "Description here"
4provides:
5peers:
6requires:

Subscribers

People subscribed via source and target branches

to status/vote changes: