utils 0.85.0 → 0.87.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
  SHA256:
3
- metadata.gz: 3fd913953f77f177caac61d9a98e615eaba79f5aad327b892a8728d510443b3f
4
- data.tar.gz: d8f2937862ac26cffa7a4d3244155354b33e587d0fc6cecacedbf6539845bbf4
3
+ metadata.gz: 11c3f0c005743ebba2c7f6e88075ccf2b600c96a2a7a61fdbf71a3912ed167e7
4
+ data.tar.gz: 0a477a003d9d890075fd2f403eb0fbff26d7d4629af84a46862b5ec8b4f0d4fa
5
5
  SHA512:
6
- metadata.gz: cc3e00dd0c01f36a2835f74c490f2b35cb8d64b7d4197d49d7c3ae09e247ea3d6067483d34facbdc40c19018516e7a368ddfeb4a38e26efc6d8cf460a8785e4a
7
- data.tar.gz: 566f70210d3ff85d8798cc2876371e49c86d2ec959fa11f76a6ecc6e546819953878fcabc53e210de8c1b024dab9d61863f86f5c415fcb02551fe0f79420b8de
6
+ metadata.gz: 6149a5155835a3f6cc8acd7e20fd5ff931a4a45f3d26240937891e893a736376f8703d1cfcbca63d85369e7a06278bfe663d70c5454e54d9917ede6476b0538b
7
+ data.tar.gz: d12dc91177ada52d0dd1a0884bc975745791656f9058d4a01b95bf0b431355ab9102af178b9398bb34105fe3a1fa9b6e265052727d5ef248aab7927b755a2318
data/bin/changes CHANGED
@@ -28,6 +28,7 @@
28
28
  require 'ollama'
29
29
  include Ollama
30
30
  require 'utils'
31
+ include Utils::XDG
31
32
 
32
33
  # Executes a shell command and returns its output.
33
34
  #
@@ -101,13 +102,12 @@ def compute_change(range_from, range_to)
101
102
  EOT
102
103
  end
103
104
 
104
- config = Utils::ConfigDir.new('changes', env_var: 'XDG_CONFIG_HOME')
105
-
105
+ config = XDG_CONFIG_HOME + 'changes'
106
106
  base_url = ENV['OLLAMA_URL'] || 'http://%s' % ENV.fetch('OLLAMA_HOST')
107
107
  model = ENV.fetch('OLLAMA_MODEL', 'llama3.1')
108
- system = File.read("#{config}/system.txt")
109
- prompt = File.read("#{config}/prompt.txt") + "\n\n#{log}\n"
110
- client_config = Client::Config.load_from_json("#{config}/client.json")
108
+ system = config.read('system.txt')
109
+ prompt = config.read('prompt.txt') + "\n\n#{log}\n"
110
+ client_config = Client::Config.load_from_json(config + 'client.json')
111
111
  client_config.base_url = base_url
112
112
 
113
113
  if ENV['DEBUG'].to_i == 1
data/bin/code_comment CHANGED
@@ -32,6 +32,7 @@
32
32
  require 'ollama'
33
33
  include Ollama
34
34
  require 'utils'
35
+ include Utils::XDG
35
36
  require 'context_spook'
36
37
 
37
38
  META_METHOD = /(
@@ -184,7 +185,7 @@ end
184
185
  filename_linenumber = ARGV.shift or fail "require file_name as second argument"
185
186
  $config = Utils::ConfigFile.new
186
187
  $config.configure_from_paths
187
- $config_dir = Utils::ConfigDir.new('code_comment', env_var: 'XDG_CONFIG_HOME')
188
+ $config_dir = XDG_CONFIG_HOME + 'code_comment'
188
189
  base_url = ENV['OLLAMA_URL'] || 'http://%s' % ENV.fetch('OLLAMA_HOST')
189
190
  model = ENV.fetch('OLLAMA_MODEL', 'llama3.1')
190
191
  construct, construct_type = fetch_construct(filename_linenumber)
data/bin/commit_message CHANGED
@@ -26,10 +26,11 @@
26
26
  # - prompt.txt: Commit message template, contains %{branch} and %{stdin}
27
27
 
28
28
  require 'utils'
29
+ include Utils::XDG
29
30
 
30
- config = Utils::ConfigDir.new('commit_message', env_var: 'XDG_CONFIG_HOME')
31
+ config = XDG_CONFIG_HOME + 'commit_message'
31
32
 
32
33
  branch = `git rev-parse --abbrev-ref HEAD`.chomp
33
- exec 'ollama_cli', '-c', "#{config}/client.json",
34
- '-M', "#{config}/options.json", '-P', "branch=#{branch}",
35
- '-s', "#{config}/system.txt", '-p', "#{config}/prompt.txt"
34
+ exec 'ollama_cli', '-c', config + 'client.json',
35
+ '-M', config + 'options.json', '-P', "branch=#{branch}",
36
+ '-s', config + 'system.txt', '-p', config + 'prompt.txt'
data/bin/discover CHANGED
@@ -85,7 +85,7 @@ Options are
85
85
  -n NUMBER the first NUMBER of matches is returned
86
86
  -s search by interactively inputting PATTERN
87
87
  -l list all paths in cache relative to current directory
88
- -L list all paths in cahce as absolute pathes from root
88
+ -L list all paths in cache as absolute pathes from root
89
89
  -h display this help
90
90
 
91
91
  Version is #{File.basename($0)} #{Utils::VERSION}.
data/bin/search CHANGED
@@ -206,7 +206,7 @@ def usage
206
206
  -B NUMBER displays NUMBER lines of context before the match
207
207
  -C NUMBER displays NUMBER lines of context around the match
208
208
  -f just list the paths of the files that would be searched
209
- -F just consider real files when searching
209
+ -F follow symlinks when searching
210
210
  -l just list the paths of the files with matches
211
211
  -L list only the path:linenumber of the files with matches
212
212
  -pX interpret PATTERN argument as X=f fuzzy or X=r for regexp
@@ -0,0 +1,110 @@
1
+ class Utils::ConfigFile
2
+ # Base class for defining configuration blocks with DSL accessors.
3
+ #
4
+ # This class provides a foundation for creating configuration classes that
5
+ # support dynamic attribute definition through DSL-style accessor methods. It
6
+ # includes functionality for registering configuration settings and
7
+ # generating Ruby code representations of the configuration state.
8
+ class BlockConfig
9
+ class << self
10
+ # The inherited method extends the module with DSL accessor functionality
11
+ # and calls the superclass implementation.
12
+ #
13
+ # @param modul [ Module ] the module that inherited this class
14
+ def inherited(modul)
15
+ modul.extend DSLKit::DSLAccessor
16
+ super
17
+ end
18
+
19
+ # The config method sets up a configuration accessor with the specified
20
+ # name and options.
21
+ #
22
+ # This method registers a new configuration setting by adding it to the
23
+ # list of configuration settings and then creates an accessor for it
24
+ # using the dsl_accessor method, allowing for easy retrieval and
25
+ # assignment of configuration values.
26
+ #
27
+ # @param name [ Object ] the name of the configuration setting
28
+ # @param r [ Array ] additional arguments passed to the dsl_accessor method
29
+ #
30
+ # @yield [ block ] optional block to be passed to the dsl_accessor method
31
+ #
32
+ # @return [ Object ] returns self to allow for method chaining
33
+ def config(name, *r, &block)
34
+ self.config_settings ||= []
35
+ config_settings << name.to_sym
36
+ dsl_accessor name, *r, &block
37
+ self
38
+ end
39
+
40
+ # The lazy_config method configures a lazy-loaded configuration option
41
+ # with a default value.
42
+ #
43
+ # This method registers a new configuration setting that will be
44
+ # initialized lazily, meaning the default value or the set value is only
45
+ # computed when the configuration is actually accessed. It adds the
46
+ # setting to the list of configuration settings and creates a lazy
47
+ # accessor for it.
48
+ #
49
+ # @param name [ Object ] the name of the configuration setting to define
50
+ # @yield [ default ] optional block that provides the default value for
51
+ # the configuration
52
+ #
53
+ # @return [ Object ] returns self to allow for method chaining
54
+ def lazy_config(name, &default)
55
+ self.config_settings ||= []
56
+ config_settings << name.to_sym
57
+ dsl_lazy_accessor(name, &default)
58
+ self
59
+ end
60
+
61
+ # The config_settings method provides access to the configuration
62
+ # settings.
63
+ #
64
+ # This method returns the configuration settings stored in the instance
65
+ # variable, allowing for reading and modification of the object's
66
+ # configuration state.
67
+ #
68
+ # @return [ Object ] the current configuration settings stored in the
69
+ # instance variable
70
+ attr_accessor :config_settings
71
+ end
72
+
73
+ # The initialize method sets up the instance by evaluating the provided
74
+ # block in the instance's context.
75
+ #
76
+ # This method allows for dynamic configuration of the object by executing
77
+ # the given block within the instance's scope, enabling flexible
78
+ # initialization patterns.
79
+ #
80
+ # @param block [ Proc ] the block to be evaluated for instance setup
81
+ def initialize(&block)
82
+ block and instance_eval(&block)
83
+ end
84
+
85
+ # The to_ruby method generates a Ruby configuration block representation by
86
+ # recursively processing the object's configuration settings and their
87
+ # values.
88
+ # It creates a nested structure with proper indentation and formatting
89
+ # suitable for configuration files.
90
+ #
91
+ # @param depth [ Integer ] the current nesting depth for indentation purposes
92
+ #
93
+ # @return [ String ] a formatted Ruby string representing the configuration block
94
+ def to_ruby(depth = 0)
95
+ result = ''
96
+ result << ' ' * 2 * depth <<
97
+ "#{self.class.name[/::([^:]+)\z/, 1].underscore} do\n"
98
+ for name in self.class.config_settings
99
+ value = __send__(name)
100
+ if value.respond_to?(:to_ruby)
101
+ result << ' ' * 2 * (depth + 1) << value.to_ruby(depth + 1)
102
+ else
103
+ result << ' ' * 2 * (depth + 1) <<
104
+ "#{name} #{Array(value).map(&:inspect) * ', '}\n"
105
+ end
106
+ end
107
+ result << ' ' * 2 * depth << "end\n"
108
+ end
109
+ end
110
+ end
@@ -1,4 +1,5 @@
1
1
  require 'tins'
2
+ require 'utils/config_file/block_config'
2
3
 
3
4
  # Configuration file manager for Utils library.
4
5
  #
@@ -93,115 +94,6 @@ class Utils::ConfigFile
93
94
  self
94
95
  end
95
96
 
96
- # Base class for defining configuration blocks with DSL accessors.
97
- #
98
- # This class provides a foundation for creating configuration classes that
99
- # support dynamic attribute definition through DSL-style accessor methods. It
100
- # includes functionality for registering configuration settings and
101
- # generating Ruby code representations of the configuration state.
102
- class BlockConfig
103
- class << self
104
- # The inherited method extends the module with DSL accessor functionality
105
- # and calls the superclass implementation.
106
- #
107
- # @param modul [ Module ] the module that inherited this class
108
- def inherited(modul)
109
- modul.extend DSLKit::DSLAccessor
110
- super
111
- end
112
-
113
- # The config method sets up a configuration accessor with the specified
114
- # name and options.
115
- #
116
- # This method registers a new configuration setting by adding it to the
117
- # list of configuration settings and then creates an accessor for it
118
- # using the dsl_accessor method, allowing for easy retrieval and
119
- # assignment of configuration values.
120
- #
121
- # @param name [ Object ] the name of the configuration setting
122
- # @param r [ Array ] additional arguments passed to the dsl_accessor method
123
- #
124
- # @yield [ block ] optional block to be passed to the dsl_accessor method
125
- #
126
- # @return [ Object ] returns self to allow for method chaining
127
- def config(name, *r, &block)
128
- self.config_settings ||= []
129
- config_settings << name.to_sym
130
- dsl_accessor name, *r, &block
131
- self
132
- end
133
-
134
- # The lazy_config method configures a lazy-loaded configuration option
135
- # with a default value.
136
- #
137
- # This method registers a new configuration setting that will be
138
- # initialized lazily, meaning the default value or the set value is only
139
- # computed when the configuration is actually accessed. It adds the
140
- # setting to the list of configuration settings and creates a lazy
141
- # accessor for it.
142
- #
143
- # @param name [ Object ] the name of the configuration setting to define
144
- # @yield [ default ] optional block that provides the default value for
145
- # the configuration
146
- #
147
- # @return [ Object ] returns self to allow for method chaining
148
- def lazy_config(name, &default)
149
- self.config_settings ||= []
150
- config_settings << name.to_sym
151
- dsl_lazy_accessor(name, &default)
152
- self
153
- end
154
-
155
- # The config_settings method provides access to the configuration
156
- # settings.
157
- #
158
- # This method returns the configuration settings stored in the instance
159
- # variable, allowing for reading and modification of the object's
160
- # configuration state.
161
- #
162
- # @return [ Object ] the current configuration settings stored in the
163
- # instance variable
164
- attr_accessor :config_settings
165
- end
166
-
167
- # The initialize method sets up the instance by evaluating the provided
168
- # block in the instance's context.
169
- #
170
- # This method allows for dynamic configuration of the object by executing
171
- # the given block within the instance's scope, enabling flexible
172
- # initialization patterns.
173
- #
174
- # @param block [ Proc ] the block to be evaluated for instance setup
175
- def initialize(&block)
176
- block and instance_eval(&block)
177
- end
178
-
179
- # The to_ruby method generates a Ruby configuration block representation by
180
- # recursively processing the object's configuration settings and their
181
- # values.
182
- # It creates a nested structure with proper indentation and formatting
183
- # suitable for configuration files.
184
- #
185
- # @param depth [ Integer ] the current nesting depth for indentation purposes
186
- #
187
- # @return [ String ] a formatted Ruby string representing the configuration block
188
- def to_ruby(depth = 0)
189
- result = ''
190
- result << ' ' * 2 * depth <<
191
- "#{self.class.name[/::([^:]+)\z/, 1].underscore} do\n"
192
- for name in self.class.config_settings
193
- value = __send__(name)
194
- if value.respond_to?(:to_ruby)
195
- result << ' ' * 2 * (depth + 1) << value.to_ruby(depth + 1)
196
- else
197
- result << ' ' * 2 * (depth + 1) <<
198
- "#{name} #{Array(value).map(&:inspect) * ', '}\n"
199
- end
200
- end
201
- result << ' ' * 2 * depth << "end\n"
202
- end
203
- end
204
-
205
97
  # A configuration class for test execution settings.
206
98
  #
207
99
  # This class manages the configuration options related to running tests,
data/lib/utils/finder.rb CHANGED
@@ -19,6 +19,7 @@ require 'mize'
19
19
  class Utils::Finder
20
20
  include Tins::Find
21
21
  include Utils::Patterns
22
+ include Utils::XDG
22
23
  include Term::ANSIColor
23
24
 
24
25
  # The initialize method sets up the finder instance with the provided options.
@@ -91,7 +92,7 @@ class Utils::Finder
91
92
  end
92
93
  true
93
94
  }
94
- find(*@roots, visit: visit) do |filename|
95
+ find(*@roots, visit:) do |filename|
95
96
  filename.stat.directory? and filename << ?/
96
97
  paths << filename
97
98
  end
@@ -110,11 +111,8 @@ class Utils::Finder
110
111
  # @return [ String ] the full file path where finder results should be stored
111
112
  def index_path
112
113
  roots = @roots.map { |r| File.expand_path(r) }.uniq.sort
113
- filename = "finder-paths-" +
114
- Digest::MD5.new.update(roots.inspect).hexdigest
115
- dirname = File.join(Dir.tmpdir, File.basename($0))
116
- FileUtils.mkdir_p dirname
117
- File.join(dirname, filename)
114
+ filename = "finder-paths-" + Digest::MD5.new.update(roots.inspect).hexdigest
115
+ XDG_CACHE_HOME.sub_dir_path('utils') + filename
118
116
  end
119
117
 
120
118
  # The create_paths method generates and stores path information by building a
data/lib/utils/grepper.rb CHANGED
@@ -249,7 +249,7 @@ class Utils::Grepper
249
249
  if !s ||
250
250
  s.directory? && @config.search.prune?(bn) ||
251
251
  (s.file? || s.symlink?) && @config.search.skip?(bn) ||
252
- @args[?F] && s.symlink?
252
+ !@args[?F] && s.symlink?
253
253
  then
254
254
  @args[?v] and warn "Pruning #{filename.inspect}."
255
255
  prune
@@ -17,6 +17,8 @@ require 'fileutils'
17
17
  # client.store_snippet('puts "Hello World"')
18
18
  # result = server.eval_snippet('2 + 2')
19
19
  class Utils::IRB::IRBServer
20
+ include Utils::XDG
21
+
20
22
  # The initialize method sets up a new IRBServer instance with the specified
21
23
  # URL.
22
24
  #
@@ -172,10 +174,7 @@ class Utils::IRB::IRBServer
172
174
  # @return [ String ] the path to the log file that will be used for logging
173
175
  def setup_logger
174
176
  unless @log_out
175
- xdg_dir = File.expand_path(ENV.fetch('XDG_STATE_HOME', '~/.local/state'))
176
- log_path = Pathname.new(xdg_dir) + 'utils'
177
- FileUtils.mkdir_p log_path
178
- log_path += 'irb-server.log'
177
+ log_path = XDG_STATE_HOME.sub_dir_path('utils') + 'irb-server.log'
179
178
  @log_out = File.new(log_path, ?a)
180
179
  end
181
180
  @log_out.sync = true
data/lib/utils/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Utils
2
2
  # Utils version
3
- VERSION = '0.85.0'
3
+ VERSION = '0.87.0'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
data/lib/utils/xdg.rb ADDED
@@ -0,0 +1,165 @@
1
+ require 'pathname'
2
+ require 'fileutils'
3
+ require 'stringio'
4
+
5
+ # Module for handling XDG base directory specifications and application
6
+ # directory management.
7
+ #
8
+ # Provides constants and methods for working with XDG (Cross-Desktop Group)
9
+ # base directories including data home, configuration home, state home, and
10
+ # cache home directories.
11
+ #
12
+ # The module defines standard XDG directory paths and includes functionality
13
+ # for creating application-specific directories within these base locations.
14
+ #
15
+ # @example
16
+ # Utils::XDG::XDG_DATA_HOME # => Pathname object for the data home directory
17
+ # Utils::XDG::XDG_CONFIG_HOME # => Pathname object for the config home directory
18
+ # Utils::XDG::XDG_STATE_HOME # => Pathname object for the state home directory
19
+ # Utils::XDG::XDG_CACHE_HOME # => Pathname object for the cache home directory
20
+ module Utils::XDG
21
+ # A Pathname subclass that provides additional XDG directory functionality
22
+ #
23
+ # This class extends the standard Pathname class to include methods for
24
+ # working with XDG (Cross-Desktop Group) base directory specifications. It
25
+ # adds capabilities for creating subdirectories, reading files, and handling
26
+ # path operations within the context of XDG-compliant directory structures.
27
+ #
28
+ # @example
29
+ # pathname = XDGPathname.new('/home/user')
30
+ # sub_dir = pathname.sub_dir_path('documents')
31
+ # content = pathname.read('config.txt')
32
+ class XDGPathname < ::Pathname
33
+ # The sub_dir_path method creates a subdirectory path and ensures it exists
34
+ #
35
+ # This method takes a directory name, combines it with the current path to
36
+ # form a subdirectory path, and then checks if the path already exists. If
37
+ # the path exists but is not a directory, it raises an ArgumentError. If
38
+ # the path does not exist, it creates the directory structure using
39
+ # FileUtils.
40
+ #
41
+ # @param dirname [ String ] the name of the subdirectory to create or access
42
+ #
43
+ # @return [ Pathname ] the Pathname object representing the subdirectory path
44
+ #
45
+ # @raise [ ArgumentError ] if the path exists but is not a directory
46
+ def sub_dir_path(dirname)
47
+ path = self + dirname
48
+ if path.exist?
49
+ path.directory? or raise ArgumentError,
50
+ "path #{path.to_s.inspect} exists and is not a directory"
51
+ else
52
+ FileUtils.mkdir_p path
53
+ end
54
+ path
55
+ end
56
+
57
+ # The read method reads file contents or yields to a block for processing.
58
+ #
59
+ # This method attempts to read a file at the specified path, returning the
60
+ # file's contents as a string.
61
+ # If a block is provided, it opens the file and yields to the block with a
62
+ # File object.
63
+ # If the file does not exist and a default value is provided, it returns
64
+ # the default value.
65
+ # When a default value is provided along with a block, the block is invoked
66
+ # with a StringIO object containing the default value.
67
+ #
68
+ # @param path [ String ] the path to the file to read
69
+ # @param default [ String, nil ] the default value to return if the file
70
+ # does not exist
71
+ #
72
+ # @yield [ file ] optional block to process the file
73
+ # @yieldparam file [ File ] the file object for processing
74
+ #
75
+ # @return [ String, nil ] the file contents if no block is given, the
76
+ # result of the block if given, or the default value if the file does not
77
+ # exist
78
+ def read(path, default: nil, &block)
79
+ full_path = join(path)
80
+ if File.exist?(full_path)
81
+ if block
82
+ File.new(full_path, &block)
83
+ else
84
+ File.read(full_path, encoding: 'UTF-8')
85
+ end
86
+ else
87
+ if default && block
88
+ block.(StringIO.new(default))
89
+ else
90
+ default
91
+ end
92
+ end
93
+ end
94
+
95
+ %i[
96
+ join + dirname basename realpath expand_path cleanpath
97
+ relative_path_from
98
+ ].each do |id|
99
+ define_method(id) do |*args, **kw, &block|
100
+ self.class.new(super(*args, **kw, &block))
101
+ end
102
+ end
103
+
104
+ alias to_str to_s
105
+ end
106
+
107
+ # Module for handling XDG application directories.
108
+ #
109
+ # This module provides methods for creating and managing application-specific
110
+ # directories within the XDG base directories.
111
+ module AppDir
112
+ # Converts a path string to a XDGPathname object with expanded path
113
+ #
114
+ # @param path [String] The path to convert
115
+ # @return [XDGPathname] A path as XDGPathname
116
+ def self.pathify(path)
117
+ XDGPathname.new(path).expand_path
118
+ end
119
+ end
120
+
121
+ class << self
122
+ private
123
+
124
+ # Retrieves an environment variable value or returns a default.
125
+ #
126
+ # @param name [String] The name of the environment variable
127
+ # @param default [String] The default value if the environment variable is not set
128
+ # @return [String] The value of the environment variable or the default
129
+ def env_for(name, default:)
130
+ ENV.fetch(name, default)
131
+ end
132
+ end
133
+
134
+ # XDG Data Home directory path.
135
+ #
136
+ # This is the base directory relative to which user-specific data files should be stored.
137
+ # The default value is `~/.local/share`.
138
+ #
139
+ # @return [Pathname] The data home directory path
140
+ XDG_DATA_HOME = AppDir.pathify(env_for('XDG_DATA_HOME', default: '~/.local/share'))
141
+
142
+ # XDG Configuration Home directory path.
143
+ #
144
+ # This is the base directory relative to which user-specific configuration files should be stored.
145
+ # The default value is `~/.config`.
146
+ #
147
+ # @return [Pathname] The configuration home directory path
148
+ XDG_CONFIG_HOME = AppDir.pathify(env_for('XDG_CONFIG_HOME', default: '~/.config'))
149
+
150
+ # XDG State Home directory path.
151
+ #
152
+ # This is the base directory relative to which user-specific state files should be stored.
153
+ # The default value is `~/.local/state`.
154
+ #
155
+ # @return [Pathname] The state home directory path
156
+ XDG_STATE_HOME = AppDir.pathify(env_for('XDG_STATE_HOME', default: '~/.local/state'))
157
+
158
+ # XDG Cache Home directory path.
159
+ #
160
+ # This is the base directory relative to which user-specific non-essential cache files should be stored.
161
+ # The default value is `~/.cache`.
162
+ #
163
+ # @return [Pathname] The cache home directory path
164
+ XDG_CACHE_HOME = AppDir.pathify(env_for('XDG_CACHE_HOME', default: '~/.cache'))
165
+ end
data/lib/utils.rb CHANGED
@@ -10,6 +10,7 @@ module Utils
10
10
  require 'utils/version'
