knife-solo_data_bag 1.0.1 → 1.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/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## head
2
2
 
3
+ # 1.1.0 (04/10/2014)
4
+
5
+ * add ability to correct incorrect text when editing a data bag
6
+
3
7
  # 1.0.1 (03/06/2014)
4
8
 
5
9
  * fix loading of helpers (#18)
@@ -1,3 +1,4 @@
1
+ require 'tempfile'
1
2
  require 'chef/knife'
2
3
 
3
4
  class Chef
@@ -35,12 +36,48 @@ class Chef
35
36
 
36
37
  private
37
38
  def edit_content
38
- updated_content = edit_data existing_bag_item_content
39
+ content = Chef::JSONCompat.to_json_pretty(existing_bag_item_content)
40
+ updated_content = nil
41
+ loop do
42
+ unparsed = edit_text content
43
+ begin
44
+ updated_content = Chef::JSONCompat.from_json(unparsed)
45
+ break
46
+ rescue Yajl::ParseError => e
47
+ loop do
48
+ ui.stdout.puts e.to_s
49
+ question = "Do you want to keep editing (Y/N)? If you choose 'N', all changes will be lost"
50
+ continue = ui.ask question
51
+ case continue
52
+ when 'Y', 'y'
53
+ content = unparsed
54
+ break
55
+ when 'N', 'n'
56
+ raise e
57
+ else
58
+ ui.stdout.puts 'Please answer Y or N'
59
+ end
60
+ end
61
+ end
62
+ end
39
63
  item = Chef::DataBagItem.from_hash format_editted_content(updated_content)
40
64
  item.data_bag bag_name
41
65
  persist_bag_item item
42
66
  end
43
67
 
68
+ def edit_text(text)
69
+ tf = Tempfile.new(['knife-edit', '.json'])
70
+ tf.sync = true
71
+ tf.puts text
72
+ tf.close
73
+
74
+ raise "Please set EDITOR environment variable" unless Kernel.system("#{config[:editor]} #{tf.path}")
75
+
76
+ output = File.read(tf.path)
77
+ tf.unlink
78
+ output
79
+ end
80
+
44
81
  def existing_bag_item_content
45
82
  content = Chef::DataBagItem.load(bag_name, item_name).raw_data
46
83
 
@@ -1,5 +1,5 @@
1
1
  module Knife
2
2
  module SoloDataBag
3
- VERSION = '1.0.1'
3
+ VERSION = '1.1.0'
4
4
  end
5
5
  end
@@ -27,6 +27,18 @@ describe Chef::Knife::SoloDataBagEdit do
27
27
  end
28
28
 
29
29
  context 'with valid arguments' do
30
+ let(:tf) do
31
+ double(
32
+ 'Tempfile',
33
+ :sync= => nil,
34
+ :puts => nil,
35
+ :close => nil,
36
+ :path => tempfile_name,
37
+ :unlink => true
38
+ )
39
+ end
40
+ let(:tempfile_name) { '/tmp/foo' }
41
+
30
42
  before do
31
43
  @bags_path = '/var/chef/data_bags'
32
44
  @bag_path = "#{@bags_path}/bag_1"
@@ -44,7 +56,10 @@ describe Chef::Knife::SoloDataBagEdit do
44
56
 
45
57
  Chef::DataBagItem.should_receive(:load).with('bag_1', 'foo').
46
58
  and_return(@bag_item_foo)
47
- @knife.stub(:edit_data).and_return(@updated_data)
59
+ Tempfile.stub(:new).and_return(tf)
60
+ Kernel.stub(:system => true)
61
+ File.stub(:read).and_call_original
62
+ File.stub(:read).with(tempfile_name).and_return(@updated_data.to_json)
48
63
  Chef::Config[:data_bag_path] = @bags_path
49
64
  end
50
65
 
@@ -138,6 +153,55 @@ describe Chef::Knife::SoloDataBagEdit do
138
153
  end
139
154
  end
140
155
 
156
+ context 'with malformed JSON' do
157
+ let(:user_wants_to_reedit) { 'Y' }
158
+
159
+ before do
160
+ @knife.config[:editor] = 'vimacs'
161
+ @pass = 0
162
+ @asked_to_continue = 0
163
+ File.stub(:read).with(tempfile_name) do
164
+ @pass += 1
165
+ case @pass
166
+ when 1
167
+ '{,badjson}'
168
+ else
169
+ @updated_data.to_json
170
+ end
171
+ end
172
+ @knife.ui.stub(:ask) do
173
+ case @pass
174
+ when 1
175
+ @asked_to_continue += 1
176
+ user_wants_to_reedit
177
+ end
178
+ end
179
+ end
180
+
181
+ it 'asks whether to re-edit' do
182
+ @knife.run
183
+ @asked_to_continue.should == 1
184
+ end
185
+
186
+ context 'when the user wants to re-edit' do
187
+ it 'the editor is re-opened' do
188
+ Kernel.should_receive(:system).with("vimacs #{tempfile_name}").
189
+ exactly(2).times.and_return(true)
190
+ @knife.run
191
+ end
192
+ end
193
+
194
+ context "the user doesn't want to re-edit" do
195
+ let(:user_wants_to_reedit) { 'N' }
196
+
197
+ it 'an error is thrown' do
198
+ lambda {
199
+ @knife.run
200
+ }.should raise_error(Yajl::ParseError)
201
+ end
202
+ end
203
+ end
204
+
141
205
  end
142
206
 
143
207
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-solo_data_bag
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-06 00:00:00.000000000 Z
12
+ date: 2014-04-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake