wrkflo 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92d4805587cc03e7998552a6259cf57a571e864c
4
- data.tar.gz: 41f6e3f8d01d326612f876f683880ff1f633f819
3
+ metadata.gz: 590973490ce5df36fb5a324843678d1f34abf517
4
+ data.tar.gz: 97c22d905943c69883b41faba0aa445c501c7dc6
5
5
  SHA512:
6
- metadata.gz: 85726e95f9f54eefcd9b6763d33cd2646eff4c5fe8e0744e08d3f351ff75273eb1cb481aaed82b148488d5d8e889dfa07d706679146cfac93d6053d0813f35c7
7
- data.tar.gz: 315f2af6027850d4c135cd409890cd2d4b45c66bb0cb1cc7004a2a7c1a571b589fd830af93dbe66e2c55b013048eed80228d7db90d31f537c9830ba1caab6fe2
6
+ metadata.gz: 32e4d2c3c8df4e2b1674c7dac5ddff1a0ee6410e778c2d687c49fb973aaf50332c9bb2a8bb10457fc5f5a64820a41cc86e3d02cb1535085e8a8c17d75f77ca7d
7
+ data.tar.gz: feca1bf42f31d01176b6875f0940e43fd4a8566c45a24ce8210aa87bf14585f4af1e9802825599dd173ac63a2f405ce0e6d382855bd1d76c33e01c25be029d91
data/bin/wrkflo CHANGED
@@ -4,15 +4,7 @@ require 'optparse'
4
4
  require 'pp'
5
5
  require 'yaml'
6
6
 
7
- require 'wrkflo/wrkflo'
8
-
9
-
10
- # Abort execution with the given message, exiting with the given status code.
11
- def error_out message, status: 1
12
- $stderr.puts message
13
- $stderr.puts "Run `wrkflo --help` for usage information."
14
- exit status
15
- end
7
+ require 'wrkflo'
16
8
 
17
9
 