11
11
  require 'utils/md5'
12
12
  require 'utils/patterns'
13
+ require 'utils/xdg'
13
14
  require 'utils/config_file'
14
15
  require 'utils/editor'
15
16
  require 'utils/finder'
@@ -17,7 +18,6 @@ module Utils
17
18
  require 'utils/probe'
18
19
  require 'utils/ssh_tunnel_specification'
19
20
  require 'utils/line_blamer'
20
- require 'utils/config_dir'
21
21
 
22
22
  require 'utils/xt/source_location_extension'
23
23
  class ::Object
data/utils.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: utils 0.85.0 ruby lib
2
+ # stub: utils 0.87.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "utils".freeze
6
- s.version = "0.85.0".freeze
6
+ s.version = "0.87.0".freeze
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
@@ -12,12 +12,12 @@ Gem::Specification.new do |s|
12
12
  s.description = "This ruby gem provides some useful command line utilities".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.executables = ["ascii7".freeze, "blameline".freeze, "changes".freeze, "classify".freeze, "code_comment".freeze, "code_indexer".freeze, "commit_message".freeze, "discover".freeze, "edit".freeze, "edit_wait".freeze, "enum".freeze, "git-empty".freeze, "git-versions".freeze, "irb_client".freeze, "json_check".freeze, "long_lines".freeze, "myex".freeze, "on_change".freeze, "path".freeze, "print_method".freeze, "probe".freeze, "rainbow".freeze, "rd2md".freeze, "search".freeze, "sedit".freeze, "serve".freeze, "ssh-tunnel".freeze, "strip_spaces".freeze, "sync_dir".freeze, "untest".freeze, "utils-utilsrc".freeze, "vcf2alias".freeze, "yaml_check".freeze]
