arcanus 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c203a66cb5ef34e876084ba7aabd877ee6228816
4
- data.tar.gz: c2af0b10865835de171ecfcf8ec3897ace3b6cdb
3
+ metadata.gz: 66036810d6ca7fa05522b32afeb91c36dfe96f4a
4
+ data.tar.gz: b38269a7f63c805c89c3da2824bbe81f773dac86
5
5
  SHA512:
6
- metadata.gz: c30600d873ed37082854aa17f149dcac96d7fb467fe9a9bb271c8a5ffe16f3dcce03f2f098c0f32761c9eecbfed02d4df500eb5263490eb6e83a059fe3948dec
7
- data.tar.gz: bf2b007a2efc9f4263928ac96be9da2a1867dd01b962b1996742fd058db7d72c9b6a68dfb48fc2be7217fcacc32de32f22b57443e065ca4e691a69f39c657549
6
+ metadata.gz: a778447c3785bf38d80a6473edbe60833e665a990d9e1df5aa81727e49d73bcbed5bbe1fc227126c3fba0442fa64fa5e7700843f53ec2078a4ef55c559f7a538
7
+ data.tar.gz: 6de23a00c31b5b4bf63f163204f8152b746309f13db35783e72af7972624102b5ce465e67f6934b56733609a8cbcba1cba1856be6c0f0db9ecf8be1147b7e657
@@ -34,6 +34,24 @@ module Arcanus
34
34
  @hash
35
35
  end
36
36
 
37
+ # Provides access to chest items using regular method calls instead of hash
38
+ # accesses.
39
+ def method_missing(method_sym, *)
40
+ method_name = method_sym.to_s
41
+ if @hash.key?(method_name)
42
+ value = @hash[method_name]
43
+ if value.is_a?(Hash)
44
+ Item.new(value, [method_name])
45
+ else
46
+ value
47
+ end
48
+ else
49
+ raise KeyError,
50
+ "Key '#{method_name}' does not exist in this Arcanus chest",
51
+ caller
52
+ end
53
+ end
54
+
37
55
  # Set value for the specified key path.
38
56
  #
39
57
  # @param key_path [String]
@@ -71,7 +89,10 @@ module Arcanus
71
89
  modified_hash =
72
90
  process_hash_changes(@original_encrypted_hash, @original_decrypted_hash, @hash)
73
91
 
74
- File.open(@chest_file_path, 'w') { |f| f.write(modified_hash.to_yaml) }
92
+ File.open(@chest_file_path, 'w') do |f|
93
+ f.puts('# Do not edit this file directly! Run `arcanus edit`')
94
+ f.write(modified_hash.to_yaml)
95
+ end
75
96
  end
76
97
 
77
98
  private
@@ -160,5 +181,58 @@ module Arcanus
160
181
 
161
182
  Marshal.load(dumped_value)
162
183
  end
184
+
185
+ # Helper class for returning contents nested hashes, exposing helpers to
186
+ # access them via method calls.
187
+ class Item
188
+ def initialize(hash, prefix = [])
189
+ @hash = hash
190
+ @prefix = prefix
191
+ end
192
+
193
+ def method_missing(method_sym, *)
194
+ method_name = method_sym.to_s
195
+ if @hash.key?(method_name)
196
+ value = @hash[method_name]
197
+ if value.is_a?(Hash)
198
+ Item.new(value, @prefix + [method_name])
199
+ else
200
+ value
201
+ end
202
+ else
203
+ key_name = "#{@prefix.join('.')}.#{method_name}"
204
+ raise KeyError,
205
+ "Key '#{key_name}' does not exist in this Arcanus chest",
206
+ caller
207
+ end
208
+ end
209
+
210
+ # Access the item as if it were a hash.
211
+ #
212
+ # @param key [String]
213
+ # @return [Object]
214
+ def [](key)
215
+ @hash[key]
216
+ end
217
+
218
+ # Fetch key from the chest as if it were a hash.
219
+ def fetch(*args)
220
+ @hash.fetch(*args)
221
+ end
222
+
223
+ def to_s
224
+ @hash.to_s
225
+ end
226
+
227
+ def inspect
228
+ @hash.inspect
229
+ end
230
+
231
+ # Implicit conversion to array. Needs to be defined so we can `puts` this
232
+ # value.
233
+ def to_ary
234
+ [@hash]
235
+ end
236
+ end
163
237
  end
