dotsync 0.1.4 → 0.1.6

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/gem-push.yml +4 -0
  3. data/.rubocop.yml +353 -0
  4. data/CHANGELOG.md +19 -9
  5. data/Gemfile +0 -7
  6. data/Gemfile.lock +20 -1
  7. data/README.md +1 -1
  8. data/Rakefile +4 -2
  9. data/dotsync.gemspec +8 -1
  10. data/exe/console +1 -0
  11. data/exe/dotsync +4 -4
  12. data/lib/dotsync/actions/base_action.rb +2 -0
  13. data/lib/dotsync/actions/concerns/mappings_transfer.rb +18 -1
  14. data/lib/dotsync/actions/pull_action.rb +19 -15
  15. data/lib/dotsync/actions/push_action.rb +10 -8
  16. data/lib/dotsync/actions/watch_action.rb +2 -1
  17. data/lib/dotsync/colors.rb +37 -0
  18. data/lib/dotsync/{actions/config → config}/base_config.rb +2 -1
  19. data/lib/dotsync/{actions/config → config}/pull_action_config.rb +3 -2
  20. data/lib/dotsync/{actions/config → config}/push_action_config.rb +3 -2
  21. data/lib/dotsync/{actions/config → config}/watch_action_config.rb +2 -2
  22. data/lib/dotsync/{actions/config → config}/xdg_base_directory_spec.rb +2 -0
  23. data/lib/dotsync/errors.rb +3 -0
  24. data/lib/dotsync/icons.rb +3 -1
  25. data/lib/dotsync/models/diff.rb +18 -0
  26. data/lib/dotsync/{actions/config/mapping_entry.rb → models/mapping.rb} +25 -13
  27. data/lib/dotsync/runner.rb +37 -32
  28. data/lib/dotsync/tasks/actions.rake +3 -1
  29. data/lib/dotsync/utils/directory_differ.rb +111 -0
  30. data/lib/dotsync/utils/file_transfer.rb +57 -0
  31. data/lib/dotsync/{logger.rb → utils/logger.rb} +2 -0
  32. data/lib/dotsync/{path_utils.rb → utils/path_utils.rb} +4 -2
  33. data/lib/dotsync/version.rb +3 -1
  34. data/lib/dotsync.rb +30 -26
  35. metadata +85 -11
  36. data/lib/dotsync/file_transfer.rb +0 -49
@@ -1,22 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class PushAction < BaseAction
3
5
  include MappingsTransfer
4
6
 
5
7
  def execute
6
8
  show_config
9
+ show_changes
7
10
  push_dotfiles
8
11
  end
9
12
 
10
13
  private
14
+ def show_config
15
+ show_mappings
16
+ end
11
17
 
12
- def show_config
13
- show_mappings
14
- end
15
-
16
- def push_dotfiles
17
- transfer_mappings
18
+ def push_dotfiles
19
+ transfer_mappings
18
20
 
19
- action("Dotfiles pushed", icon: :copy)
20
- end
21
+ action("Dotfiles pushed", icon: :copy)
22
+ end
21
23
  end
22
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class WatchAction < BaseAction
3
5
  def_delegator :@config, :mappings
@@ -19,7 +21,6 @@ module Dotsync
19
21
  end
20
22
 
21
23
  private
22
-
23
24
  def show_config
24
25
  logger.info("Mappings:", icon: :config)
