sheldon 0.4.1 → 0.5.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: 73892f48dbd187ec12c86c61e4e4a7db3ba3fd28
4
- data.tar.gz: 9b7c3048b7cd07c67fdcfc4d705ed559f0e30df3
3
+ metadata.gz: 09ae36b8d2caa6f99c7615897f8be3f0307d2046
4
+ data.tar.gz: 983e9c673075ade9d355051d478ba2d5384c27a0
5
5
  SHA512:
6
- metadata.gz: 6e90b362ed860b5de2a01629144c827628af88d70817864d6fe8b47106e6acd640547c627e3279ab79ba0e1862b080b5571ef8cabc3c33c405018f10716c3d89
7
- data.tar.gz: 7c94643012c59f402686f4d2c2bddf0ae81361d2dafa916a3f0f7cdaf4814c9a22f25edf1d94c04f3b55082fee582d75ec5ea4ac9dc2e904cafb63aca99bf6bc
6
+ metadata.gz: 574459c5e4af0e7039ff69d9c2e23ad53830414961cbed245a478966f7eb685cfff85b023d324cf0991240aeabf8d8f946857c8f77e9a93d91f120a3c7dc2fee
7
+ data.tar.gz: 52be880c55eab8afbd7f9f34524179a74b55b5f5ebf60b6c790a119d83bc54ed75adf39b800a540a96ab989a04b7998aebd7b004cfec44fd244eac114f7aff24
@@ -9,13 +9,22 @@ module CLI
9
9
  map "-v" => :version
10
10
  map "--version" => :version
11
11
 
12
+ class_option :debug, :desc => "Print errors and backtraces to the console for debugging."
13
+
12
14
  desc "build path", "Tell Sheldon to build all config_ files in a directory to single master config"
13
15
  def build(rel_path_to_target)
14
- abs_learn_path = File.expand_path(rel_path_to_target)
15
- with_exception_handling{ sheldon.build(abs_learn_path) }
16
+ abs_build_path = File.expand_path(rel_path_to_target)
17
+ with_exception_handling{ sheldon.build(abs_build_path) }
16
18
  announce("Built #{File.basename(rel_path_to_target)}")
17
19
  end
18
20
 
21
+ desc "forget recall_cue", "Remove file/folder from Sheldon's brain"
22
+ def forget(recall_cue=nil)
23
+ recall_cue ||= prompt_user("Recall Cue For File/Folder")
24
+ with_exception_handling { sheldon.forget(recall_cue) }
25
+ announce("I've forgotten about #{recall_cue}. Let us never mention it again.")
26
+ end
27
+
19
28
  desc "learn path", "Add a new file/folder to Sheldon's brain. Supply a recall_cue at runtime."
20
29
  def learn(rel_path_to_target)
21
30
  abs_learn_path = File.expand_path(rel_path_to_target)
@@ -25,6 +34,13 @@ module CLI
25
34
  with_exception_handling { sheldon.recall(recall_cue) }
26
35
  end
27
36
 
37
+ desc "list", "List all recall cues known by Sheldon"
38
+ def list
39
+ sheldon.list_cues.each do |recall_cue|
40
+ sheldon.recalled?(recall_cue) ? green(recall_cue) : red(recall_cue)
41
+ end
42
+ end
43
+
28
44
  desc "recall recall_cue", "Symlink a previously learnt file/directory to it's original location on the filesystem.\nUse `sheldon list` for available cues."
29
45
  option :i, type: :boolean, desc: "Interactive mode - prompts Y/N for each available recall_cue"
30
46
 
@@ -42,17 +58,21 @@ module CLI
42
58
  announce("Recall Complete.")
43
59
  end
44
60
 
45
- desc "forget recall_cue", "Remove file/folder from Sheldon's brain"
46
- def forget(recall_cue=nil)
47
- recall_cue ||= prompt_user("Recall Cue For File/Folder")
48
- with_exception_handling { sheldon.forget(recall_cue) }
49
- announce("I've forgotten about #{recall_cue}. Let us never mention it again.")
50
- end
61
+ desc "setup path_to_data_directory", "Setup Sheldon on this host, supplying the path that where Sheldon's data directory can be found, or should be created."
62
+ def setup(rel_data_path=nil)
63
+ rel_data_path ||= prompt_user("Please supply location for new/existing data directory")
64
+ abs_data_path = File.expand_path(rel_data_path)
65
+ with_exception_handling do
66
+ sheldon = ::Sheldon.new(abs_data_path)
67
+
68
+ if sheldon.brain.present?
69
+ green "Using existing Sheldon database found at #{abs_data_path}."
70
+ else
71
+ sheldon.setup!
72
+ green "New Sheldon database created at #{abs_data_path}"
73
+ end
51
74
 
52
- desc "list", "List all recall cues known by Sheldon"
53
- def list
54
- sheldon.list_cues.each do |recall_cue|
55
- sheldon.recalled?(recall_cue) ? green(recall_cue) : red(recall_cue)
75
+ write_to_dotfile("data_directory", sheldon.brain.location)
56
76
  end
57
77
  end
58
78
 
@@ -63,41 +83,55 @@ module CLI
63
83
 
64
84
  private
65
85
 
86
+ def announce(message)
87
+ logo = "💥".encode("utf-8")
88
+ puts logo + " Sheldon" + logo + " #{message}"
89
+ end
90
+
91
+ def green(message)
92
+ puts "\e[32m#{message}\e[0m"
93
+ end
94
+
66
95
  def prompt_user(prompt)
67
96
  print(prompt + ": ")
68
97
  input = STDIN.gets.chomp.strip
69
98
  input.empty? ? nil : input
70
99
  end
71
100
 
72
- def green(message)
73
- puts "\e[32m#{message}\e[0m"
101
+ def read_from_dotfile(key)
102
+ dotfile = YAML::Store.new(add_home(".sheldon"))
103
+ dotfile.transaction { dotfile[key] }
74
104
  end
75
105
 
76
106
  def red(message)
77
107
  puts "\e[31m#{message}\e[0m"
78
108
  end
79
109
 
80
- def announce(message)
81
- logo = "💥".encode("utf-8")
82
- puts logo + " Sheldon" + logo + " #{message}"
83
- end
84
-
85
110
  def sheldon
86
111
  with_exception_handling { @sheldon ||= ::Sheldon.new(sheldon_data_dir) }
87
112
  end
88
113
 
89
114
  def sheldon_data_dir
90
- path = ENV["SHELDON_DATA_DIR"] || "~/sheldon"
91
- File.expand_path(path)
115
+ sheldon_data_dir = read_from_dotfile("data_directory") || ENV['SHELDON_DATA_DIR']
116
+ sheldon_data_dir || raise("No configuration found. Please run `sheldon setup`")
92
117
  end
93
118
 
94
119
  def with_exception_handling(&block)
95
120
  yield
96
121
  rescue Exception => e
97
- announce(e.message)
122
+ if options[:debug]
123
+ puts ([e.inspect] + e.backtrace).join("\n")
124
+ else
125
+ red(e.message + "\nUse --debug to print backtrace")
126
+ end
98
127
  exit(1)
99
128
  end
100
129
 
130
+ def write_to_dotfile(key, value)
131
+ dotfile = YAML::Store.new(add_home(".sheldon"))
132
+ dotfile.transaction { dotfile[key] = value }
133
+ end
134
+
101
135
  end
102
136
  end
103
137
 
@@ -1,12 +1,25 @@
1
1
  class Brain
2
2
 
3
- attr_reader :memory
3
+ attr_reader :memory, :location
4
4
 
5
- def initialize(sheldon_data_dir, opts = {})
6
- @brain_location = sheldon_data_dir
7
- @memory = opts[:memory] || Memory.new(@brain_location)
5
+ def initialize(sheldon_data_dir)
6
+ @location = sheldon_data_dir
7
+ @memory = Memory.new(@location)
8
8
  end
9
9
 
10
+ def forget(recall_cue)
11
+ entry = memory.recall(recall_cue)
12
+ brain_path = brain_path_for_cue(recall_cue)
13
+ destination_path = add_home(entry[:filepath])
14
+ FileUtils.rm_r(destination_path) if recalled?(recall_cue)
15
+ FileUtils.rm_r(brain_path)
16
+
17
+ memory.forget(recall_cue)
18
+ end
19
+
20
+ def has_cue?(recall_cue)
21
+ memory.has_cue?(recall_cue)
22
+ end
10
23
 
11
24
  def learn(recall_cue, abs_learn_path)
12
25
  raise "recall cue cannot be empty." if recall_cue.strip.empty?