164
238
  end
@@ -24,7 +24,7 @@ module Arcanus::Command
24
24
  def command_classes
25
25
  command_files =
26
26
  Dir[File.join(File.dirname(__FILE__), '*.rb')]
27
- .select { |path| File.basename(path, '.rb') != 'base' }
27
+ .select { |path| File.basename(path, '.rb') != 'base' }
28
28
 
29
29
  command_files.map do |file|
30
30
  require file
@@ -94,7 +94,13 @@ module Arcanus::Command
94
94
  end
95
95
 
96
96
  def create_chest
97
+ # Create a dummy file to start so that we can initialize an empty chest,
98
+ # but then use that chest's #save implementation to save the file
97
99
  File.open(repo.chest_file_path, 'w') { |f| f.write({}.to_yaml) }
100
+
101
+ chest = Arcanus::Chest.new(key_file_path: repo.unlocked_key_path,
102
+ chest_file_path: repo.chest_file_path)
103
+ chest.save
98
104
  end
99
105
 
100
106
  def create_gitignore
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
  require 'yaml'
3
5
 
@@ -8,7 +10,7 @@ module Arcanus
8
10
  # this logic can be shared amongst the various components of the system.
9
11
  class Configuration
10
12
  # Name of the configuration file.
11
- FILE_NAME = 'config.yaml'
13
+ FILE_NAME = 'config.yaml'.freeze
12
14
 
13
15
  class << self
14
16
  # Loads appropriate configuration file given the current working
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Global application constants.
2
4
  module Arcanus
3
- EXECUTABLE_NAME = 'arcanus'
5
+ EXECUTABLE_NAME = 'arcanus'.freeze
4
6
 
5
- CHEST_FILE_PATH = File.join('.arcanus', 'chest.yaml')
6
- LOCKED_KEY_PATH = File.join('.arcanus', 'protected.key')
7
- UNLOCKED_KEY_PATH = File.join('.arcanus', 'unprotected.key')
7
+ CHEST_FILE_PATH = File.join('.arcanus', 'chest.yaml').freeze
8
+ LOCKED_KEY_PATH = File.join('.arcanus', 'protected.key').freeze
9
+ UNLOCKED_KEY_PATH = File.join('.arcanus', 'unprotected.key').freeze
8
10
 
9
- REPO_URL = 'https://github.com/sds/arcanus'
10
- BUG_REPORT_URL = "#{REPO_URL}/issues"
11
+ REPO_URL = 'https://github.com/sds/arcanus'.freeze
12
+ BUG_REPORT_URL = "#{REPO_URL}/issues".freeze
11
13
  end
@@ -104,7 +104,7 @@ module Arcanus
104
104
  end
105
105
 
106
106
  # Execute a command with a spinner animation until it completes.
107
- def spinner(*args, &block)
107
+ def spinner(*args)
108
108
  spinner = TTY::Spinner.new(*args)
109
109
  spinner_thread = Thread.new do
110
110
  loop do
@@ -113,7 +113,7 @@ module Arcanus
113
113
  end
114
114
  end
115
115
 
116
- block.call
116
+ yield
117
117
  ensure
118
118
  spinner_thread.kill
119
119
  newline # Ensure next line of ouptut on separate line from spinner
@@ -123,9 +123,9 @@ module Arcanus
123
123
  #
124
124
  # Customize the table by passing a block and operating on the table object
125
125
  # passed to that block to add rows and customize its appearance.
126
- def table(options = {}, &block)
126
+ def table(options = {})
127
127
  t = TTY::Table.new(options)
128
- block.call(t)
128
+ yield t
129
129
  print(t.render(:unicode, options))
130
130
  end
131
131
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Defines the gem version.
2
4
  module Arcanus
3
- VERSION = '0.2.0'
5
+ VERSION = '0.3.0'.freeze
4
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arcanus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane da Silva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-28 00:00:00.000000000 Z
11
+ date: 2016-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: childprocess