25
26
  mappings.each { |mapping| logger.log(" #{mapping}") }
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dotsync
4
+ module Colors
5
+ DEFAULT_DIFF_ADDITIONS = 34
6
+ DEFAULT_DIFF_MODIFICATIONS = 36
7
+ DEFAULT_DIFF_REMOVALS = 88
8
+
9
+ @custom_colors = {}
10
+
11
+ def self.load_custom_colors(config)
12
+ @custom_colors = {
13
+ diff_additions: config.dig("colors", "diff_additions") || DEFAULT_FORCE,
14
+ diff_modifications: config.dig("colors", "diff_modifications") || DEFAULT_IGNORE,
15
+ diff_removals: config.dig("colors", "diff_removals") || DEFAULT_INVALID
16
+ }
17
+ end
18
+
19
+ def self.diff_additions
20
+ @custom_colors[:additions] || DEFAULT_DIFF_ADDITIONS
21
+ end
22
+
23
+ def self.diff_modifications
24
+ @custom_colors[:modifications] || DEFAULT_DIFF_MODIFICATIONS
25
+ end
26
+
27
+ def self.diff_removals
28
+ @custom_colors[:removals] || DEFAULT_DIFF_REMOVALS
29
+ end
30
+
31
+ MAPPINGS = {
32
+ diff_additions: -> { diff_additions },
33
+ diff_modifications: -> { diff_modifications },
34
+ diff_removals: -> { diff_removals }
35
+ }
36
+ end
37
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  # BaseConfig serves as an abstract class to define the structure
3
5
  # and validation rules for configuration files in the Dotsync system.
@@ -15,7 +17,6 @@ module Dotsync
15
17
  end
16
18
 
17
19
  private
18
-
19
20
  # Validates the configuration file.
20
21
  #
21
22
  # @raise [NotImplementedError] if not implemented by a subclass.
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class PullActionConfig < BaseConfig
3
5
  include XDGBaseDirectorySpec
4
6
 
5
7
  def mappings
6
8
  mappings_list = section["mappings"]
7
- Array(mappings_list).map { |mapping| Dotsync::MappingEntry.new(mapping) }
9
+ Array(mappings_list).map { |mapping| Dotsync::Mapping.new(mapping) }
8
10
  end
9
11
 
10
12
  def backups_root
@@ -12,7 +14,6 @@ module Dotsync
12
14
  end
13
15
 
14
16
  private
15
-
16
17
  SECTION_NAME = "pull"
17
18
 
18
19
  def section_name
@@ -1,12 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class PushActionConfig < BaseConfig
3
5
  def mappings
4
6
  mappings_list = section["mappings"]
5
- Array(mappings_list).map { |mapping| Dotsync::MappingEntry.new(mapping) }
7
+ Array(mappings_list).map { |mapping| Dotsync::Mapping.new(mapping) }
6
8
  end
7
9
 
8
10
  private
9
-
10
11
  SECTION_NAME = "push"
11
12
 
12
13
  def section_name
@@ -1,8 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class WatchActionConfig < PushActionConfig
3
-
4
5
  private
5
-
6
6
  SECTION_NAME = "watch"
7
7
 
8
8
  def section_name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  # https://specifications.freedesktop.org/basedir-spec/latest/
3
5
  module XDGBaseDirectorySpec
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
4
+ class Error < StandardError; end
2
5
  class ConfigError < StandardError; end
3
6
  end
data/lib/dotsync/icons.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  module Icons
3
5
  # Log level icons
@@ -7,7 +9,7 @@ module Dotsync
7
9
  # Configuration icon
8
10
  CONFIG = " "
9
11
 
10
- # Default MappingEntry icons
12
+ # Default Mapping icons
11
13
  DEFAULT_FORCE = "󰁪 "
12
14
  DEFAULT_IGNORE = "󰈉 "
13
15
  DEFAULT_INVALID = "󱏏 "
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dotsync
4
+ # Represents the differences between two directories
5
+ class Diff
6
+ attr_reader :additions, :modifications, :removals
7
+
8
+ def initialize(additions: [], modifications: [], removals: [])
9
+ @additions = additions
10
+ @modifications = modifications
11
+ @removals = removals
12
+ end
13
+
14
+ def empty?
15
+ @additions.empty? && @modifications.empty? && @removals.empty?
16
+ end
17
+ end
18
+ end
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
- class MappingEntry
4
+ class Mapping
3
5
  include Dotsync::PathUtils
4
6
 
5
7
  attr_reader :original_src, :original_dest, :original_ignores
6
8
 
7
- def initialize(hash)
8
- @original_src = hash["src"]
9
- @original_dest = hash["dest"]
10
- @original_ignores = Array(hash["ignore"])
11
- @force = hash["force"] || false
9
+ def initialize(attributes)
10
+ @original_src = attributes["src"]
11
+ @original_dest = attributes["dest"]
12
+ @original_ignores = Array(attributes["ignore"])
13
+ @force = attributes["force"] || false
12
14
 
13
15
  @sanitized_src = sanitize_path(@original_src)
14
16
  @sanitized_dest = sanitize_path(@original_dest)
@@ -32,7 +34,19 @@ module Dotsync
32
34
  end
33
35
 
34
36
  def valid?
35
- File.exist?(@sanitized_src) && File.exist?(File.dirname(@sanitized_dest))
37
+ (File.file?(src) && File.file?(dest)) ||
38
+ (File.directory?(src) && File.directory?(dest)) ||
39
+ (File.file?(src) && !File.exist?(dest) && File.directory?(File.dirname(dest)))
40
+ end
41
+
42
+ def backup_possible?
43
+ valid? && File.exist?(dest)
44
+ end
45
+
46
+ def backup_basename
47
+ return unless valid?
48
+ return File.dirname(dest) unless File.exist?(dest)
49
+ File.basename(dest)
36
50
  end
37
51
 
38
52
  def to_s
@@ -52,7 +66,7 @@ module Dotsync
52
66
  path
53
67
  end
54
68
 
