retreat 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/retreat ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'coderetreat/retreat'
4
+
5
+ include CodeRetreat
6
+
7
+ def usage
8
+ result = <<EOS
9
+ usage: #{__FILE__} action [command...]
10
+ ----
11
+ Actions:
12
+ info : Prints information message
13
+ install : Downloads and installs starting point repo to ~/.retreat/retreat
14
+ update : Pulls latest langauge starting points from github source repo
15
+ start language [directory] : Starts a new iteration using 'language' in 'directory'
16
+ directory defaults to '.' if not specified
17
+ EOS
18
+
19
+ result
20
+ end
21
+
22
+ def fail_with_error(message)
23
+ STDERR.puts message
24
+ exit 9
25
+ end
26
+
27
+ def fail_with_usage_error(message)
28
+ STDERR.puts message
29
+ STDERR.puts usage
30
+ exit 9
31
+ end
32
+
33
+ fail_with_usage_error "Error: No args passed" if ARGV.empty?
34
+ action = ARGV.shift
35
+
36
+ begin
37
+ case
38
+ when action == "info"
39
+ Actions::Info.run!
40
+ when action == "install"
41
+ Actions::Install.run!
42
+ when action == "update"
43
+ Actions::Update.run!
44
+ when action == "start"
45
+ Actions::Start.run!(ARGV)
46
+ else
47
+ raise UsageError.new("Error: unknown action '#{action}'")
48
+ end
49
+ rescue UsageError => ex
50
+ fail_with_usage_error "Error: #{ex}"
51
+ rescue EnvError => ex
52
+ fail_with_error "Error: #{ex}"
53
+ end
54
+
@@ -0,0 +1,150 @@
1
+ require 'etc'
2
+ require 'fileutils'
3
+
4
+ include FileUtils
5
+
6
+ module CodeRetreat
7
+ class UsageError < Exception; end
8
+ class EnvError < Exception; end
9
+
10
+ class Path
11
+ # Defines a delegator method to File
12
+ def self.def_file_op(name)
13
+ file_op = name.to_sym
14
+ define_method(file_op) do |*args|
15
+ File.send(file_op, @path, *args)
16
+ end
17
+ end
18
+
19
+ def initialize(*elements)
20
+ relative_path = File.join(*elements)
21
+ @path = File.expand_path(relative_path)
22
+ end
23
+
24
+ def_file_op :exists?
25
+ def_file_op :directory?
26
+ def_file_op :file?
27
+ def_file_op :writable?
28
+ def_file_op :basename
29
+
30
+ def dirname
31
+ Path.new(File.dirname(@path))
32
+ end
33
+
34
+ def join(*elements)
35
+ Path.new(@path, *elements)
36
+ end
37
+
38
+ def to_s
39
+ @path.clone
40
+ end
41
+
42
+ def copy_to(target)
43
+ cp_r @path, target.to_s
44
+ end
45
+
46
+ def ls
47
+ Dir["#{@path}/*"].map{|listing_item| Path.new(listing_item)}
48
+ end
49
+ end
50
+
51
+ module Actions
52
+ class Action
53
+ def initialize
54
+ @home = Path.new(Etc.getpwuid.dir, '.retreat')
55
+ @local_repo = Path.new(Etc.getpwuid.dir, '.retreat', 'retreat')
56
+ @source_repo = "https://github.com/coreyhaines/coderetreat.git"
57
+ @starting_points = @local_repo.join("starting_points")
58
+ end
59
+ end
60
+
61
+ class Start < Action
62
+ def self.run!(args)
63
+ new(args).run!
64
+ end
65
+
66
+ def initialize(args)
67
+ super()
68
+ @language = args[0]
69
+ @source = @starting_points.join(@language)
70
+ @target = args[1] ? Path.new(args[1]) : Path.new('.')
71
+ end
72
+
73
+ def run!
74
+ validate_environment!
75
+ @source.copy_to(@target)
76
+ puts "Created #{@language} iteration starting point at #{@target}"
77
+ end
78
+
79
+ def validate_environment!
80
+ raise EnvError.new("No sources found. Try running 'retreat install' first") unless @source.directory?
81
+ raise EnvError.new("Cannot create #{@target}") unless @target.dirname.writable?
82
+ end
83
+ end
84
+
85
+ class Install < Action
86
+ def self.run!
87
+ new.run!
88
+ end
89
+
90
+ def run!
91
+ validate_environment!
92
+ puts "Pulling coderetreat repo into #{@local_repo}..."
93
+ %x{git clone #{@source_repo} #{@local_repo}}
94
+ puts "\nInstallation completed! Here is some information..."
95
+ Info.run!
96
+ puts "\nRun 'retreat start <language> [location]' to start a new iteration"
97
+ end
98
+
99
+ def validate_environment!
100
+ if @local_repo.exists?
101
+ raise EnvError.new("retreat has already been installed. Run 'retreat update' to get the latest starting points.")
102
+ end
103
+ end
104
+ end
105
+
106
+ class Update < Action
107
+ def self.run!
108
+ new.run!
109
+ end
110
+
111
+ def run!
112
+ validate_environment!
113
+ puts "Updating sources at #{@local_repo}"
114
+ %x{git pull #{@local_repo}}
115
+ end
116
+
117
+ def validate_environment!
118
+ raise EnvError.new("retreat is not installed. Run 'retreat install' to get started.") unless @local_repo.exists?
119
+ end
120
+ end
121
+
122
+ class Info < Action
123
+ def self.run!
124
+ new.run!
125
+ end
126
+
127
+ def run!
128
+ result =<<EOS
129
+
130
+ #{message}
131
+ EOS
132
+ puts result
133
+ end
134
+
135
+ def message
136
+ result =<<EOS
137
+ Source Repo: #{@source_repo}
138
+ Local Repo: #{@local_repo}
139
+ Langauges Avilable: #{languages.join(",")}
140
+ EOS
141
+
142
+ result
143
+ end
144
+
145
+ def languages
146
+ @starting_points.ls.map{|path| path.basename}
147
+ end
148
+ end
149
+ end
150
+ end
data/retreat.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+
3
+ SPEC = Gem::Specification.new do |s|
4
+ s.name = "retreat"
5
+ s.version = '0.1.0'
6
+ s.author = "Adrian Mowat"
7
+ s.homepage = "https://github.com/coreyhaines/coderetreat"
8
+ s.summary = "Command line utilities for coderetreat"
9
+ s.description = <<EOS
10
+ retreat allows you to easily start new coderetreat iterations in different languges. Starting point "skeletons" are held in a git repo and copied as needed.
11
+ EOS
12
+ s.has_rdoc = false
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: retreat
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Adrian Mowat
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-19 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: ! 'retreat allows you to easily start new coderetreat iterations in different
15
+ languges. Starting point "skeletons" are held in a git repo and copied as needed.
16
+
17
+ '
18
+ email:
19
+ executables:
20
+ - retreat
21
+ extensions: []
22
+ extra_rdoc_files: []
23
+ files:
24
+ - bin/retreat
25
+ - lib/coderetreat/retreat.rb
26
+ - retreat.gemspec
27
+ homepage: https://github.com/coreyhaines/coderetreat
28
+ licenses: []
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 1.8.8
48
+ signing_key:
49
+ specification_version: 3
50
+ summary: Command line utilities for coderetreat
51
+ test_files: []