@@ -20,6 +33,14 @@ class Brain
20
33
  memory.add(recall_cue, entry)
21
34
  end
22
35
 
36
+ def list_cues
37
+ memory.list_cues
38
+ end
39
+
40
+ def present?
41
+ memory.present?
42
+ end
43
+
23
44
  def recall(recall_cue)
24
45
  entry = memory.recall(recall_cue)
25
46
  destination_path = add_home(entry[:filepath])
@@ -27,16 +48,7 @@ class Brain
27
48
  FileUtils.mkdir_p(destination_dir) unless File.directory?(destination_dir)
28
49
  brain_path = brain_path_for_cue(recall_cue)
29
50
  FileUtils.ln_s(get_content(brain_path), destination_path, force: true)
30
- end
31
-
32
- def forget(recall_cue)
33
- entry = memory.recall(recall_cue)
34
- brain_path = brain_path_for_cue(recall_cue)
35
- destination_path = add_home(entry[:filepath])
36
- FileUtils.rm_r(destination_path) if recalled?(recall_cue)
37
- FileUtils.rm_r(brain_path)
38
-
39
- memory.forget(recall_cue)
51
+ return true
40
52
  end
41
53
 
42
54
  def recalled?(recall_cue)
@@ -47,22 +59,14 @@ class Brain
47
59
  File.symlink?(destination_path) && File.exists?(File.readlink(destination_path))
48
60
  end
49
61
 
50
- def has_cue?(recall_cue)
51
- memory.has_cue?(recall_cue)
52
- end
53
-
54
62
  def size
55
63
  memory.size
56
64
  end
57
65
 
58
- def list_cues
59
- memory.list_cues
60
- end
61
-
62
66
  private
63
67
 
64
68
  def brain_path_for_cue(recall_cue)
65
- File.join(@brain_location, recall_cue)
69
+ File.join(@location, recall_cue)
66
70
  end
67
71
 
68
72
  def get_content(path)
@@ -7,9 +7,12 @@ class Builder
7
7
  is_config?(entry) ? add_entry_to_buffer(entry, buffer) : buffer
8
8
  end
9
9
 
10
- unless master_content.empty?
10
+ if master_content.empty?
11
+ return false
12
+ else
11
13
  master_path = File.join(abs_build_path, "config")
12
14
  File.open(master_path, "w") { |f| f.write(master_content) }
15
+ return true
13
16
  end
14
17
  end
15
18
 
@@ -1,9 +1,8 @@
1
1
  module Helpers
2
2
  require "pathname"
3
3
 
4
- def remove_home(path)
5
- home_path = Pathname(File.expand_path("~"))
6
- Pathname(path).relative_path_from(home_path).to_s
4
+ def abs(rel_path)
5
+ File.expand_path(rel_path).to_s
7
6
  end
8
7
 
9
8
  def add_home(path)
@@ -11,8 +10,9 @@ module Helpers
11
10
  File.join(abs_home, path).to_s
12
11
  end
13
12
 
14
- def abs(rel_path)
15
- File.expand_path(rel_path).to_s
13
+ def remove_home(path)
14
+ home_path = Pathname(File.expand_path("~"))
15
+ Pathname(path).relative_path_from(home_path).to_s
16
16
  end
17
17
 
18
18
  end
@@ -12,28 +12,38 @@ class Memory
12
12
  @database.transaction do
13
13
  @database[recall_cue] = hash
14
14
  end
15
- end
16
-
17
- def recall(recall_cue)
18
- raise "no entry for cue '#{recall_cue}'" unless has_cue?(recall_cue)
19
- @database.transaction { @database[recall_cue] }
15
+ return true
20
16
  end
21
17
 
22
18
  def forget(recall_cue)
23
19
  raise "no entry for cue" unless has_cue?(recall_cue)
24
20
  @database.transaction{ @database.delete(recall_cue) }
21
+ return true
25
22
  end
26
23
 
27
- def size
28
- list_cues.size
24
+ def has_cue?(recall_cue)
25
+ list_cues.any?{ |cue| cue == recall_cue }
29
26
  end
30
27
 
31
28
  def list_cues
32
29
  @database.transaction { @database.roots }
33
30
  end
34
31
 