55
- Dotsync::MappingEntry.new(
69
+ Dotsync::Mapping.new(
56
70
  "src" => File.join(@original_src, relative_path),
57
71
  "dest" => File.join(@original_dest, relative_path),
58
72
  "force" => @force,
@@ -61,10 +75,8 @@ module Dotsync
61
75
  end
62
76
 
63
77
  private
64
-
65
- def ignores?
66
- @original_ignores.any?
67
- end
78
+ def ignores?
79
+ @original_ignores.any?
80
+ end
68
81
  end
69
82
  end
70
-
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class Runner
3
5
  def initialize(logger: nil)
@@ -15,7 +17,11 @@ module Dotsync
15
17
  config_class = Dotsync.const_get("#{camelize(action_name.to_s)}ActionConfig")
16
18
 
17
19
  config = config_class.new(Dotsync.config_path)
20
+ Dotsync::Icons.load_custom_icons(config)
21
+ Dotsync::Colors.load_custom_colors(config)
22
+
18
23
  action = action_class.new(config, @logger)
24
+
19
25
  action.execute
20
26
  rescue ConfigError => e
21
27
  @logger.error("[#{action_name}] config error:")
@@ -32,42 +38,41 @@ module Dotsync
32
38
  end
33
39
 
34
40
  private
41
+ def setup_config
42
+ require "toml-rb"
43
+ require "fileutils"
35
44
 
36
- def setup_config
37
- require 'toml-rb'
38
- require 'fileutils'
39
-
40
- config_path = File.expand_path(Dotsync.config_path)
41
- FileUtils.mkdir_p(File.dirname(config_path))
45
+ config_path = File.expand_path(Dotsync.config_path)
46
+ FileUtils.mkdir_p(File.dirname(config_path))
42
47
 
43
- example_mappings = {
44
- "pull" => {
45
- "mappings" => [
46
- { "src" => "$DOTFILES_DIR/config/", "dest" => "$XDG_CONFIG_HOME", "force" => false },
47
- { "src" => "$DOTFILES_DIR/home/.zshenv", "dest" => "$HOME" }
48
- ],
49
- },
50
- "push" => {
51
- "mappings" => [
52
- { "src" => "$HOME/.zshenv", "dest" => "$DOTFILES_DIR/home/.zshenv" },
53
- { "src" => "$XDG_CONFIG_HOME/alacritty", "dest" => "$DOTFILES_DIR/config/alacritty" }
54
- ]
55
- },
56
- "watch" => {
57
- "mappings" => [
58
- { "src" => "$HOME/.zshenv", "dest" => "$DOTFILES_DIR/home/.zshenv" },
59
- { "src" => "$XDG_CONFIG_HOME/alacritty", "dest" => "$DOTFILES_DIR/config/alacritty" }
60
- ]
48
+ example_mappings = {
49
+ "pull" => {
50
+ "mappings" => [
51
+ { "src" => "$DOTFILES_DIR/config/", "dest" => "$XDG_CONFIG_HOME", "force" => false },
52
+ { "src" => "$DOTFILES_DIR/home/.zshenv", "dest" => "$HOME" }
53
+ ],
54
+ },
55
+ "push" => {
56
+ "mappings" => [
57
+ { "src" => "$HOME/.zshenv", "dest" => "$DOTFILES_DIR/home/.zshenv" },
58
+ { "src" => "$XDG_CONFIG_HOME/alacritty", "dest" => "$DOTFILES_DIR/config/alacritty" }
59
+ ]
60
+ },
61
+ "watch" => {
62
+ "mappings" => [
63
+ { "src" => "$HOME/.zshenv", "dest" => "$DOTFILES_DIR/home/.zshenv" },
64
+ { "src" => "$XDG_CONFIG_HOME/alacritty", "dest" => "$DOTFILES_DIR/config/alacritty" }
65
+ ]
66
+ }
61
67
  }
62
- }
63
68
 
64
- File.write(config_path, TomlRB.dump(example_mappings))
65
- @logger.info("Configuration file created at #{config_path}")
66
- end
69
+ File.write(config_path, TomlRB.dump(example_mappings))
70
+ @logger.info("Configuration file created at #{config_path}")
71
+ end
67
72
 
68
- # Utility to convert 'pull' to 'Pull', 'sync' to 'Sync', etc.
69
- def camelize(str)
70
- str.split('_').map(&:capitalize).join
71
- end
73
+ # Utility to convert 'pull' to 'Pull', 'sync' to 'Sync', etc.
74
+ def camelize(str)
75
+ str.split("_").map(&:capitalize).join
76
+ end
72
77
  end
73
78
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  desc "Sync Dotfiles"
2
4
  task :sync do
3
- ds = Dotsync::SyncAction.new
5
+ Dotsync::SyncAction.new
4
6
  end
5
7
 
6
8
  desc "Watch Dotfiles"
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dotsync
4
+ # Usage:
5
+ # differ = DirectoryDiffer.new("/path/to/src", "/path/to/dest")
6
+ # differences = differ.diff
7
+ class DirectoryDiffer
8
+ attr_reader :src, :dest
9
+
10
+ # Initializes a new DirectoryDiffer.
11
+ #
12
+ # @param mapping [Dotsync::Mapping] the mapping object containing source, destination, force, and ignore details
13
+ # @option mapping [String] :src the source directory path
14
+ # @option mapping [String] :dest the destination directory path
15
+ # @option mapping [Boolean] :force? optional flag to force actions
16
+ # @option mapping [Array<String>] :ignores optional list of files/directories to ignore
17
+ def initialize(mapping)
18
+ @src = mapping.src
19
+ @dest = mapping.dest
20
+ @force = mapping.force?
21
+ @ignores = mapping.original_ignores || []
22
+ end
23
+
24
+ def diff
25
+ additions = []
26
+ modifications = []
27
+ removals = []
28
+
29
+ Find.find(src) do |src_path|
30
+ rel_path = src_path.sub(/^#{Regexp.escape(src)}\/?/, "")
31
+ next if rel_path.empty?
32
+
33
+ dest_path = File.join(dest, rel_path)
34
+
35
+ if !File.exist?(dest_path)
36
+ additions << rel_path
37
+ elsif File.file?(src_path) && File.file?(dest_path)
38
+ if File.size(src_path) != File.size(dest_path)
39
+ modifications << rel_path
40
+ end
41
+ end
42
+ end
43
+
44
+ if @force
45
+ Find.find(dest) do |dest_path|
46
+ rel_path = dest_path.sub(/^#{Regexp.escape(dest)}\/?/, "")
47
+ next if rel_path.empty?
48
+
49
+ src_path = File.join(src, rel_path)
50
+
51
+ if !File.exist?(src_path)
52
+ removals << rel_path
53
+ end
54
+ end
55
+ end
56
+
57
+ if @ignores.any?
58
+ additions = filter_paths(additions, @ignores)
59
+ modifications = filter_paths(modifications, @ignores)
60
+ removals = filter_paths(removals, @ignores)
61
+ end
62
+
63
+ Dotsync::Diff.new(additions: additions, modifications: modifications, removals: removals)
64
+ end
65
+
66
+ private
67
+ def collect_src_diffs
68
+ diffs = []
69
+ Find.find(src) do |src_path|
70
+ rel_path = src_path.sub(/^#{Regexp.escape(src)}\/?/, "")
71
+ next if rel_path.empty?
72
+
73
+ dest_path = File.join(dest, rel_path)
74
+
75
+ if !File.exist?(dest_path)
76
+ diffs << rel_path
77
+ elsif File.directory?(src_path) && !File.directory?(dest_path)
78
+ diffs << rel_path
79
+ elsif File.file?(src_path) && !File.file?(dest_path)
80
+ diffs << rel_path
81
+ elsif File.file?(src_path) && File.file?(dest_path)
82
+ if File.size(src_path) != File.size(dest_path)
83
+ diffs << rel_path
84
+ end
85
+ end
86
+ end
87
+ diffs
88
+ end
89
+
90
+ def collect_dest_diffs
91
+ diffs = []
92
+ Find.find(dest) do |dest_path|
93
+ rel_path = dest_path.sub(/^#{Regexp.escape(dest)}\/?/, "")
94
+ next if rel_path.empty?
95
+ src_path = File.join(src, rel_path)
96
+ if !File.exist?(src_path)
97
+ diffs << rel_path
98
+ end
99
+ end
100
+ diffs
101
+ end
102
+
103
+ def filter_paths(all_paths, ignore_paths)
104
+ all_paths.reject do |path|
105
+ ignore_paths.any? do |ignore|
106
+ path == ignore || path.start_with?("#{ignore}/")
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dotsync
4
+ class FileTransfer
5
+ attr_reader :ignores
6
+
7
+ # Initializes a new FileTransfer instance
8
+ #
9
+ # @param mapping [Dotsync::Mapping] the mapping object containing source, destination, force, and ignore details
10
+ # @option mapping [String] :src the source directory path
11
+ # @option mapping [String] :dest the destination directory path
12
+ # @option mapping [Boolean] :force? optional flag to force actions
13
+ # @option mapping [Array<String>] :ignores optional list of files/directories to ignore
14
+ def initialize(mapping)
15
+ @src = mapping.src
16
+ @dest = mapping.dest
17
+ @force = mapping.force?
18
+ @ignores = mapping.ignores || []
19
+ end
20
+
21
+ def transfer
22
+ if File.file?(@src)
23
+ transfer_file(@src, @dest)
24
+ else
25
+ FileUtils.rm_rf(Dir.glob(File.join(@dest, "*"))) if @force
26
+ transfer_folder(@src, @dest)
27
+ end
28
+ end
29
+
30
+ private
31
+ def transfer_file(file_src, file_dest)
32
+ FileUtils.mkdir_p(File.dirname(file_dest))
33
+ FileUtils.cp(file_src, file_dest)
34
+ end
35
+
36
+ def transfer_folder(folder_src, folder_dest)
37
+ FileUtils.mkdir_p(folder_dest)
38
+ Dir.glob("#{folder_src}/*", File::FNM_DOTMATCH).each do |path|
39
+ next if [".", ".."].include?(File.basename(path))
40
+
41
+ full_path = File.expand_path(path)
42
+ next if ignore?(full_path)
43
+
44
+ target = File.join(folder_dest, File.basename(path))
45
+ if File.file?(full_path)
46
+ FileUtils.cp(full_path, target)
47
+ else
48
+ transfer_folder(full_path, target)
49
+ end
50
+ end
51
+ end
52
+
53
+ def ignore?(path)
54
+ @ignores.any? { |ignore| path.start_with?(ignore) }
55
+ end
56
+ end
57
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  class Logger
3
5
  attr_accessor :output
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
4
  module PathUtils
3
5
  ENV_VARS_COLOR = 104
@@ -15,8 +17,8 @@ module Dotsync
15
17
  # @param [String] path The input path to translate
16
18
  # @return [String] The translated path
17
19
  def translate_tmp_path(path)
18
- if path.start_with?('/tmp') && RUBY_PLATFORM.include?('darwin')
19
- path.sub('/tmp', '/private/tmp')
20
+ if path.start_with?("/tmp") && RUBY_PLATFORM.include?("darwin")
21
+ path.sub("/tmp", "/private/tmp")
20
22
  else
21
23
  path
22
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Dotsync
2
- VERSION = "0.1.4"
4
+ VERSION = "0.1.6"
3
5
  end
data/lib/dotsync.rb CHANGED
@@ -1,29 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Libs dependencies
2
- require 'fileutils'
3
- require 'listen'
4
- require 'toml-rb'
5
- require 'logger'
6
- require 'forwardable' # Ruby standard library
7
- require 'ostruct'
8
-
9
- # Errors
10
- require_relative "dotsync/errors"
4
+ require "fileutils"
5
+ require "listen"
6
+ require "toml-rb"
7
+ require "logger"
8
+ require "forwardable" # Ruby standard library
9
+ require "ostruct"
10
+ require "find"
11
11
 
12
12
  # Utils
13
- require_relative 'dotsync/icons'
14
- require_relative 'dotsync/logger'
15
- require_relative 'dotsync/file_transfer'
16
- require_relative 'dotsync/path_utils'
13
+ require_relative "dotsync/utils/logger"
14
+ require_relative "dotsync/utils/file_transfer"
15
+ require_relative "dotsync/utils/directory_differ"
16
+ require_relative "dotsync/utils/path_utils"
17
+
18
+ # Models
19
+ require_relative "dotsync/models/mapping"
20
+ require_relative "dotsync/models/diff"
17
21
 
18
22
  # Config
19
- require_relative "dotsync/actions/config/xdg_base_directory_spec"
20
- require_relative "dotsync/actions/config/mapping_entry"
21
- require_relative "dotsync/actions/config/base_config"
22
- require_relative "dotsync/actions/config/pull_action_config"
23
- require_relative "dotsync/actions/config/push_action_config"
24
- require_relative "dotsync/actions/config/watch_action_config"
25
-
26
- # Concerns
23
+ require_relative "dotsync/config/xdg_base_directory_spec"
24
+ require_relative "dotsync/config/base_config"
25
+ require_relative "dotsync/config/pull_action_config"
26
+ require_relative "dotsync/config/push_action_config"
27
+ require_relative "dotsync/config/watch_action_config"
28
+
29
+ # Actions Concerns
27
30
  require_relative "dotsync/actions/concerns/mappings_transfer"
28
31
 
29
32
  # Actions
@@ -32,18 +35,19 @@ require_relative "dotsync/actions/pull_action"
32
35
  require_relative "dotsync/actions/push_action"
33
36
  require_relative "dotsync/actions/watch_action"
34
37
 
35
- require_relative 'dotsync/runner'
36
-
38
+ # Base classes
39
+ require_relative "dotsync/errors"
40
+ require_relative "dotsync/icons"
41
+ require_relative "dotsync/colors"
42
+ require_relative "dotsync/runner"
37
43
  require_relative "dotsync/version"
38
44
 
39
45
  module Dotsync
40
- class Error < StandardError; end
41
-
42
46
  class << self
43
47
  attr_writer :config_path
44
48
 
45
49
  def config_path
46
- @config_path ||= ENV['DOTSYNC_CONFIG'] || "~/.config/dotsync.toml"
50
+ @config_path ||= ENV["DOTSYNC_CONFIG"] || "~/.config/dotsync.toml"
47
51
  end
48
52
  end
49
53
  end