wrkflo 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c9902676f57eb67e87861f6cb79acbc4a1f7472
4
+ data.tar.gz: f4c48b3d64d32b15256e1ae78f482ac4c9bffdf0
5
+ SHA512:
6
+ metadata.gz: 11ad90a2ac574ca8e9cebc40436b52802ccc7fdb43b66dbe9ae38cd5aff50742717f05ad5efb9c4c0d31c4da7edc3bed044ab414e7fe6942786a23822d7a7793
7
+ data.tar.gz: 014f69b04bdc6e01e240639c94de6397420f5eb21e2aef7b4023c0f1d88cfcbe579a74b9c5844a60a926dbddcb47dd8016d79bf09f0016c8b4b5154e995db6c5
data/bin/wrkflo ADDED
@@ -0,0 +1,59 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'pp'
5
+ require 'yaml'
6
+
7
+ require 'wrkflo/wrkflo'
8
+
9
+ options = {
10
+ backward: false,
11
+ profile: ENV['HOME'] + '/.wrkflorc',
12
+ project: nil
13
+ }
14
+ OptionParser.new do |opts|
15
+ opts.banner = "Usage: workon [options] <project>"
16
+ opts.separator "Start working on things faster with predefined workflows"
17
+ opts.version = "0.0.2"
18
+
19
+ opts.on("-b", "--backward", "Reverse step order and undo compatible steps") do |b|
20
+ options[:backward] = b
21
+ end
22
+
23
+ opts.on("-f [FILE]", "--file [FILE]",
24
+ "The file to interpret as the wrkflo profile.",
25
+ "Defaults to \"~/.wrkflorc\"") do |file|
26
+ options[:profile] = file
27
+ end
28
+
29
+ begin
30
+ # Parse and remove options from ARGV.
31
+ opts.parse!
32
+ rescue OptionParser::ParseError => error
33
+ # Without this rescue, Ruby would print the stack trace
34
+ # of the error. Instead, we want to show the error message,
35
+ # suggest -h or --help, and exit 1.
36
+ $stderr.puts error
37
+ $stderr.puts "(-h or --help will show valid options)"
38
+ exit 1
39
+ end
40
+ end
41
+
42
+ # An object representation of the entire workon profile, merged with
43
+ # the options given for this run.
44
+ workon = WorkOn.new options
45
+ # The project workflow to execute on this run.
46
+ project = workon[ARGV[0]]
47
+ # If no project was specified, notify and exit
48
+ if project == nil
49
+ puts "No project specified. Nothing to do."
50
+ exit 1
51
+ end
52
+
53
+ # Run the project workflow in the direction given from the terminal
54
+ case workon.direction
55
+ when :forward
56
+ project.run
57
+ when :backward
58
+ project.unrun
59
+ end
@@ -0,0 +1,63 @@
1
+ require 'wrkflo/step'
2
+
3
+ class Project
4
+ attr_accessor :name, :steps
5
+
6
+ def initialize name, steps
7
+ # The name of this project workflow
8
+ @name = name
9
+ # The steps that make up this workflow
10
+ @steps = steps.map{ |name, config| Step.create(name, config, self) }
11
+ # The step currently being executed
12
+ @current_step = 0
13
+ end
14
+
15
+ # Run each step in the order they are specified
16
+ def run
17
+ meta_log "Running workflow '#{@name}'"
18
+ # Reset the current step number
19
+ @current_step_num = 0
20
+ # Run the steps
21
+ @steps.each do |step|
22
+ # Remember the step being run
23
+ @current_step = step
24
+ # Increment the current step so that the first step is 1
25
+ @current_step_num += 1
26
+ # Run the step
27
+ @current_step.run
28
+ end
29
+
30
+ meta_log "Workflow complete"
31
+ end
32
+
33
+ # Undo the steps in reverse order
34
+ def unrun
35
+ meta_log "Reversing workflow '#{@name}'"
36
+ # Reset the current step number
37
+ @current_step_num = @steps.size
38
+ # Run the steps
39
+ @steps.each do |step|
40
+ # Track the step being run
41
+ @current_step = step
42
+ # Run the step
43
+ @current_step.unrun
44
+ # Decrement the current step so that the last step is 1
45
+ @current_step_num -= 1
46
+ end
47
+
48
+ meta_log "Workflow reversed"
49
+ end
50
+
51
+ # Post a message to the terminal with some identifying information
52
+ def log message
53
+ puts "> Step ##{@current_step_num} (#{@current_step.name}): #{message}"
54
+ end
55
+
56
+
57
+ private
58
+ # Write a log message with a different prefix marker to visually
59
+ # indicate a meta-type message
60
+ def meta_log message
61
+ puts "- #{message}"
62
+ end
63
+ end
@@ -0,0 +1,53 @@
1
+ class Step
2
+ attr_accessor :name, :config, :project
3
+
4
+ # A hash of step aliases to their respective classes. This map determines
5
+ # the class that a given step in a project will be transformed into.
6
+ @@step_map = { }
7
+
8
+ class << self
9
+ # Add an alias for this class to the step map. Used by subclasses to
10
+ # register their definitions
11
+ def add_alias name
12
+ @@step_map[name.to_sym] = self
13
+ end
14
+
15
+ # Create a new instance of a Step based on the step map entry. If none
16
+ # exists, a generic Step is created.
17
+ def create name='', config={}, project=nil
18
+ @@step_map[name.to_sym].new(name, config, project) or Step.new(name, config, project)
19
+ end
20
+ end
21
+
22
+ def initialize name, config, project=nil
23
+ # The name for this step
24
+ @name = name
25
+ # The options that define this step
26
+ @config = config
27
+ # The project that this step belongs to
28
+ @project = project
29
+ end
30
+
31
+ # A pass through to this step's project's log. If this step has no project,
32
+ # a simple puts call is used instead.
33
+ def log message
34
+ @project ? @project.log(message) : puts(message)
35
+ end
36
+
37
+ # STEP METHODS
38
+ #
39
+ # These methods should be defined by all Step subclasses as given by their
40
+ # descriptions.
41
+
42
+ # The code to run when running this step normally
43
+ def run
44
+ log "Nothing to do."
45
+ end
46
+ # The code to run when running this step backwards
47
+ def unrun
48
+ log "Nothing to do."
49
+ end
50
+ end
51
+
52
+ # Require all step definitions
53
+ Dir[File.join(__dir__, 'steps', '*')].each{ |step_file| require step_file }
@@ -0,0 +1,10 @@
1
+ class SSHStep < Step
2
+ add_alias :ssh
3
+
4
+ def run
5
+ log "SSHing into #{config['host']} at #{config['directory']}"
6
+
7
+ ssh_command = "ssh -t #{config['host']} \\\"#{config['directory']}; bash --login\\\""
8
+ `osascript -e 'tell application "Terminal" to activate' -e 'tell application "Terminal" to set ssh_window to do script "#{ssh_command}"'`
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ class SSHFSStep < Step
2
+ add_alias :sshfs
3
+
4
+ def run
5
+ log "Mounting #{config['host']}:#{config['remote_path']} at #{config['local_path']}"
6
+ `sshfs #{config['host']}:#{config['remote_path']} #{config['local_path']}`
7
+ end
8
+
9
+ def unrun
10
+ log "Unmounting #{config['host']}:#{config['remote_path']} from #{config['local_path']}"
11
+ `umount #{config['local_path']}`
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class SublimeStep < Step
2
+ add_alias :sublime
3
+ add_alias :subl
4
+
5
+ def run
6
+ log "Opening a Sublime Window at #{config}"
7
+ `subl -n #{config}`
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ require 'wrkflo/project'
2
+
3
+ class WorkOn
4
+ attr_accessor :direction, :profile, :profile_source
5
+
6
+ def initialize options
7
+ @profile = YAML.load(File.open(options[:profile]))
8
+ @profile_source = options[:profile]
9
+ @direction = options[:backward] ? :backward : :forward
10
+ end
11
+
12
+ # Get a specific project out of the profile. If the profile does not define
13
+ # the given project, return nil.
14
+ def [] project
15
+ Project.new(project, @profile[project])
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wrkflo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Jon Egeland
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-16 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: audiobahn404@gmail.com
15
+ executables:
16
+ - wrkflo
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/wrkflo
21
+ - lib/wrkflo/project.rb
22
+ - lib/wrkflo/step.rb
23
+ - lib/wrkflo/steps/ssh.rb
24
+ - lib/wrkflo/steps/sshfs.rb
25
+ - lib/wrkflo/steps/sublime.rb
26
+ - lib/wrkflo/wrkflo.rb
27
+ homepage: http://github.com/audiobahn404/wrkflo
28
+ licenses:
29
+ - MIT
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 2.2.0
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 2.4.7
48
+ signing_key:
49
+ specification_version: 4
50
+ summary: Get working on things faster with predefined wrkflos.
51
+ test_files: []