checkcheckit 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in checkcheckit.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem 'minitest'
8
+ gem 'fakefs'
9
+ gem 'ruby-debug19'
10
+ gem 'turn'
11
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Chris Continanza
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # Check, Check, It
2
+
3
+ use checklists, like a boss
4
+
5
+ ## Installation
6
+
7
+ $ gem install checkcheckit
8
+
9
+ ## TODO
10
+
11
+ - option parsing
12
+ - save a run
13
+ - to file
14
+ - to service
15
+ - resume a run
16
+ - run commands with confirmation
17
+ - saves results
18
+ - `pull` list(s) (via git)
19
+ - `push` list(s) (via git)
20
+
21
+ ## Usage
22
+
23
+ ### `list` the checklists
24
+
25
+ `checkcheckit` assumes a home directory of ~/checkcheckit
26
+
27
+ In that directory are folders for your organizations, groups, etc.
28
+
29
+ In those folders are your checklists.
30
+
31
+ A "checklist" is just a text file.
32
+ Every line that starts with a dash '-' is a step.
33
+ Everything beneath a step is that step's body or description.
34
+
35
+ $ check list
36
+ # Checklists
37
+ heroku
38
+ todo
39
+ personal
40
+ todo
41
+ vault
42
+ deploy
43
+
44
+ ### `start` a checklist
45
+
46
+ You can go through a checklist by running `check start ` and then the checklist name.
47
+
48
+ (NIY - Not Implemented Yet)
49
+ If there are multiple checklists with the same name use the format `folder/checklist`.
50
+
51
+ When you iterate through a checklist you can just type "enter", "y", or "+" to confirm a step.
52
+
53
+ A "no", "-", or body of text (body of text NIY) is considered a failed step.
54
+ The body of text is for describing what went wrong.
55
+
56
+ For example:
57
+
58
+ $ check start deploy
59
+ |-------| Step 1: Pull everything from git
60
+ > git pull origin
61
+ Check: <enter>
62
+
63
+ |+------| Step 2: Make sure there are no uncommitted changes
64
+ > `git status`
65
+ Check: <n>
66
+
67
+ |+------| Step 3: Diff master with heroku/master
68
+ Make sure the change you want to push are what you're pushing
69
+ > git fetch heroku
70
+ > git diff heroku/master | $EDITOR
71
+ Check: <y>
72
+
73
+ |+-+----| Step 4: Run the test suite
74
+ Check: failures!
75
+
76
+
77
+
78
+ ## Contributing
79
+
80
+ 1. Fork it
81
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
82
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
83
+ 4. Push to the branch (`git push origin my-new-feature`)
84
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/check ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'checkcheckit'
4
+
5
+ args = ARGV.dup
6
+
7
+ CheckCheckIt::Console.new.run! args
data/bin/t ADDED
@@ -0,0 +1 @@
1
+ bundle exec turn -Itest test/*_test.rb
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'checkcheckit/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "checkcheckit"
8
+ gem.version = CheckCheckIt::VERSION
9
+ gem.authors = ["Chris Continanza"]
10
+ gem.email = ["christopher.continanza@gmail.com"]
11
+ gem.description = %q{Checklists like a boss}
12
+ gem.summary = %q{Command line tool for using checklists}
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = 'check'
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
@@ -0,0 +1,106 @@
1
+ require 'ostruct'
2
+
3
+ class CheckCheckIt::Console
4
+ attr_accessor :list_dir
5
+ attr_accessor :stream, :in_stream
6
+
7
+ def initialize(opts = {})
8
+ ARGV.clear
9
+ default_dir = opts.fetch(:dir, '~/checkcheckit')
10
+ @list_dir = File.expand_path(default_dir)
11
+ @stream = opts[:out_stream] || STDOUT
12
+ @in_stream = opts[:in_stream] || STDIN
13
+ end
14
+
15
+ def puts(text = '')
16
+ @stream.puts text
17
+ end
18
+
19
+ def print(text = '')
20
+ @stream.print text
21
+ end
22
+
23
+ def run!(args)
24
+ if args.length == 0
25
+ puts "No command given"
26
+ else
27
+ method = args.shift
28
+ if respond_to? method
29
+ send method, args
30
+ else
31
+ puts "did not understand: #{method}"
32
+ end
33
+ end
34
+ end
35
+
36
+ def dir
37
+ File.expand_path(@list_dir)
38
+ end
39
+
40
+ def step_through_list(list)
41
+ results = Array.new(list.steps.length, false)
42
+
43
+ list.steps.each_with_index do |step, i|
44
+ puts "#{fmt_results(results)} Step #{i+1}: #{step.name}"
45
+ puts step.body unless step.body.empty?
46
+ print "Check: "
47
+
48
+ case input = in_stream.gets
49
+ when /^[y|+]$/ || ''
50
+ results[i] = true
51
+ when /^[n|-]$/
52
+ results[i] = false
53
+ else
54
+ results[i] = false
55
+ end
56
+ puts
57
+ end
58
+
59
+ msg = results.all? { |r| r } ? "Done" : "Issues"
60
+ puts "#{fmt_results(results)} #{msg}"
61
+ save_results(list, results)
62
+ end
63
+
64
+ def save_results(list,results)
65
+ report = {
66
+ 'list-name' => list.name,
67
+ 'results' => []
68
+ }
69
+ list.steps.each_with_index do |step, i|
70
+ report['results'] << {
71
+ index: i,
72
+ name: step.name,
73
+ body: step.body,
74
+ result: results[i] ? 'CHECK' : 'FAIL',
75
+ status: results[i] ? 1 : 0,
76
+ }
77
+ end
78
+ report
79
+ end
80
+
81
+ def start(args)
82
+ target = args.join(' ')
83
+ hit = Dir[dir + '/*/*'].find{ |fname| fname.include? target }
84
+ if hit
85
+ step_through_list(List.new(hit))
86
+ else
87
+ puts "Could not find checklist via: #{target}"
88
+ end
89
+ end
90
+
91
+ def list(args)
92
+ puts "# Checklists\n"
93
+ Dir[dir + '/*'].each do |dir|
94
+ team = File.basename dir
95
+ puts team
96
+ Dir[dir + '/*'].each do |file|
97
+ puts " " + List.new(file).name
98
+ end
99
+ end
100
+ end
101
+
102
+ private
103
+ def fmt_results(results)
104
+ "|#{results.map { |r| r ? '+' : '-' }.join}|"
105
+ end
106
+ end
@@ -0,0 +1,37 @@
1
+ class List
2
+ attr_accessor :name, :body, :steps
3
+
4
+ def initialize(file)
5
+ fname = File.basename(file)
6
+ @name = fname.sub(File.extname(fname), '')
7
+ @body = File.read(file)
8
+ @steps = parse_steps(@body)
9
+ end
10
+
11
+ private
12
+
13
+ def parse_steps(body)
14
+ steps = []
15
+ current_step = nil
16
+ body.lines.each do |line|
17
+ next if line.strip.empty?
18
+ if line =~ /^-/
19
+ current_name = line.sub(/^-/,'').strip
20
+ current_step = Step.new(current_name)
21
+ steps << current_step
22
+ elsif current_step
23
+ current_step.body << line
24
+ end
25
+ end
26
+ steps
27
+ end
28
+
29
+ class Step
30
+ attr_accessor :name, :body
31
+
32
+ def initialize(name, body = '')
33
+ @name = name
34
+ @body = body
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module CheckCheckIt
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require "checkcheckit/version"
2
+
3
+ module CheckCheckIt
4
+ end
5
+
6
+ require "checkcheckit/console"
7
+ require 'checkcheckit/list'
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+
3
+ class ConsoleTest < CheckCheckIt::TestCase
4
+ def setup
5
+ super
6
+ end
7
+
8
+ def test_lists_orgs_and_lists
9
+ Examples.create_grocery_list(home)
10
+ check "list"
11
+ assert_match(/^# Checklists\n/, output)
12
+ assert_match(/^personal\n/, output)
13
+ assert_match(/^ groceries\n/, output)
14
+ end
15
+
16
+ def test_configurable_list_dir
17
+ dir = File.join('/foo', 'personal')
18
+ FileUtils.mkdir_p(dir)
19
+
20
+ @console = CheckCheckIt::Console.new(:dir => '/foo', out_stream: StringIO.new)
21
+
22
+ check "list"
23
+ assert_match(/^personal\n/, output)
24
+ end
25
+ end
26
+
data/test/helper.rb ADDED
@@ -0,0 +1,72 @@
1
+ $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '../lib')))
2
+ ENV['RACK_ENV'] = 'test'
3
+
4
+ require 'minitest/unit'
5
+ require 'minitest/spec'
6
+ require 'minitest/mock'
7
+ require 'fakefs'
8
+ require 'checkcheckit'
9
+
10
+ module Examples
11
+ def self.create_grocery_list(home)
12
+ dir = File.join(home, 'personal')
13
+ FileUtils.mkdir_p(dir)
14
+ File.open(File.join(dir, 'groceries'), 'w') do |file|
15
+ file << "- pineapple "
16
+ file << "\n- mangoes \n enhance the flavor with \n spice "
17
+ file << "\n- fudge \n best from a place in sutter creek"
18
+ end
19
+ end
20
+ end
21
+
22
+ module ConsoleTestHelpers
23
+ # Internal: Runs command lines in tests like their command line invocation.
24
+ #
25
+ # Examples:
26
+ #
27
+ # # check 'list'
28
+ #
29
+ # # check 'list deploy'
30
+ #
31
+ # # check 'start deploy'
32
+ def check(cmd_string)
33
+ console.run! cmd_string.split
34
+ end
35
+
36
+ def reset_console
37
+ ## Clear out the output
38
+ @console = nil
39
+ end
40
+
41
+ def console
42
+ @console ||= CheckCheckIt::Console.new(out_stream: StringIO.new)
43
+ end
44
+
45
+ def output
46
+ console.stream.string
47
+ end
48
+
49
+ def home
50
+ console.list_dir
51
+ end
52
+
53
+ end
54
+
55
+ class CheckCheckIt::TestCase < MiniTest::Unit::TestCase
56
+ include ConsoleTestHelpers
57
+
58
+ def setup
59
+ super
60
+ reset_console
61
+ end
62
+ end
63
+
64
+ class CheckCheckIt::Spec < MiniTest::Spec
65
+ include ConsoleTestHelpers
66
+
67
+ before do
68
+ reset_console
69
+ end
70
+ end
71
+
72
+ MiniTest::Spec.register_spec_type //, CheckCheckIt::Spec
data/test/list_test.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'helper'
2
+
3
+ class ListTest < CheckCheckIt::TestCase
4
+
5
+ def setup
6
+ Examples.create_grocery_list(home)
7
+ @list = List.new('~/checkcheckit/personal/groceries')
8
+ end
9
+
10
+ def test_list_parses_steps
11
+ @list.steps.size.must_equal 3
12
+ end
13
+
14
+ def test_list_parses_commands
15
+ end
16
+
17
+ end
@@ -0,0 +1,46 @@
1
+ require 'helper'
2
+
3
+ describe 'Storing Results after a run' do
4
+ def setup
5
+ super
6
+ Examples.create_grocery_list(home)
7
+ end
8
+
9
+ it "should record the pass/fail of each step" do
10
+ console.in_stream = MiniTest::Mock.new
11
+ console.in_stream.expect :gets, "n"
12
+ console.in_stream.expect :gets, "y"
13
+ console.in_stream.expect :gets, "n"
14
+ result = check "start groceries"
15
+ console.in_stream.verify
16
+ result["results"][0][:result].must_equal "FAIL"
17
+ result["results"][0][:status].must_equal 0
18
+ result["results"][1][:result].must_equal "CHECK"
19
+ result["results"][1][:status].must_equal 1
20
+ result["results"][2][:result].must_equal "FAIL"
21
+ result["results"][2][:status].must_equal 0
22
+ end
23
+
24
+ it "should record the name of each step" do
25
+ console.in_stream = MiniTest::Mock.new
26
+ 3.times { console.in_stream.expect :gets, "y" }
27
+ result = check "start groceries"
28
+ console.in_stream.verify
29
+ result["results"][0][:name].must_equal "pineapple"
30
+ result["results"][1][:name].must_equal "mangoes"
31
+ result["results"][2][:name].must_equal "fudge"
32
+ end
33
+
34
+ it "should record the body of each step" do
35
+ console.in_stream = MiniTest::Mock.new
36
+ 3.times { console.in_stream.expect :gets, "y" }
37
+ result = check "start groceries"
38
+ console.in_stream.verify
39
+ =begin
40
+ result["results"][0][:body].must_equal ""
41
+ result["results"][1][:name].must_equal "enhance the flavor with \n spice"
42
+ result["results"][2][:name].must_equal "best from a place in sutter creek"
43
+ =end
44
+ end
45
+ end
46
+
@@ -0,0 +1,20 @@
1
+ require 'helper'
2
+
3
+ class StartTest < CheckCheckIt::TestCase
4
+
5
+ def setup
6
+ Examples.create_grocery_list(home)
7
+ end
8
+
9
+ def test_list_parses_steps
10
+ console.in_stream = MiniTest::Mock.new
11
+ 3.times { console.in_stream.expect :gets, "y" }
12
+ result = check "start groceries"
13
+ console.in_stream.verify
14
+ end
15
+
16
+ def test_list_parses_commands
17
+ end
18
+
19
+ end
20
+
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: checkcheckit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Continanza
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-12 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Checklists like a boss
15
+ email:
16
+ - christopher.continanza@gmail.com
17
+ executables:
18
+ - check
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - bin/check
28
+ - bin/t
29
+ - checkcheckit.gemspec
30
+ - lib/checkcheckit.rb
31
+ - lib/checkcheckit/console.rb
32
+ - lib/checkcheckit/list.rb
33
+ - lib/checkcheckit/version.rb
34
+ - test/console_test.rb
35
+ - test/helper.rb
36
+ - test/list_test.rb
37
+ - test/results_test.rb
38
+ - test/start_test.rb
39
+ homepage: ''
40
+ licenses: []
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ segments:
52
+ - 0
53
+ hash: 3522511683697989869
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ segments:
61
+ - 0
62
+ hash: 3522511683697989869
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 1.8.23
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: Command line tool for using checklists
69
+ test_files:
70
+ - test/console_test.rb
71
+ - test/helper.rb
72
+ - test/list_test.rb
73
+ - test/results_test.rb
74
+ - test/start_test.rb