arcanus 0.2.0 → 0.3.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.
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