35
- def has_cue?(recall_cue)
36
- list_cues.any?{ |cue| cue == recall_cue }
32
+ def present?
33
+ File.exists?(@database.path)
34
+ end
35
+
36
+ def save!
37
+ @database.transaction{@database.commit}
38
+ end
39
+
40
+ def recall(recall_cue)
41
+ raise "no entry for cue '#{recall_cue}'" unless has_cue?(recall_cue)
42
+ @database.transaction { @database[recall_cue] }
43
+ end
44
+
45
+ def size
46
+ list_cues.size
37
47
  end
38
48
 
39
49
  end
@@ -1,36 +1,40 @@
1
1
  require "fileutils"
2
2
 
3
3
  class Sheldon
4
- VERSION = "0.4.1".freeze
4
+ VERSION = "0.5.0".freeze
5
5
  attr_reader :brain, :builder
6
6
 
7
- def initialize(sheldon_data_dir, opts = {})
7
+ def initialize(sheldon_data_dir)
8
8
  unless Dir.exists?(sheldon_data_dir)
9
- raise MissingDataDirectoryException, "The data directory (#{sheldon_data_dir}) doesn't exist. Please create the directory or set an alternative using the $SHELDON_DATA_DIR environment variable."
9
+ raise MissingDataDirectoryException, "Directory #{sheldon_data_dir} does not exist."
10
10
  end
11
11
 
12
- @brain = opts[:brain] || Brain.new(sheldon_data_dir)
13
- @builder = opts[:builder] || Builder.new
12
+ @brain = Brain.new(sheldon_data_dir)
13
+ @builder = Builder.new
14
14
  end
15
15
 
16
16
  def build(abs_learn_path)
17
17
  builder.build(abs_learn_path)
18
18
  end
19
19
 
20
+ def forget(recall_cue)
21
+ brain.forget(recall_cue)
22
+ end
23
+
20
24
  def learn(recall_cue, abs_learn_path)
21
25
  brain.learn(recall_cue, abs_learn_path)
22
26
  end
23
27
 
24
- def recall(recall_cue)
25
- brain.recall(recall_cue)
28
+ def list_cues
29
+ brain.list_cues
26
30
  end
27
31
 
28
- def forget(recall_cue)
29
- brain.forget(recall_cue)
32
+ def recall(recall_cue)
33
+ brain.recall(recall_cue)
30
34
  end
31
35
 
32
- def list_cues
33
- brain.list_cues
36
+ def setup!
37
+ brain.memory.save!
34
38
  end
35
39
 
36
40
  def recalled?(recall_cue)
metadata CHANGED
@@ -1,89 +1,89 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sheldon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Jones
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-16 00:00:00.000000000 Z
11
+ date: 2018-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '11.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '11.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: coveralls
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.8.13
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.8.13
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: byebug
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
75
  version: '9.0'
76
- - - ">="
76
+ - - '>='
77
77
  - !ruby/object:Gem::Version
78
78
  version: 9.0.0
79
79
  type: :development
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - "~>"
83
+ - - ~>
84
84
  - !ruby/object:Gem::Version
85
85
  version: '9.0'
86
- - - ">="
86
+ - - '>='
87
87
  - !ruby/object:Gem::Version
88
88
  version: 9.0.0
89
89
  description: Another config and dotfile manager for unix environments
@@ -93,16 +93,16 @@ executables:
93
93
  extensions: []
94
94
  extra_rdoc_files: []
95
95
  files:
96
- - LICENSE
97
- - README.md
98
- - bin/sheldon
99
- - lib/sheldon.rb
100
96
  - lib/sheldon/brain.rb
101
97
  - lib/sheldon/builder.rb
102
98
  - lib/sheldon/exceptions.rb
103
99
  - lib/sheldon/helpers.rb
104
100
  - lib/sheldon/memory.rb
105
101
  - lib/sheldon/sheldon.rb
102
+ - lib/sheldon.rb
103
+ - bin/sheldon
104
+ - LICENSE
105
+ - README.md
106
106
  homepage: https://github.com/dvjones89/sheldon
107
107
  licenses:
108
108
  - MIT
@@ -113,17 +113,17 @@ require_paths:
113
113
  - lib
114
114
  required_ruby_version: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ">="
116
+ - - '>='
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - ">="
121
+ - - '>='
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0'
124
124
  requirements: []
125
125
  rubyforge_project:
126
- rubygems_version: 2.5.1
126
+ rubygems_version: 2.0.14.1
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: Another config and dotfile manager for unix environments