15
- s.extra_rdoc_files = ["README.md".freeze, "lib/utils.rb".freeze, "lib/utils/config_dir.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/irb_server.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe.rb".freeze, "lib/utils/probe/probe_client.rb".freeze, "lib/utils/probe/probe_server.rb".freeze, "lib/utils/probe/process_job.rb".freeze, "lib/utils/probe/server_handling.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze]
16
- s.files = ["Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ascii7".freeze, "bin/blameline".freeze, "bin/changes".freeze, "bin/classify".freeze, "bin/code_comment".freeze, "bin/code_indexer".freeze, "bin/commit_message".freeze, "bin/discover".freeze, "bin/edit".freeze, "bin/edit_wait".freeze, "bin/enum".freeze, "bin/git-empty".freeze, "bin/git-versions".freeze, "bin/irb_client".freeze, "bin/json_check".freeze, "bin/long_lines".freeze, "bin/myex".freeze, "bin/on_change".freeze, "bin/path".freeze, "bin/print_method".freeze, "bin/probe".freeze, "bin/rainbow".freeze, "bin/rd2md".freeze, "bin/search".freeze, "bin/sedit".freeze, "bin/serve".freeze, "bin/ssh-tunnel".freeze, "bin/strip_spaces".freeze, "bin/sync_dir".freeze, "bin/untest".freeze, "bin/utils-utilsrc".freeze, "bin/vcf2alias".freeze, "bin/yaml_check".freeze, "lib/utils.rb".freeze, "lib/utils/config_dir.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/irb_server.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe.rb".freeze, "lib/utils/probe/probe_client.rb".freeze, "lib/utils/probe/probe_server.rb".freeze, "lib/utils/probe/process_job.rb".freeze, "lib/utils/probe/server_handling.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze, "tests/test_helper.rb".freeze, "tests/utils_test.rb".freeze, "utils.gemspec".freeze]
15
+ s.extra_rdoc_files = ["README.md".freeze, "lib/utils.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/config_file/block_config.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/irb_server.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe.rb".freeze, "lib/utils/probe/probe_client.rb".freeze, "lib/utils/probe/probe_server.rb".freeze, "lib/utils/probe/process_job.rb".freeze, "lib/utils/probe/server_handling.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xdg.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze]
16
+ s.files = ["Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ascii7".freeze, "bin/blameline".freeze, "bin/changes".freeze, "bin/classify".freeze, "bin/code_comment".freeze, "bin/code_indexer".freeze, "bin/commit_message".freeze, "bin/discover".freeze, "bin/edit".freeze, "bin/edit_wait".freeze, "bin/enum".freeze, "bin/git-empty".freeze, "bin/git-versions".freeze, "bin/irb_client".freeze, "bin/json_check".freeze, "bin/long_lines".freeze, "bin/myex".freeze, "bin/on_change".freeze, "bin/path".freeze, "bin/print_method".freeze, "bin/probe".freeze, "bin/rainbow".freeze, "bin/rd2md".freeze, "bin/search".freeze, "bin/sedit".freeze, "bin/serve".freeze, "bin/ssh-tunnel".freeze, "bin/strip_spaces".freeze, "bin/sync_dir".freeze, "bin/untest".freeze, "bin/utils-utilsrc".freeze, "bin/vcf2alias".freeze, "bin/yaml_check".freeze, "lib/utils.rb".freeze, "lib/utils/config_file.rb".freeze, "lib/utils/config_file/block_config.rb".freeze, "lib/utils/editor.rb".freeze, "lib/utils/finder.rb".freeze, "lib/utils/grepper.rb".freeze, "lib/utils/irb.rb".freeze, "lib/utils/irb/irb_server.rb".freeze, "lib/utils/line_blamer.rb".freeze, "lib/utils/line_formatter.rb".freeze, "lib/utils/md5.rb".freeze, "lib/utils/patterns.rb".freeze, "lib/utils/probe.rb".freeze, "lib/utils/probe/probe_client.rb".freeze, "lib/utils/probe/probe_server.rb".freeze, "lib/utils/probe/process_job.rb".freeze, "lib/utils/probe/server_handling.rb".freeze, "lib/utils/ssh_tunnel_specification.rb".freeze, "lib/utils/version.rb".freeze, "lib/utils/xdg.rb".freeze, "lib/utils/xt/source_location_extension.rb".freeze, "tests/test_helper.rb".freeze, "tests/utils_test.rb".freeze, "utils.gemspec".freeze]
17
17
  s.homepage = "http://github.com/flori/utils".freeze
18
18
  s.licenses = ["GPL-2.0".freeze]
19
19
  s.rdoc_options = ["--title".freeze, "Utils - Some useful command line utilities".freeze, "--main".freeze, "README.md".freeze]
20
- s.rubygems_version = "4.0.2".freeze
20
+ s.rubygems_version = "4.0.3".freeze
21
21
  s.summary = "Some useful command line utilities".freeze
22
22
  s.test_files = ["tests/test_helper.rb".freeze, "tests/utils_test.rb".freeze]
23
23
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.85.0
4
+ version: 0.87.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
@@ -315,8 +315,8 @@ extensions: []
315
315
  extra_rdoc_files:
316
316
  - README.md
317
317
  - lib/utils.rb
318
- - lib/utils/config_dir.rb
319
318
  - lib/utils/config_file.rb
319
+ - lib/utils/config_file/block_config.rb
320
320
  - lib/utils/editor.rb
321
321
  - lib/utils/finder.rb
322
322
  - lib/utils/grepper.rb
@@ -333,6 +333,7 @@ extra_rdoc_files:
333
333
  - lib/utils/probe/server_handling.rb
334
334
  - lib/utils/ssh_tunnel_specification.rb
335
335
  - lib/utils/version.rb
336
+ - lib/utils/xdg.rb
336
337
  - lib/utils/xt/source_location_extension.rb
337
338
  files:
338
339
  - Gemfile
@@ -373,8 +374,8 @@ files:
373
374
  - bin/vcf2alias
374
375
  - bin/yaml_check
375
376
  - lib/utils.rb
376
- - lib/utils/config_dir.rb
377
377
  - lib/utils/config_file.rb
378
+ - lib/utils/config_file/block_config.rb
378
379
  - lib/utils/editor.rb
379
380
  - lib/utils/finder.rb
380
381
  - lib/utils/grepper.rb
@@ -391,6 +392,7 @@ files:
391
392
  - lib/utils/probe/server_handling.rb
392
393
  - lib/utils/ssh_tunnel_specification.rb
393
394
  - lib/utils/version.rb
395
+ - lib/utils/xdg.rb
394
396
  - lib/utils/xt/source_location_extension.rb
395
397
  - tests/test_helper.rb
396
398
  - tests/utils_test.rb
@@ -417,7 +419,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
417
419
  - !ruby/object:Gem::Version
418
420
  version: '0'
419
421
  requirements: []
420
- rubygems_version: 4.0.2
422
+ rubygems_version: 4.0.3
421
423
  specification_version: 4
422
424
  summary: Some useful command line utilities
423
425
  test_files:
@@ -1,128 +0,0 @@
1
- require 'pathname'
2
- require 'stringio'
3
-
4
- module Utils
5
- # A configuration directory manager that handles path resolution and file
6
- # operations within a specified directory structure.
7
- #
8
- # This class provides functionality for managing configuration directories by
9
- # deriving paths based on a root directory and name, and offering methods to
10
- # read files with optional default values and block handling. It supports
11
- # environment variable-based root path resolution and uses Pathname for
12
- # robust path manipulation.
13
- #
14
- # @example
15
- # config_dir = Utils::ConfigDir.new('myapp')
16
- # config_dir.to_s # => returns the string representation of the configuration directory path
17
- # config_dir.join('config.txt') # => returns a Pathname object for the joined path
18
- # config_dir.read('settings.rb') # => reads and returns the content of 'settings.rb' or nil if not found
19
- # config_dir.read('missing.txt', default: 'default content') # => returns 'default content' if file is missing
20
- class ConfigDir
21
- # Initializes a new ConfigDir instance with the specified name and optional
22
- # root path or environment variable.
23
- #
24
- # @param name [ String ] the name of the directory to be used
25
- # @param root_path [ String, nil ] the root path to use; if nil, the
26
- # default root path is used
27
- # @param env_var [ String, nil ] the name of the environment variable to
28
- # check for the root path
29
- def initialize(name, root_path: nil, env_var: nil)
30
- root_path ||= env_var_path(env_var)
31
- @directory_path = derive_directory_path(name, root_path)
32
- end
33
-
34
- # Returns the string representation of the configuration directory path.
35
- #
36
- # @return [ String ] the path of the configuration directory as a string
37
- def to_s
38
- @directory_path.to_s
39
- end
40
-
41
- # Joins the directory path with the given path and returns the combined
42
- # result.
43
- #
44
- # @param path [ String ] the path to be joined with the directory path
45
- #
46
- # @return [ Pathname ] the combined path as a Pathname object
47
- def join(path)
48
- @directory_path + path
49
- end
50
- alias + join
51
-
52
- # Reads the content of a file at the given path within the configuration
53
- # directory.
54
- #
55
- # If the file exists, it returns the file's content as a string encoded in
56
- # UTF-8. If a block is given and the file exists, it opens the file and
57
- # yields to the block.
58
- # If the file does not exist and a default value is provided, it returns
59
- # the default. If a block is given and the file does not exist, it yields a
60
- # StringIO object containing
61
- # the default value to the block.
62
- #
63
- # @param path [ String ] the path to the file relative to the configuration
64
- # directory
65
- # @param default [ String, nil ] the default value to return if the file
66
- # does not exist
67
- #
68
- # @yield [ io ]
69
- #
70
- # @return [ String, nil ] the content of the file or the default value if
71
- # the file does not exist
72
- def read(path, default: nil, &block)
73
- full_path = join(path)
74
- if File.exist?(full_path)
75
- if block
76
- File.new(full_path, &block)
77
- else
78
- File.read(full_path, encoding: 'UTF-8')
79
- end
80
- else
81
- if default && block
82
- block.(StringIO.new(default))
83
- else
84
- default
85
- end
86
- end
87
- end
88
-
89
- private
90
-
91
- # Derives the full directory path by combining the root path and the given
92
- # name.
93
- #
94
- # @param name [ String ] the name of the directory to be appended to the root path
95
- # @param root_path [ String, nil ] the root path to use; if nil, the default root path is used
96
- #
97
- # @return [ Pathname ] the combined directory path as a Pathname object
98
- def derive_directory_path(name, root_path)
99
- root = if path = root_path
100
- Pathname.new(path)
101
- else
102
- Pathname.new(default_root_path)
103
- end
104
- root + name
105
- end
106
-
107
- # Returns the environment variable path if it is set and not empty.
108
- #
109
- # @param env_var [ String ] the name of the environment variable to check
110
- # @return [ String, nil ] the value of the environment variable if it
111
- # exists and is not empty, otherwise nil
112
- def env_var_path(env_var)
113
- env_var.full? { ENV[it].full? }
114
- end
115
-
116
- # Returns the default configuration directory path based on the HOME
117
- # environment variable.
118
- #
119
- # This method constructs and returns a Pathname object pointing to the
120
- # standard configuration directory location, which is typically
121
- # $HOME/.config.
122
- #
123
- # @return [ Pathname ] the default configuration directory path
124
- def default_root_path
125
- Pathname.new(ENV.fetch('HOME') + '.config')
126
- end
127
- end
128
- end