user_config 0.0.3 → 0.0.4

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.
data/README.md CHANGED
@@ -4,18 +4,38 @@ user_config is a library to manage configuration files in user's home directory
4
4
  for ruby libraries or applications.
5
5
  The format of a configuration file is yaml.
6
6
 
7
+ ## Behavior
8
+
9
+ The class UserConfig manages values of configuration,
10
+ which is handled as a set of hashes and is saved to yaml files
11
+ in specified directory under user's home directory.
12
+
7
13
  ## Examples
8
14
 
9
- ### Create configuration files
15
+ ### Simple usage
16
+
17
+ uconf = UserConfig.new(".some_config")
18
+
19
+ The directory ~/.some\_config is created in the directory ENV['HOME'].
20
+ To set the value "world" for the key "hello" of ~/.some\_config/file.yaml,
21
+
22
+ uconf["file.yaml"]["hello"] = "world"
23
+
24
+ The value is not saved to the file. To do that,
25
+
26
+ uconf["file.yaml"].save
10
27
 
11
- The directory '.some_config' is created in the directory ENV['HOME'].
12
- And then we save values to the file 'conf.yaml' in the directory.
28
+ ### Create initial configuration files
29
+
30
+ If we want to create initial files with default values,
31
+ we use the method UserConfig#default.
13
32
 
14
33
  UserConfig.default('conf.yaml', { 'key1' => 'val1', 'key2' => 'val2' })
15
34
  uconf = UserConfig.new('.some_config')
16
35
  uconf.create('conf.yaml')
17
36
 
18
- Similarly, we can create a file 'conf2.yaml'.
37
+ The file ~/.some_config'/confi.yaml is created.
38
+ To create another file 'conf2.yaml',
19
39
 
20
40
  UserConfig.default('conf2.yaml', { 'hello' => 'world'})
21
41
  uconf.create('conf2.yaml')
@@ -45,6 +65,17 @@ If we modify some files, we can save all files by UserConfig#save_all.
45
65
  yaml2['new_key'] = 'ABCDE'
46
66
  uconf.save_all
47
67
 
68
+ ### Behavior like a hash
69
+
70
+ In internal of UserConfig::YAMLFile, the methods of Hash is called except for some methods.
71
+
72
+ uconf = UserConfig.new('.some_config')
73
+ yaml = uconf['conf.yaml']
74
+ yaml.each do |key, val|
75
+ ...
76
+ end
77
+ yaml.empty?
78
+
48
79
  ## Contributing to user_config
49
80
 
50
81
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
@@ -7,6 +7,8 @@ class UserConfig
7
7
  class DirectoryExistenceError < StandardError
8
8
  end
9
9
 
10
+ # Get default value of current class.
11
+ # The value is a hash, of which keys are paths of yaml files.
10
12
  def self.default_value
11
13
  unless @default_value
12
14
  @default_value = {}
@@ -14,18 +16,21 @@ class UserConfig
14
16
  @default_value
15
17
  end
16
18
 
19
+ # Set default values of the specified file of current class.
20
+ # @param [String] path Relative path of the specified yaml file
21
+ # @param [Hash] default_hash Default values
17
22
  def self.default(path, default_hash)
18
23
  self.default_value[path] = default_hash
19
24
  end
20
25
 
21
26
  attr_reader :directory
22
27
 
23
- # +directory_name+ is a name of a configuration directory.
24
- # opts[:home] is root directory, of which default value is ENV['HOME'].
25
- # opts[:permission] is a file permission of the configuration directory,
26
- # of which default value is 0700.
27
- # If opts[:new_directory] is true and the directory exists
28
- # then an error raises.
28
+ # @param [String] directory_name :name of a configuration directory.
29
+ # @option opts [String] :home Root directory, of which default value is ENV['HOME'].
30
+ # @option opts [Integer] :permission A file permission of the configuration directory,
31
+ # of which default value is 0700.
32
+ # @option opts [boolean] :new_directory
33
+ # If opts[:new_directory] is true and the directory exists then an error raises.
29
34
  def initialize(directory_name, opts = {})
30
35
  @directory = File.expand_path(File.join(opts[:home] || ENV['HOME'], directory_name))
31
36
  @file = {}
@@ -39,6 +44,9 @@ class UserConfig
39
44
  end
40
45
  end
41
46
 
47
+ # @param [String] path Relative path of a specified file
48
+ # @param [boolean] create_directory If the value is true then we create parent directories recursively.
49
+ # @return [String] An absolute path of a specified file
42
50
  def file_path(path, create_directory = nil)
43
51
  if Pathname(path).absolute?
44
52
  raise ArgumentError, "Path '#{path}' is absolute."
@@ -60,14 +68,18 @@ class UserConfig
60
68
  end
61
69
  private :load_file
62
70
 
63
- # Save the configuration file of +path+.
64
- # If we set a hash to +value+ then its value is saved to the new configuration file.
71
+ # Save the configuration file under the directory.
72
+ # @param [String] path Relative path of target file
73
+ # @param [Hash] value Values to be saved to the file
65
74
  def create(path, value = nil)
66
75
  yaml_file = load_file(path, true, value)
67
76
  yaml_file.save
68
77
  end
69
78
 
70
79
  # Make directory under the configuration directory.
80
+ # @param [String] path Relative path of a directory
81
+ # @param [Hash] opts Options
82
+ # @option opts [Integer] :mode Permission for a directory to be created
71
83
  def make_directory(path, opts = {})
72
84
  fpath = file_path(path)
73
85
  unless File.exist?(fpath)
@@ -79,7 +91,9 @@ class UserConfig
79
91
  fpath
80
92
  end
81
93
 
