Przeglądaj źródła

Merge pull request #37 from vmarkovtsev/master

Move featureFlags from global scope to PipelineRegistry
Vadim Markovtsev 7 lat temu
rodzic
commit
85e172e1e8
4 zmienionych plików z 32 dodań i 19 usunięć
  1. 10 2
      pipeline.go
  2. 6 2
      pipeline_test.go
  3. 11 11
      registry.go
  4. 5 4
      registry_test.go

+ 10 - 2
pipeline.go

@@ -217,8 +217,16 @@ func (pipeline *Pipeline) SetFeature(name string) {
 	pipeline.features[name] = true
 }
 
-func (pipeline *Pipeline) SetFeaturesFromFlags() {
-	for _, feature := range featureFlags.Flags {
+func (pipeline *Pipeline) SetFeaturesFromFlags(registry ...*PipelineItemRegistry) {
+	var ffr *PipelineItemRegistry
+	if len(registry) == 0 {
+		ffr = Registry
+	} else if len(registry) == 1 {
+		ffr = registry[0]
+	} else {
+		panic("Zero or one registry is allowed to be passed.")
+	}
+	for _, feature := range ffr.featureFlags.Flags {
 		pipeline.SetFeature(feature)
 	}
 }

+ 6 - 2
pipeline_test.go

@@ -161,13 +161,17 @@ func TestPipelineFeatures(t *testing.T) {
 	assert.True(t, val)
 	val, exists := pipeline.GetFeature("!")
 	assert.False(t, exists)
-	featureFlags.Set("777")
+	Registry.featureFlags.Set("777")
 	defer func() {
-		featureFlags = arrayFeatureFlags{Flags: []string{}, Choices: map[string]bool{}}
+		Registry.featureFlags = arrayFeatureFlags{Flags: []string{}, Choices: map[string]bool{}}
 	}()
 	pipeline.SetFeaturesFromFlags()
 	_, exists = pipeline.GetFeature("777")
 	assert.False(t, exists)
+	assert.Panics(t, func() {
+		pipeline.SetFeaturesFromFlags(
+			&PipelineItemRegistry{}, &PipelineItemRegistry{})
+	})
 }
 
 func TestPipelineRun(t *testing.T) {

+ 11 - 11
registry.go

@@ -13,9 +13,10 @@ import (
 
 // PipelineItemRegistry contains all the known PipelineItem-s.
 type PipelineItemRegistry struct {
-	provided   map[string][]reflect.Type
-	registered map[string]reflect.Type
-	flags      map[string]reflect.Type
+	provided     map[string][]reflect.Type
+	registered   map[string]reflect.Type
+	flags        map[string]reflect.Type
+	featureFlags arrayFeatureFlags
 }
 
 // Register adds another PipelineItem to the registry.
@@ -138,8 +139,6 @@ func (acf *arrayFeatureFlags) Type() string {
 	return "string"
 }
 
-var featureFlags = arrayFeatureFlags{Flags: []string{}, Choices: map[string]bool{}}
-
 // AddFlags inserts the cmdline options from PipelineItem.ListConfigurationOptions(),
 // FeaturedPipelineItem().Features() and LeafPipelineItem.Flag() into the global "flag" parser
 // built into the Go runtime.
@@ -175,7 +174,7 @@ func (registry *PipelineItemRegistry) AddFlags(flagSet *pflag.FlagSet) (
 		}
 		if fpi, ok := itemIface.(FeaturedPipelineItem); ok {
 			for _, f := range fpi.Features() {
-				featureFlags.Choices[f] = true
+				registry.featureFlags.Choices[f] = true
 			}
 		}
 		if fpi, ok := itemIface.(LeafPipelineItem); ok {
@@ -196,10 +195,10 @@ func (registry *PipelineItemRegistry) AddFlags(flagSet *pflag.FlagSet) (
 		flags[ConfigPipelineDryRun] = iface
 	}
 	features := []string{}
-	for f := range featureFlags.Choices {
+	for f := range registry.featureFlags.Choices {
 		features = append(features, f)
 	}
-	flagSet.Var(&featureFlags, "feature",
+	flagSet.Var(&registry.featureFlags, "feature",
 		fmt.Sprintf("Enables the items which depend on the specified features. Can be specified "+
 			"multiple times. Available features: [%s] (see --feature below).",
 			strings.Join(features, ", ")))
@@ -208,7 +207,8 @@ func (registry *PipelineItemRegistry) AddFlags(flagSet *pflag.FlagSet) (
 
 // Registry contains all known pipeline item types.
 var Registry = &PipelineItemRegistry{
-	provided:   map[string][]reflect.Type{},
-	registered: map[string]reflect.Type{},
-	flags:      map[string]reflect.Type{},
+	provided:     map[string][]reflect.Type{},
+	registered:   map[string]reflect.Type{},
+	flags:        map[string]reflect.Type{},
+	featureFlags: arrayFeatureFlags{Flags: []string{}, Choices: map[string]bool{}},
 }

+ 5 - 4
registry_test.go

@@ -11,9 +11,10 @@ import (
 
 func getRegistry() *PipelineItemRegistry {
 	return &PipelineItemRegistry{
-		provided:   map[string][]reflect.Type{},
-		registered: map[string]reflect.Type{},
-		flags:      map[string]reflect.Type{},
+		provided:     map[string][]reflect.Type{},
+		registered:   map[string]reflect.Type{},
+		flags:        map[string]reflect.Type{},
+		featureFlags: arrayFeatureFlags{Flags: []string{}, Choices: map[string]bool{}},
 	}
 }
 
@@ -150,7 +151,7 @@ func TestRegistryFeatures(t *testing.T) {
 	assert.False(t, val)
 	val, _ = pipeline.GetFeature("other")
 	assert.False(t, val)
-	pipeline.SetFeaturesFromFlags()
+	pipeline.SetFeaturesFromFlags(reg)
 	val, _ = pipeline.GetFeature("power")
 	assert.True(t, val)
 	val, _ = pipeline.GetFeature("other")