18
10
  options = {
@@ -23,7 +15,7 @@ options = {
23
15
  OptionParser.new do |opts|
24
16
  opts.banner = "Usage: wrkflo [options] <project>"
25
17
  opts.separator "Start working on things faster with predefined workflows"
26
- opts.version = Wrkflo::VERSION
18
+ opts.version = WRKFLO::VERSION
27
19
 
28
20
  opts.on("-b", "--backward", "Reverse step order and undo compatible steps") do |b|
29
21
  options[:backward] = b
@@ -42,22 +34,22 @@ OptionParser.new do |opts|
42
34
  # Without this rescue, Ruby would print the stack trace
43
35
  # of the error. Instead, we want to show the error message,
44
36
  # suggest -h or --help, and exit 1.
45
- error_out(error)
37
+ Notifier.error_out(error)
46
38
  end
47
39
  end
48
40
 
49
41
 
50
42
  project_name = ARGV[0]
51
- error_out('No project specified.') if project_name.nil?
43
+ Notifier.error_out('No project specified.') if project_name.nil?
52
44
 
53
45
  # An object representation of the entire wrkflo profile, merged with
54
46
  # the options given for this run.
55
- wrkflo = WrkFlo.new(options)
47
+ wrkflo = WRKFLO::WrkFlo.new(options)
56
48
  # The project workflow to execute on this run.
57
49
  project = wrkflo[project_name]
58
50
  # If no project was specified, notify and exit
59
51
  if project == nil
60
- error_out("Project '#{project_name}' does not exist in '#{wrkflo.profile_source}'.")
52
+ Notifier.error_out("Project '#{project_name}' does not exist in '#{wrkflo.profile_source}'.")
61
53
  end
62
54
 
63
55
  # Run the project workflow in the direction given from the terminal
@@ -0,0 +1,13 @@
1
+ require 'os'
2
+
3
+ require 'wrkflo/version'
4
+ require 'wrkflo/notifier'
5
+
6
+ require 'wrkflo/configurable/property'
7
+ require 'wrkflo/configurable'
8
+
9
+ require 'wrkflo/profile'
10
+ require 'wrkflo/step'
11
+ require 'wrkflo/project'
12
+
13
+ require 'wrkflo/wrkflo'
@@ -1,37 +1,56 @@
1
- require 'wrkflo/configurable/property'
1
+ module WRKFLO
2
+ module Configurable
3
+ module ClassMethods
4
+ # A list of properties defined by the owner
5
+ def properties
6
+ @properties ||= {}
7
+ end
2
8
 
3
- module Configurable
4
- module ClassMethods
5
- # A list of properties defined by the owner
6
- def properties
7
- @properties ||= {}
9
+ # Define a new property for the owning object
10
+ def property name, required: false, type: Object, default: nil
11
+ properties[name] = Property.new(name, required, type, default)
12
+ end
8
13
  end
9
14
 
10
- # Define a new property for the owning object
11
- def property name, required: false, default: nil
12
- properties[name] = Property.new(name, required, default)
15
+ def self.included base
16
+ base.extend ClassMethods
13
17
  end
14
- end
15
18
 
16
- def self.included base
17
- base.extend ClassMethods
18
- end
19
19
 
20
+ def apply_configuration raw_config
21
+ final_config = self.class.properties.each.with_object({}) do |(name, prop), h|
22
+ provided_value = raw_config[name.to_s]
23
+ # Determine the real value based on the property's definition
24
+ real_value = prop.resolve_value(provided_value)
25
+ # Remember the real value in the actual configuration
26
+ h[name.to_sym] = real_value
27
+ end
20
28
 
21
- def apply_configuration raw_config
22
- final_config = self.class.properties.each.with_object({}) do |(name, prop), h|
23
- provided_value = raw_config[name.to_s]
24
- # Determine the real value based on the property's definition
25
- real_value = prop.resolve_value(provided_value)
26
- # Remember the real value in the actual configuration
27
- h[name.to_sym] = real_value
29
+ # Create a struct from the configuration hash to enable dot-access.
30
+ @configuration = Struct.new(*final_config.keys).new(*final_config.values)
28
31
  end
29
32
 
30
- # Create a struct from the configuration hash to enable dot-access.
31
- @configuration = Struct.new(*final_config.keys).new(*final_config.values)
32
- end
33
+ # Returns `true` if the configuration is valid. Otherwise, returns a pair
34
+ # of the property and a reason. If a block is given, this pair is also
35
+ # passed to the block.
36
+ def validate_configuration
37
+ self.class.properties.values.each do |prop|
38
+ if prop.required?
39
+ unless config.respond_to?(prop.name)
40
+ return [prop, nil, :required].tap{ |f| yield f if block_given? }
41
+ end
42
+ end
43
+
44
+ value = config.send(prop.name)
33
45
 
34
- def config
35
- @configuration
46
+ return [prop, value, :type].tap{ |f| yield f if block_given? } unless prop.matches_type?(value)
47
+ end
48
+
49
+ return true
50
+ end
51
+
52
+ def config
53
+ @configuration
54
+ end
36
55
  end
37
56
  end
@@ -1,24 +1,73 @@
1
- module Configurable
2
- class Property
3
- # The name of the property as it should appear in the configuration
4
- attr_accessor :name
5
- # Whether the property is required to be provided by the user
6
- attr_accessor :required
7
- alias_method :required?, :required
8
- # The default value to be given to this property if one is not provided
9
- attr_accessor :default
1
+ module WRKFLO
2
+ module Configurable
3
+ class Property
4
+ # The name of the property as it should appear in the configuration
5
+ attr_accessor :name
6
+ # Whether the property is required to be provided by the user
7
+ attr_accessor :required
8
+ alias_method :required?, :required
9
+ # The expected type of the value
10
+ attr_accessor :type
11
+ # The default value to be given to this property if one is not provided
12
+ attr_accessor :default
10
13
 
11
14
 
12
- def initialize name, is_required, default_value
13
- @name = name
14
- @required = is_required
15
- @default = default_value
16
- end
15
+ def initialize name, is_required, expected_type, default_value
16
+ @name = name
17
+ @required = is_required
18
+ @default = default_value
19
+ @type = expected_type
20
+ end
21
+
22
+
23
+ # Assign a value to this property
24
+ def resolve_value value
25
+ value.nil? ? @default : value
26
+ end
27
+
28
+ # Returns true if `value` is of the type expected by this property. Returns
29
+ # false otherwise.
30
+ # For simple types, this is a simple `is_a?` check.
31
+ # For arrays, two different rules apply:
32
+ # - `Array[]` expects an arbitrary array of values.
33
+ # - `Array[Float]` expects an arbitrary-length array of `Float` values.
34
+ # - `Array[Float, String, ...]` expects an Array of exactly those types.
35
+ def matches_type? value, expected_type: type
36
+ case expected_type
37
+ # Raw class types
38
+ when Array
39
+ case expected_type.length
40
+ when 0
41
+ return value.is_a?(Array)
42
+ when 1
43
+ return value.all?{ |v| matches_type?(v, expected_type: expected_type[0]) }
44
+ else
45
+ return expected_type.zip([value].flatten(1)).all?{ |t, v| matches_type?(v, expected_type: t) }
46
+ end
47
+ else
48
+ value.is_a?(expected_type)
49
+ end
50
+ end
17
51
 
52
+ def type_as_string expected_type: type
53
+ case expected_type
54
+ when Array
55
+ value_types = expected_type.map{ |t| t.to_s }
56
+ "Array[#{value_types.join(',')}]"
57
+ else
58
+ expected_type.to_s
59
+ end
60
+ end
18
61
 
19
- # Assign a value to this property
20
- def resolve_value value
21
- value.nil? ? @default : value
62
+ def value_type_as_string value
63
+ case value
64
+ when Array
65
+ value_types = value.map{ |v| v.class.to_s }
66
+ "Array[#{value_types.join(',')}]"
67
+ else
68
+ value.class.to_s
69
+ end
70
+ end
22
71
  end
23
72
  end
24
73
  end
@@ -0,0 +1,21 @@
1
+ module WRKFLO
2
+ module Notifier
3
+ FOOTER_TEXT = <<-END_FOOTER
4
+ Run `wrkflo --help` for usage information.
5
+ END_FOOTER
6
+
7
+ # Write an error message to stderr and abort execution, exiting with the
8
+ # given status code, or `1` if no status code is specified.
9
+ def self.error_out *messages, type: "Error", status: 1
10
+ $stderr.puts "#{type}: #{messages.first}"
11
+ messages.drop(1).each{ |msg| $stderr.puts "\t#{msg}" }
12
+ $stderr.puts FOOTER_TEXT
13
+ exit status
14
+ end
15
+
16
+ # Write an arbitrary message to stdout.
17
+ def self.log message
18
+ $stdout.puts message
19
+ end
20
+ end
21
+ end
@@ -1,13 +1,13 @@
1
- class Profile
2
- def self.load source
3
- @projects = YAML.load_file(source)
4
- @options = @projects.delete("options")
5
- rescue
6
- $stderr.puts "Could not load configuration at '#{source}'."
7
- $stderr.puts "Make sure the file exists before running `wrkflo`."
8
- exit 1
9
- end
1
+ module WRKFLO
2
+ class Profile
3
+ def self.load source
4
+ @projects = YAML.load_file(source)
5
+ @options = @projects.delete("options")
6
+ rescue
7
+ Notifier.error_out("Could not load configuration at '#{source}'.", type: "ConfigurationError")
8
+ end
10
9
 
11
- def self.projects; @projects; end
12
- def self.options; @options; end
10
+ def self.projects; @projects; end
11
+ def self.options; @options; end
12
+ end
13
13
  end
@@ -1,67 +1,67 @@
1
- require 'wrkflo/step'
1
+ module WRKFLO
2
+ class Project
3
+ attr_accessor :name, :steps
2
4
 
3
- class Project
4
- attr_accessor :name, :steps
5
+ def initialize name
6
+ # The name of this project workflow
7
+ @name = name
8
+ # The raw configuration used by this project
9
+ @config = Profile.projects[@name]
10
+ # The steps that make up this workflow
11
+ @steps = @config.map{ |name, conf| Step.create(name, conf, self) }
12
+ # The step currently being executed
13
+ @current_step = 0
14
+ end
5
15
 
6
- def initialize name
7
- # The name of this project workflow
8
- @name = name
9
- # The raw configuration used by this project
10
- @config = Profile.projects[@name]
11
- # The steps that make up this workflow
12
- @steps = @config.map{ |name, conf| Step.create(name, conf, self) }
13
- # The step currently being executed
14
- @current_step = 0
15
- end
16
+ # Run each step in the order they are specified
17
+ def run
18
+ meta_log "Running workflow '#{@name}'"
19
+ # Reset the current step number
20
+ @current_step_num = 0
21
+ # Run the steps
22
+ @steps.each do |step|
23
+ # Remember the step being run
24
+ @current_step = step
25
+ # Increment the current step so that the first step is 1
26
+ @current_step_num += 1
27
+ # Run the step
28
+ @current_step.setup
29
+ @current_step.run
30
+ end
16
31
 
17
- # Run each step in the order they are specified
18
- def run
19
- meta_log "Running workflow '#{@name}'"
20
- # Reset the current step number
21
- @current_step_num = 0
22
- # Run the steps
23
- @steps.each do |step|
24
- # Remember the step being run
25
- @current_step = step
26
- # Increment the current step so that the first step is 1
27
- @current_step_num += 1
28
- # Run the step
29
- @current_step.setup
30
- @current_step.run
32
+ meta_log "Workflow complete"
31
33
  end
32
34
 
33
- meta_log "Workflow complete"
34
- end
35
+ # Undo the steps in reverse order
36
+ def unrun
37
+ meta_log "Reversing workflow '#{@name}'"
38
+ # Reset the current step number
39
+ @current_step_num = @steps.size
40
+ # Run the steps
41
+ @steps.each do |step|
42
+ # Track the step being run
43
+ @current_step = step
44
+ # Run the step
45
+ @current_step.setup
46
+ @current_step.unrun
47
+ # Decrement the current step so that the last step is 1
48
+ @current_step_num -= 1
49
+ end
35
50
 
36
- # Undo the steps in reverse order
37
- def unrun
38
- meta_log "Reversing workflow '#{@name}'"
39
- # Reset the current step number
40
- @current_step_num = @steps.size
41
- # Run the steps
42
- @steps.each do |step|
43
- # Track the step being run
44
- @current_step = step
45
- # Run the step
46
- @current_step.setup
47
- @current_step.unrun
48
- # Decrement the current step so that the last step is 1
49
- @current_step_num -= 1
51
+ meta_log "Workflow reversed"
50
52
  end
51
53
 
52
- meta_log "Workflow reversed"
53
- end
54
-
55
- # Post a message to the terminal with some identifying information
56
- def log message
57
- puts " - Step ##{@current_step_num} (#{@current_step.name}): #{message}"
58
- end
54
+ # Post a message to the terminal with some identifying information
55
+ def log message
56
+ puts " - Step ##{@current_step_num} (#{@current_step.name}): #{message}"
57
+ end
59
58
 
60
59
 
61
- private
62
- # Write a log message with a different prefix marker to visually
63
- # indicate a meta-type message
64
- def meta_log message
65
- puts ">> #{message}"
66
- end
60
+ private
61
+ # Write a log message with a different prefix marker to visually
62
+ # indicate a meta-type message
63
+ def meta_log message
64
+ puts ">> #{message}"
65
+ end
66
+ end
67
67
  end
@@ -1,79 +1,96 @@
1
- require 'os'
2
- require 'wrkflo/configurable'
1
+ module WRKFLO
2
+ class Step
3
+ attr_accessor :name, :raw_config, :project
3
4
 
4
- class Step
5
- attr_accessor :name, :raw_config, :project
5
+ # A hash of step aliases to their respective classes. This map determines
6
+ # the class that a given step in a project will be transformed into.
7
+ @@step_map = { }
6
8
 
7
- # A hash of step aliases to their respective classes. This map determines
8
- # the class that a given step in a project will be transformed into.
9
- @@step_map = { }
9
+ class << self
10
+ # Add an alias for this class to the step map. Used by subclasses to
11
+ # register their definitions
12
+ def add_alias name
13
+ @@step_map[name.to_sym] = self
14
+ end
10
15
 
11
- class << self
12
- # Add an alias for this class to the step map. Used by subclasses to
13
- # register their definitions
14
- def add_alias name
15
- @@step_map[name.to_sym] = self
16
+ # Create a new instance of a Step based on the step map entry. If none
17
+ # exists, a generic Step is created.
18
+ def create name='', config={}, project=nil
19
+ @@step_map[name.to_sym].new(name, config, project) || Step.new(name, config, project)
20
+ end
16
21
  end
17
22
 
18
- # Create a new instance of a Step based on the step map entry. If none
19
- # exists, a generic Step is created.
20
- def create name='', config={}, project=nil
21
- @@step_map[name.to_sym].new(name, config, project) || Step.new(name, config, project)
22
- end
23
- end
24
23
 
24
+ include Configurable
25
25
 
26
- include Configurable
27
26
 
27
+ def initialize name, raw_config, project=nil
28
+ # The name for this step
29
+ @name = name
30
+ # The options that define this step
31
+ @raw_config = raw_config
32
+ # The project to which this step belongs
33
+ @project = project
34
+ # Generate the finalized step configuration
35
+ apply_configuration(@raw_config)
36
+ # Always validate the new configuration unless specifically told not to.
37
+ ensure_valid_configuration
38
+ # Run step-specific initialization
39
+ init
40
+ end
28
41
 
29
- def initialize name, raw_config, project=nil
30
- # The name for this step
31
- @name = name
32
- # The options that define this step
33
- @raw_config = raw_config
34
- # The project to which this step belongs
35
- @project = project
36
- # Generate the finalized step configuration
37
- apply_configuration(@raw_config)
38
- # Run step-specific initialization
39
- init
40
- end
42
+ # A pass through to this step's project's log. If this step has no project,
43
+ # a simple puts call is used instead.
44
+ def log message
45
+ @project ? @project.log(message) : puts(message)
46
+ end
41
47
 
42
- # A pass through to this step's project's log. If this step has no project,
43
- # a simple puts call is used instead.
44
- def log message
45
- @project ? @project.log(message) : puts(message)
46
- end
47
48
 
49
+ # STEP METHODS
50
+ #
51
+ # These methods should be defined by all Step subclasses as given by their
52
+ # descriptions.
48
53
 
49
- # STEP METHODS
50
- #
51
- # These methods should be defined by all Step subclasses as given by their
52
- # descriptions.
54
+ # Work done immediately after initializing this step
55
+ def init; end
56
+ # Common work done before running and unrunning.
57
+ def setup; end
58
+ # The code to run when running this step normally
59
+ def run
60
+ log "Nothing to do."
61
+ end
62
+ # The code to run when running this step backwards
63
+ def unrun
64
+ log "Nothing to do."
65
+ end
53
66
 
54
- # Work done immediately after initializing this step
55
- def init; end
56
- # Common work done before running and unrunning.
57
- def setup; end
58
- # The code to run when running this step normally
59
- def run
60
- log "Nothing to do."
61
- end
62
- # The code to run when running this step backwards
63
- def unrun
64
- log "Nothing to do."
65
- end
67
+
68
+ protected
69
+
70
+ # Return true if being run on the given platform. If a block is given, run
71
+ # the block only if being run on the given platform and return the result.
72
+ def on platform
73
+ return OS.send("#{platform}?").tap{ |yn| yield yn if block_given? }
74
+ end
66
75
 
67
76
 
68
- protected
77
+ private
69
78
 
70
- # Return true if being run on the given platform. If a block is given, run
71
- # the block only if being run on the given platform and return the result.
72
- def on platform
73
- if block_given?
74
- yield if OS.send("#{platform}?")
75
- else
76
- return OS.send("#{platform}?")
79
+ def ensure_valid_configuration
80
+ validate_configuration do |prop, value, reason|
81
+ prop_name = "`#{@name}.#{prop.name}`"
82
+ case reason
83
+ when :required
84
+ Notifier.error_out("required property #{prop_name} not provided for `#{@project.name}`.", type: "ConfigurationError")
85
+ when :type
86
+ Notifier.error_out(
87
+ "property #{prop_name} for `#{@project.name}` does not match expected type.",
88
+ "expected: #{prop.type_as_string}",
89
+ "got: #{prop.value_type_as_string(value)}")
90
+ else
91
+ Notifier.error_out("Unknown error", type: "ConfigurationError")
92
+ end
93
+ end
77
94
  end
78
- end
95
+ end
79
96
  end
@@ -1,10 +1,12 @@
1
- class AtomStep < Step
2
- add_alias :atom
1
+ module WRKFLO
2
+ class AtomStep < Step
3
+ add_alias :atom
3
4
 
4
- property :path, required: true
5
+ property :path, required: true, type: String
5
6
 
6
- def run
7
- log "Opening an Atom Window at #{config.path}"
8
- `atom #{config.path}`
7
+ def run
8
+ log "Opening an Atom Window at #{config.path}"
9
+ `atom #{config.path}`
10
+ end
9
11
  end
10
12
  end
@@ -1,15 +1,17 @@
1
- class Editor < Step
2
- add_alias :editor
1
+ module WRKFLO
2
+ class Editor < Step
3
+ add_alias :editor
3
4
 
4
- property :which, required: false, default: Profile.options['editor']
5
- property :path, required: true
5
+ property :which, required: false, type: String, default: Profile.options['editor']
6
+ property :path, required: true, type: String
6
7
 
7
- def init
8
- @editor = config.which
9
- @step = Step.create(@editor.to_sym, @raw_config, project)
10
- @name = "editor[#{@step.name}]"
11
- end
8
+ def init
9
+ @editor = config.which
10
+ @step = Step.create(@editor.to_sym, @raw_config, project)
11
+ @name = "editor[#{@step.name}]"
12
+ end
12
13
 
13
- def run; @step.run; end
14
- def unrun; @step.unrun; end
14
+ def run; @step.run; end
15
+ def unrun; @step.unrun; end
16
+ end
15
17
  end
@@ -1,10 +1,12 @@
1
- class EmacsStep < Step
2
- add_alias :emacs
1
+ module WRKFLO
2
+ class EmacsStep < Step
3
+ add_alias :emacs
3
4
 
4
- property :path, required: true
5
+ property :path, required: true, type: String
5
6
 
6
- def run
7
- log "Opening an Emacs frame at #{config.path}"
8
- `emacsclient -c -a "" -n #{config.path}`
7
+ def run
8
+ log "Opening an Emacs frame at #{config.path}"
9
+ `emacsclient -c -a "" -n #{config.path}`
10
+ end
9
11
  end
10
12
  end
@@ -1,18 +1,20 @@
1
- class FileSystem < Step
2
- add_alias :filesystem
3
- add_alias :fs
1
+ module WRKFLO
2
+ class FileSystem < Step
3
+ add_alias :filesystem
4
+ add_alias :fs
4
5
 
5
- property :which, required: false, default: Profile.options['filesystem']
6
- property :host, required: true
7
- property :remote_path, required: true
8
- property :local_path, required: true
6
+ property :which, required: false, type: String, default: Profile.options['filesystem']
7
+ property :host, required: true, type: String
8
+ property :remote_path, required: true, type: String
9
+ property :local_path, required: true, type: String
9
10
 
10
- def init
11
- @filesystem = config.which
12
- @step = Step.create(@filesystem.to_sym, @raw_config, project)
13
- @name = "filesystem[#{@step.name}]"
14
- end
11
+ def init
12
+ @filesystem = config.which
13
+ @step = Step.create(@filesystem.to_sym, @raw_config, project)
14
+ @name = "filesystem[#{@step.name}]"
15
+ end
15
16
 
16
- def run; @step.run; end
17
- def unrun; @step.unrun; end
17
+ def run; @step.run; end
18
+ def unrun; @step.unrun; end
19
+ end
18
20
  end
@@ -0,0 +1,19 @@
1
+ module WRKFLO
2
+ class NFSStep < Step
3
+ add_alias :nfs
4
+
5
+ property :host, required: true, type: String
6
+ property :remote_path, required: true, type: String
7
+ property :local_path, required: true, type: String
8
+
9
+ def run
10
+ log "Mounting #{config.host}:#{config.remote_path} at #{config.local_path}"
11
+ `mount -t nfs #{config.host}:#{config.remote_path} #{config.local_path}`
12
+ end
13
+
14
+ def unrun
15
+ log "Unmounting #{config.host}:#{config.remote_path} from #{config.local_path}"
16
+ `umount #{config.local_path}`
17
+ end
18
+ end
19
+ end
@@ -1,13 +1,15 @@
1
- class SSHStep < Step
2
- add_alias :ssh
1
+ module WRKFLO
2
+ class SSHStep < Step
3
+ add_alias :ssh
3
4
 
4
- property :host, required: true
5
- property :directory, required: true
5
+ property :host, required: true, type: String
6
+ property :directory, required: true, type: String
6
7
 
7
- def run
8
- log "SSHing into #{config.host} at #{config.directory}"
8
+ def run
9
+ log "SSHing into #{config.host} at #{config.directory}"
9
10
 
10
- ssh_command = "ssh -t #{config.host} \\\"#{config.directory}; bash --login\\\""
11
- `osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' -e 'tell application "Terminal" to do script "#{ssh_command}" in selected tab of the front window'`
11
+ ssh_command = "ssh -t #{config.host} \\\"#{config.directory}; bash --login\\\""
12
+ `osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' -e 'tell application "Terminal" to do script "#{ssh_command}" in selected tab of the front window'`
13
+ end
12
14
  end
13
15
  end
@@ -1,17 +1,19 @@
1
- class SSHFSStep < Step
2
- add_alias :sshfs
1
+ module WRKFLO
2
+ class SSHFSStep < Step
3
+ add_alias :sshfs
3
4
 
4
- property :host, required: true
5
- property :remote_path, required: true
6
- property :local_path, required: true
5
+ property :host, required: true, type: String
6
+ property :remote_path, required: true, type: String
7
+ property :local_path, required: true, type: String
7
8
 
8
- def run
9
- log "Mounting #{config.host}:#{config.remote_path} at #{config.local_path}"
10
- `sshfs #{config.host}:#{config.remote_path} #{config.local_path}`
11
- end
9
+ def run
10
+ log "Mounting #{config.host}:#{config.remote_path} at #{config.local_path}"
11
+ `sshfs #{config.host}:#{config.remote_path} #{config.local_path}`
12
+ end
12
13
 
13
- def unrun
14
- log "Unmounting #{config.host}:#{config.remote_path} from #{config.local_path}"
15
- `umount #{config.local_path}`
14
+ def unrun
15
+ log "Unmounting #{config.host}:#{config.remote_path} from #{config.local_path}"
16
+ `umount #{config.local_path}`
17
+ end
16
18
  end
17
19
  end
@@ -1,11 +1,13 @@
1
- class SublimeStep < Step
2
- add_alias :sublime
3
- add_alias :subl
1
+ module WRKFLO
2
+ class SublimeStep < Step
3
+ add_alias :sublime
4
+ add_alias :subl
4
5
 
5
- property :path, required: true
6
+ property :path, required: true, type: String
6
7
 
7
- def run
8
- log "Opening a Sublime Window at #{config.path}"
9
- `subl -n #{config.path}`
8
+ def run
9
+ log "Opening a Sublime Window at #{config.path}"
10
+ `subl -n #{config.path}`
11
+ end
10
12
  end
11
13
  end
@@ -1,3 +1,3 @@
1
- module Wrkflo
2
- VERSION = '0.1.0'
1
+ module WRKFLO
2
+ VERSION = '0.1.1'
3
3
  end
@@ -1,51 +1,51 @@
1
- require 'wrkflo/version'
2
- require 'wrkflo/profile'
3
- require 'wrkflo/project'
4
-
5
- class WrkFlo
6
- attr_accessor :direction, :profile, :profile_source
7
-
8
- DEFAULT_STEP_PATHS = [
9
- File.join(__dir__, 'steps'),
10
- File.join(ENV['HOME'], '.wrkflo', 'steps'),
11
- File.join('.', '.wrkflo', 'steps')
12
- ]
13
-
14
- def initialize options
15
- @profile_source = options[:profile]
16
- Profile.load(@profile_source)
17
- load_step_definitions
18
- @direction = options[:backward] ? :backward : :forward
19
- end
1
+ module WRKFLO
2
+ class WrkFlo
3
+ attr_accessor :direction, :profile, :profile_source
20
4
 
21
- # Load all step definitions from various default and configured paths.
22
- def load_step_definitions
23
- # For the default directories, try to scan them if they exist.
24
- DEFAULT_STEP_PATHS.each do |path|
25
- if Dir.exists?(path)
26
- Dir[File.join(path, '*')].each{ |step_file| require step_file }
27
- end
5
+ DEFAULT_STEP_PATHS = [
6
+ File.join(__dir__, 'steps'),
7
+ File.join(ENV['HOME'], '.wrkflo', 'steps'),
8
+ File.join('.', '.wrkflo', 'steps')
9
+ ]
10
+
11
+ def initialize options
12
+ @profile_source = options[:profile]
13
+ Profile.load(@profile_source)
14
+ load_step_definitions
15
+ @direction = options[:backward] ? :backward : :forward
28
16
  end
29
17
 
30
- # For configured paths, try to require each entry and error out if one is
31
- # not available.
32
- configured_step_paths.each do |path|
33
- if Dir.exists?(path)
34
- Dir[File.join(path, '*')].each{ |step_file| require step_file }
35
- else
36
- require path
18
+ # Load all step definitions from various default and configured paths.
19
+ def load_step_definitions
20
+ # For the default directories, try to scan them if they exist.
21
+ DEFAULT_STEP_PATHS.each do |path|
22
+ if Dir.exists?(path)
23
+ Dir[File.join(path, '*')].each{ |step_file| require step_file }
24
+ end
37
25
  end
38
- end
39
- end
40
26
 
41
- # Get a specific project out of the profile. If the profile does not define
42
- # the given project, return nil.
43
- def [] project
44
- Project.new(project) if Profile.projects[project]
45
- end
27
+ # For configured paths, try to require each entry and error out if one is
28
+ # not available.
29
+ configured_step_paths.each do |path|
30
+ if Dir.exists?(path)
31
+ Dir[File.join(path, '*')].each{ |step_file| require step_file }
32
+ else
33
+ require path
34
+ end
35
+ end
36
+ end
46
37
 
47
- private
48
- def configured_step_paths
49
- Profile.options['step_definitions'] || []
38
+ # Get a specific project out of the profile. If the profile does not define
39
+ # the given project, return nil.
40
+ def [] project
41
+ Project.new(project) if Profile.projects[project]
50
42
  end
43
+
44
+
45
+ private
46
+
47
+ def configured_step_paths
48
+ Profile.options['step_definitions'] || []
49
+ end
50
+ end
51
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wrkflo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Egeland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-01 00:00:00.000000000 Z
11
+ date: 2017-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: os
@@ -60,8 +60,10 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - bin/wrkflo
63
+ - lib/wrkflo.rb
63
64
  - lib/wrkflo/configurable.rb
64
65
  - lib/wrkflo/configurable/property.rb
66
+ - lib/wrkflo/notifier.rb
65
67
  - lib/wrkflo/profile.rb
66
68
  - lib/wrkflo/project.rb
67
69
  - lib/wrkflo/step.rb
@@ -69,6 +71,7 @@ files:
69
71
  - lib/wrkflo/steps/editor.rb
70
72
  - lib/wrkflo/steps/emacs.rb
71
73
  - lib/wrkflo/steps/filesystem.rb
74
+ - lib/wrkflo/steps/nfs.rb
72
75
  - lib/wrkflo/steps/ssh.rb
73
76
  - lib/wrkflo/steps/sshfs.rb
74
77
  - lib/wrkflo/steps/sublime.rb
@@ -82,7 +85,6 @@ post_install_message:
82
85
  rdoc_options: []
83
86
  require_paths:
84
87
  - lib
85
- - lib/wrkflo
86
88
  required_ruby_version: !ruby/object:Gem::Requirement
87
89
  requirements:
88
90
  - - ">="