82
- # Load the configuration file of +path+.
94
+ # Load the configuration file.
95
+ # @param [String] path Relative path of a file to be loaded
96
+ # @return [hash]
83
97
  def load(path)
84
98
  @file[path] || load_file(path)
85
99
  end
@@ -116,8 +130,10 @@ class UserConfig
116
130
  end
117
131
  end
118
132
 
119
- # List files in directory +dir+.
120
- # If opts[:absolute] is true, return an array of absolute paths.
133
+ # List files in the specified directory.
134
+ # @param [String] dir A directory in which you want to list files.
135
+ # @param [Hash] opts Options
136
+ # @option opts [boolean] :absolute If the value is true then we get an array of absolute paths.
121
137
  def list_in_directory(dir, opts = {})
122
138
  fpath = file_path(dir)
123
139
  if File.directory?(fpath)
@@ -135,7 +151,9 @@ class UserConfig
135
151
  end
136
152
  end
137
153
 
138
- # Open file of +path+ with +mode+.
154
+ # Open a file.
155
+ # @param [String] path A path of the file
156
+ # @param [String] mode A mode
139
157
  def open(path, mode, &block)
140
158
  full_path = file_path(path, true)
141
159
  f = Kernel.open(full_path, mode)
@@ -151,7 +169,9 @@ class UserConfig
151
169
  end
152
170
  end
153
171
 
154
- # Read file of +path+ and return a string.
172
+ # Read a file
173
+ # @param [String] path A relative path of a file
174
+ # @return [String] Strings of the file
155
175
  def read(path)
156
176
  fpath = file_path(path)
157
177
  if File.exist?(fpath)
@@ -164,33 +184,40 @@ class UserConfig
164
184
  class YAMLFile
165
185
  attr_reader :path
166
186
 
167
- # +path+ is path of yaml file, which saves pairs of key and value.
168
- # +default+ is a hash saving default value.
169
- # if +opts[:merge]+ is true then values of an instance are merged with default values.
187
+ # @param [String] path A path of yaml file, which saves pairs of key and value.
188
+ # @param [Hash] default A hash saving default value.
189
+ # @param [Hash] opts Options
190
+ # @option opts [booean] If the value is true then values of an instance are merged with default values.
170
191
  def initialize(path, default, opts = {})
171
192
  @path = path
172
193
  @default = default
173
- @cache = load
194
+ @cache = load_yaml_file
174
195
  if opts[:merge]
175
196
  @cache.merge!(@default)
176
197
  end
177
198
  end
178
199
 
179
- def load
200
+ def load_yaml_file
180
201
  if File.exist?(path)
181
202
  YAML.load_file(path)
182
203
  else
183
204
  {}
184
205
  end
185
206
  end
186
- private :load
207
+ private :load_yaml_file
187
208
 
188
209
  def to_yaml
189
210
  YAML.dump(@cache)
190
211
  end
191
212
 
192
- def to_hash
193
- @cache
213
+ # @param [boolean] merge If the value is true then we merges default values and cached values.
214
+ # @return [Hash] A hash created by merging default values and cached values.
215
+ def to_hash(merge = false)
216
+ if merge
217
+ @default.merge(@cache)
218
+ else
219
+ @cache
220
+ end
194
221
  end
195
222
 
196
223
  # Save cached values to the path of file.
@@ -218,5 +245,13 @@ class UserConfig
218
245
  def set?(key)
219
246
  @cache.has_key?(key)
220
247
  end
248
+
249
+ def method_missing(method_name, *args, &block)
250
+ if Hash.method_defined?(method_name)
251
+ to_hash(true).__send__(method_name, *args, &block)
252
+ else
253
+ super
254
+ end
255
+ end
221
256
  end
222
257
  end
@@ -1,3 +1,3 @@
1
1
  class UserConfig
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -202,6 +202,21 @@ describe UserConfig do
202
202
  UserConfig.default_value.object_id.should_not == UserConfigCustom.default_value.object_id
203
203
  end
204
204
 
205
+ context "when calling methods of Hash" do
206
+ before(:all) do
207
+ UserConfig.default("to_test_hash", { :a => "A", :b => "B" })
208
+ end
209
+
210
+ it "should be empty." do
211
+ subject["empty_conf"].empty?.should be_true
212
+ end
213
+
214
+ it "should return merged hash" do
215
+ subject["to_test_hash"][:b] = "BBB"
216
+ subject["to_test_hash"].to_hash(true).should == { :a => "A", :b => "BBB" }
217
+ end
218
+ end
219
+
205
220
  after(:all) do
206
221
  FileUtils.rm_r(@home)
207
222
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: user_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-29 00:00:00.000000000 Z
12
+ date: 2012-01-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &19641620 !ruby/object:Gem::Requirement
16
+ requirement: &11654660 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *19641620
24
+ version_requirements: *11654660
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: yard
27
- requirement: &19641160 !ruby/object:Gem::Requirement
27
+ requirement: &11654240 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *19641160
35
+ version_requirements: *11654240
36
36
  description: The library creates, saves, and loads configuration files, which are
37
37
  in a user's home directory or a specified directory.
38
38
  email:
@@ -48,7 +48,6 @@ files:
48
48
  - LICENSE.txt
49
49
  - README.md
50
50
  - Rakefile
51
- - VERSION
52
51
  - lib/user_config.rb
53
52
  - lib/user_config/version.rb
54
53
  - spec/spec_helper.rb
@@ -76,8 +75,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
75
  version: '0'
77
76
  requirements: []
78
77
  rubyforge_project: user_config
79
- rubygems_version: 1.8.5
78
+ rubygems_version: 1.8.10
80
79
  signing_key:
81
80
  specification_version: 3
82
81
  summary: Management of configuration files in a user's home directory
83
82
  test_files: []
83
+ has_rdoc:
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.2