tango 0.1.4 → 0.1.5

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/.gitignore CHANGED
@@ -3,4 +3,5 @@ tmp/*
3
3
  *.gem
4
4
  .bundle
5
5
  .DS_Store
6
- .rvmrc
6
+ /.rvmrc
7
+ /tags
data/README.md CHANGED
@@ -35,7 +35,7 @@ Example Runner
35
35
 
36
36
  step :install do |package|
37
37
  met? { installed?(package) }
38
- meet { shell("apt-get", "install", "-y", package) }
38
+ meet { shell!("apt-get", "install", "-y", package) }
39
39
  end
40
40
  end
41
41
 
@@ -46,7 +46,7 @@ Example Runner
46
46
 
47
47
  step :install do |gem|
48
48
  met? { installed?(gem) }
49
- meet { shell("gem", "install", gem) }
49
+ meet { shell!("gem", "install", gem) }
50
50
  end
51
51
  end
52
52
 
@@ -133,7 +133,7 @@ You can use these together like this:
133
133
  end
134
134
  end
135
135
 
136
- ### Changing the umask
136
+ ### Changing the Umask
137
137
 
138
138
  step :install do
139
139
  with_umask 0077 do
data/TODO.md ADDED
@@ -0,0 +1,6 @@
1
+ To Do
2
+ =====
3
+
4
+ - Detect when config files have changed and regenerate them
5
+ - Make CouldNotMeetError give more useful info
6
+ - Have a standard way of getting at stuff in the support directory
data/lib/tango.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'tango/config_files'
2
2
  require 'tango/contexts'
3
+ require 'tango/helpers'
3
4
  require 'tango/logger'
4
5
  require 'tango/runner'
5
6
  require 'tango/usage'
@@ -14,8 +14,8 @@ module Tango
14
14
  in_context(Umask.new(umask), &block)
15
15
  end
16
16
 
17
- def as_user(user, &block)
18
- as_user(User.new(umask), &block)
17
+ def as_user(umask, &block)
18
+ in_context(User.new(umask), &block)
19
19
  end
20
20
 
21
21
  end
@@ -0,0 +1 @@
1
+ require 'tango/helpers/file_manipulation_helpers'
@@ -0,0 +1,70 @@
1
+ module Tango
2
+ module Helpers
3
+ module FileManipulationHelpers
4
+
5
+ require 'pathname'
6
+
7
+ private
8
+
9
+ # shameless stolen from babushka and ported to work with plain ruby without so much magic
10
+ def insert_into_file(insert_before, path, lines)
11
+ #@insert_after = nil
12
+
13
+ nlines = lines.split("\n").length
14
+ before, after = cut(Pathname.new(path).readlines, insert_before)
15
+
16
+ write path, [ before, comment_string, lines, after ].join
17
+ end
18
+
19
+ def comment_string
20
+ comment_char = '#'
21
+ "#{comment_char} Envato config added #{Time.now}\n"
22
+ end
23
+
24
+ def cut(data, cut_before)
25
+ index = data.index{ |l| l.strip == cut_before.strip }
26
+ raise "Couldn't find the spot to cut." if index.nil?
27
+ [data[0...index], data[index..-1]]
28
+ end
29
+
30
+ def change_line(line_regex, replacement, filename)
31
+ replaced = false
32
+ contents = Pathname.new(filename).readlines.collect do |line|
33
+ if line =~ line_regex
34
+ replaced = true
35
+ [comment_string, "#{replacement.chomp}\n"]
36
+ else
37
+ line
38
+ end
39
+ end.flatten
40
+ raise "couldnt find the specified line" unless replaced
41
+ File.open(filename, 'w') do |f|
42
+ contents.each{|line| f.write line }
43
+ end
44
+ end
45
+
46
+ def grep(pattern, file)
47
+ !!(File.read(file) =~ pattern)
48
+ end
49
+
50
+ # for files where attributes are specified:
51
+ # attribute_name value
52
+ def change_config_attribute(keyword, from, to, file)
53
+ # Remove the incorrect setting if it's there
54
+ contents = File.open(file).reject do |line|
55
+ line.match(/^#{keyword}\s+#{from}/)
56
+ end
57
+
58
+ # Add the correct setting unless it's already there
59
+ if contents.none?{|line| line.match /^#{keyword}\s+#{to}/ }
60
+ contents << "#{keyword} #{to}\n"
61
+ end
62
+
63
+ File.open(file, 'w') do |f|
64
+ contents.each{|line| f.write line}
65
+ end
66
+ end
67
+
68
+ end
69
+ end
70
+ end
data/lib/tango/runner.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'tango/config_files'
2
2
  require 'tango/contexts/helpers'
3
+ require 'tango/helpers/file_manipulation_helpers'
3
4
  require 'tango/delegate'
4
5
  require 'tango/fetch'
5
6
  require 'tango/met_and_meet'
@@ -13,7 +14,8 @@ module Tango
13
14
  include Fetch
14
15
  include MetAndMeet
15
16
  include Shell
16
-
17
+ include Helpers::FileManipulationHelpers
18
+
17
19
  def self.step(step_name, &block)
18
20
  define_method(step_name) do |*args|
19
21
  description = step_description(step_name, args)
data/lib/tango/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tango
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
@@ -0,0 +1,171 @@
1
+ require 'tango'
2
+
3
+ module Tango::Helpers
4
+ describe FileManipulationHelpers do
5
+ include FileManipulationHelpers
6
+ include ::Tango::ConfigFiles
7
+
8
+ describe "#grep" do
9
+ before do
10
+ @filename = '/tmp/file_manipulation_helper_spec.txt'
11
+ File.open(@filename, 'w') do |f|
12
+ f.write <<-FILE
13
+ anna
14
+ bob
15
+ curtis
16
+ donald
17
+ FILE
18
+ end
19
+ end
20
+
21
+ it 'should return true if the pattern matches' do
22
+ grep(/bob/, @filename).should be_true
23
+ end
24
+ it 'should return false if the pattern doesnt match' do
25
+ grep(/robert/, @filename).should be_false
26
+ end
27
+ end
28
+
29
+ describe "#change_line" do
30
+
31
+ def file_contents
32
+ File.read(@filename)
33
+ end
34
+
35
+ before do
36
+ @filename = '/tmp/file_manipulation_helper_spec.txt'
37
+ File.open(@filename, 'w') do |f|
38
+ f.write <<-FILE
39
+ anna
40
+ bob
41
+ curtis
42
+ donald
43
+ FILE
44
+ end
45
+ end
46
+
47
+ it 'should replace the line matching the regex with the specified line' do
48
+ expect {
49
+ change_line(/^bob/, "jimbo", @filename)
50
+ }.to change {
51
+ #ignore comment
52
+ file_contents.gsub /#.*\n/, ''
53
+ }.to(<<-FILE)
54
+ anna
55
+ jimbo
56
+ curtis
57
+ donald
58
+ FILE
59
+ end
60
+ end
61
+
62
+ describe "#insert_into_file" do
63
+ def file_contents
64
+ File.read(@filename)
65
+ end
66
+
67
+ before do
68
+ @filename = '/tmp/file_manipulation_helper_spec.txt'
69
+ File.open(@filename, 'w') do |f|
70
+ f.write <<-FILE
71
+ a
72
+ b
73
+ c
74
+ d
75
+ FILE
76
+ end
77
+ end
78
+
79
+ it 'should insert a comment above the inserted line' do
80
+ insert_into_file('c', @filename, "z\n")
81
+ file_contents.should =~ /# Envato config added.*\nz\n/
82
+ end
83
+
84
+ it 'should insert text before the specified place' do
85
+ expect {
86
+ insert_into_file('c', @filename, "z\n")
87
+ }.to change {
88
+ #ignore comment
89
+ file_contents.gsub /#.*\n/, ''
90
+ }.to(<<-FILE)
91
+ a
92
+ b
93
+ z
94
+ c
95
+ d
96
+ FILE
97
+ end
98
+ end
99
+
100
+ describe "#cut" do
101
+
102
+ let(:data) { %w[a b c d] }
103
+
104
+ it "should cut the lines into two" do
105
+ cut(data, 'c').should == [%w[a b], %w[c d]]
106
+ end
107
+
108
+ it "should ignore whitespace around the string to cut on" do
109
+ cut(data, ' c ').should == [%w[a b], %w[c d]]
110
+ end
111
+
112
+ it "should cut the lines into two" do
113
+ data = ['a', 'b', ' c ', 'd']
114
+ cut(data, 'c').should == [%w[a b], [' c ', 'd']]
115
+ end
116
+
117
+ it 'should raise an error if the cut-point cant be found' do
118
+ expect {
119
+ cut(data, 'z')
120
+ }.to raise_error
121
+ end
122
+ end
123
+
124
+ describe "#change_config_attribute" do
125
+
126
+ def file_contents
127
+ File.read(@filename)
128
+ end
129
+
130
+ before do
131
+ @filename = '/tmp/file_manipulation_helper_spec.txt'
132
+ File.open(@filename, 'w') do |f|
133
+ f.write <<-FILE
134
+ AwesomeStuff false
135
+ NotAwesomeStuff true
136
+ FILE
137
+ end
138
+ end
139
+
140
+ it "should replace the incorrect setting if it's there" do
141
+ expect {
142
+ change_config_attribute('AwesomeStuff', 'false', 'true', @filename)
143
+ }.to change {
144
+ file_contents
145
+ }.to(<<-FILE)
146
+ NotAwesomeStuff true
147
+ AwesomeStuff true
148
+ FILE
149
+ end
150
+
151
+ it "should add the correct setting if it is unconfigured" do
152
+ expect {
153
+ change_config_attribute('OtherAwesomeStuff', 'false', 'true', @filename)
154
+ }.to change {
155
+ file_contents
156
+ }.to(<<-FILE)
157
+ AwesomeStuff false
158
+ NotAwesomeStuff true
159
+ OtherAwesomeStuff true
160
+ FILE
161
+ end
162
+ it "should leave the correct setting alone" do
163
+ expect {
164
+ change_config_attribute('AwesomeStuff', 'true', 'false', @filename)
165
+ }.to_not change {
166
+ file_contents
167
+ }
168
+ end
169
+ end
170
+ end
171
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tango
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 5
10
+ version: 0.1.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Pete Yandell
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-07 00:00:00 +10:00
18
+ date: 2011-09-20 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -49,6 +49,7 @@ files:
49
49
  - LICENSE
50
50
  - README.md
51
51
  - Rakefile
52
+ - TODO.md
52
53
  - lib/tango.rb
53
54
  - lib/tango/config_files.rb
54
55
  - lib/tango/contexts.rb
@@ -59,6 +60,8 @@ files:
59
60
  - lib/tango/contexts/user.rb
60
61
  - lib/tango/delegate.rb
61
62
  - lib/tango/fetch.rb
63
+ - lib/tango/helpers.rb
64
+ - lib/tango/helpers/file_manipulation_helpers.rb
62
65
  - lib/tango/logger.rb
63
66
  - lib/tango/met_and_meet.rb
64
67
  - lib/tango/runner.rb
@@ -69,6 +72,7 @@ files:
69
72
  - spec/contexts/chain_spec.rb
70
73
  - spec/contexts/directory_spec.rb
71
74
  - spec/contexts/umask_spec.rb
75
+ - spec/helpers/file_manipulation_helpers_spec.rb
72
76
  - spec/logger_spec.rb
73
77
  - spec/met_and_meet_spec.rb
74
78
  - spec/runner_spec.rb
@@ -114,6 +118,7 @@ test_files:
114
118
  - spec/contexts/chain_spec.rb
115
119
  - spec/contexts/directory_spec.rb
116
120
  - spec/contexts/umask_spec.rb
121
+ - spec/helpers/file_manipulation_helpers_spec.rb
117
122
  - spec/logger_spec.rb
118
123
  - spec/met_and_meet_spec.rb
119
124
  - spec/runner_spec.rb