fuguta 1.0.3 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa160adc045cc3b478250bc25843f1be1142c9ec
4
- data.tar.gz: f407c1da6ea79a0da7c4fe2782a6351c4b4ec548
3
+ metadata.gz: 2ce06a414af76fbb7237b3cc66001ed726b3e466
4
+ data.tar.gz: 102c6d2aad85b6d62ce59bc0decc43eda85a67be
5
5
  SHA512:
6
- metadata.gz: 222aeb80be0857eaf55762bfe91e06ac613f5600c63b824ead1dae8594771682b9aec45c2409d396656fad7a261780e40de3abbc5a3eeafd23cf5d454bf96dd1
7
- data.tar.gz: 84edc10c6abb6312627c796f3fa3d7c01953f3b4b6d88f0766c9ceaa84805e78ee6be19715cd936dc14718f5884be56804a4e7dd6519b2089cb5080725db1532
6
+ metadata.gz: 41d0b8df4582f1da011f2454d7b3378555780b8c67bd9cc6a94383e0ac78de049c01d33644ed9b142ea1b59fc5ada83ee35eb4b6e6ffabdf6cc6e12657e1aa7d
7
+ data.tar.gz: 807eb8d86ea21ce3118602bcf9d44a4e531a6f6d538b5e4091ae0c5b9ae8ca741806081a88cde928196072477bd8abca2ba52606d2971c26a9e790dfcd89515a
@@ -2,6 +2,7 @@ script: bundle exec rspec
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.2
5
6
  - ruby-head
6
7
 
7
8
  matrix:
@@ -1,16 +1,50 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Fuguta
4
+ class ValidationError < StandardError
5
+ attr_reader :errors
6
+ def initialize(errors)
7
+ super("validation error")
8
+ @errors = errors
9
+ end
10
+ end
11
+
12
+ class SyntaxError < StandardError
13
+ # self.cause() is as of Ruby 2.1 so we
14
+ # handles root error .
15
+ attr_reader :root_cause, :source
16
+
17
+ def initialize(root_cause, source="")
18
+ super("Syntax Error")
19
+ raise ArgumentError, 'root_cause' unless root_cause.is_a?(::Exception)
20
+ @root_cause = root_cause
21
+ @source = source
22
+ end
23
+
24
+ def message
25
+ if @root_cause.backtrace.first =~ /:(\d+):in `/ ||
26
+ @root_cause.backtrace.first =~ /:(\d+)$/
27
+ line = $1.to_i
28
+ end
29
+ "%s from %s:%d" % [super(), @source, line]
30
+ end
31
+ end
32
+
4
33
  class Configuration
34
+ ValidationError = Fuguta::ValidationError
5
35
 
6
- class ValidationError < StandardError
7
- attr_reader :errors
8
- def initialize(errors)
9
- super("validation error")
10
- @errors = errors
36
+ def self.usual_paths(paths = nil)
37
+ if paths
38
+ @usual_paths = paths
39
+ else
40
+ @usual_paths
11
41
  end
12
42
  end
13
43
 
44
+ def usual_paths
45
+ self.class.usual_paths
46
+ end
47
+
14
48
  def self.walk_tree(conf, &blk)
15
49
  raise ArgumentError, "conf must be a 'Configuration'. Got '#{conf.class}'." unless conf.is_a?(Configuration)
16
50
 
@@ -32,14 +66,20 @@ module Fuguta
32
66
  @conf = conf
33
67
  end
34
68
 
35
- def load(path)
36
- buf = String.new
37
- case path
69
+ def load(path = nil)
70
+ buf = case path
71
+ when NilClass
72
+ raise "No path given and usual_paths not set" unless @conf.usual_paths
73
+
74
+ path = @conf.usual_paths.find { |path| File.exists?(path) } ||
75
+ raise("None of the usual paths existed: #{@conf.usual_paths.join(", ")}")
76
+
77
+ File.read(path)
38
78
  when String
39
79
  raise "does not exist: #{path}" unless File.exists?(path)
40
- buf = File.read(path)
80
+ File.read(path)
41
81
  when IO
42
- path.lines.each { |l| buf += l }
82
+ path.lines.join
43
83
  else
44
84
  raise "Unknown type: #{path.class}"
45
85
  end
@@ -92,7 +132,7 @@ module Fuguta
92
132
  l.load(File.expand_path(path, base_conf_dir))
93
133
  end
94
134
  }
95
-
135
+
96
136
  self
97
137
  end
98
138
  end
@@ -224,7 +264,7 @@ module Fuguta
224
264
  end
225
265
  }
226
266
  end
227
-
267
+
228
268
  def alias_param (alias_name, ref_name)
229
269
  # getter
230
270
  self.class_eval %Q{
@@ -295,9 +335,12 @@ module Fuguta
295
335
 
296
336
  l = Loader.new(c)
297
337
 
298
- paths.each { |path|
299
- l.load(path)
300
- }
338
+ if paths.empty?
339
+ l.load
340
+ else
341
+ paths.each { |path| l.load(path) }
342
+ end
343
+
301
344
  l.validate
302
345
 
303
346
  c
@@ -380,6 +423,8 @@ module Fuguta
380
423
  def validate(errors)
381
424
  end
382
425
 
426
+ SYNTAX_ERROR_SOURCES=[ScriptError, NameError].freeze
427
+
383
428
  def parse_dsl(&blk)
384
429
  dsl = self.class.const_get(:DSL, false)
385
430
  raise "DSL module was not found" unless dsl && dsl.is_a?(Module)
@@ -388,7 +433,11 @@ module Fuguta
388
433
  cp_class.__send__(:include, dsl)
389
434
  cp = cp_class.new(self)
390
435
 
391
- cp.instance_eval(&blk)
436
+ begin
437
+ cp.instance_eval(&blk)
438
+ rescue *SYNTAX_ERROR_SOURCES => e
439
+ raise Fuguta::SyntaxError.new(e, cp.instance_variable_get(:@loading_path))
440
+ end
392
441
 
393
442
  self
394
443
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Fuguta
3
- VERSION='1.0.3'
3
+ VERSION='1.0.4'
4
4
  end
@@ -0,0 +1,3 @@
1
+ param1 1
2
+ param2 1
3
+ param3 1
@@ -15,23 +15,64 @@ describe Fuguta::Configuration do
15
15
  end
16
16
  end
17
17
  end
18
-
19
- it "loads conf file" do
20
- conf = Test1.load(File.expand_path('../test1.conf', __FILE__))
21
- expect(conf.param1).to eq(1)
22
- expect(conf.param2).to eq(2)
23
- end
24
18
 
25
- it "loads multiple conf files" do
26
- conf = Test1.load(File.expand_path('../test1.conf', __FILE__), File.expand_path('../test2.conf', __FILE__))
27
- expect(conf.param1).to eq(10)
28
- expect(conf.param2).to eq(20)
19
+ class UsualPathTest < Test1
20
+ usual_paths([ "../test1.conf", "../conf_files/test1.conf" ].map do |path|
21
+ File.expand_path(path, __FILE__)
22
+ end)
29
23
  end
30
24
 
31
- it "allows nested imports/loads" do
32
- conf = NestTest1.load(File.expand_path('../nest-test1.conf', __FILE__))
33
- expect(conf.param1).to eq(10)
34
- expect(conf.param2).to eq(20)
35
- expect(conf.param3).to eq(30)
25
+ describe "#load" do
26
+ let(:conf_path) { File.expand_path('../conf_files', __FILE__) }
27
+
28
+ it "allows nested imports/loads" do
29
+ conf = NestTest1.load("#{conf_path}/nest-test1.conf")
30
+ expect(conf.param1).to eq(10)
31
+ expect(conf.param2).to eq(20)
32
+ expect(conf.param3).to eq(30)
33
+ end
34
+
35
+ context "with a single path (string) parameter" do
36
+ it "loads conf file from that path" do
37
+ conf = Test1.load("#{conf_path}/test1.conf")
38
+ expect(conf.param1).to eq(1)
39
+ expect(conf.param2).to eq(2)
40
+ end
41
+ end
42
+
43
+ context "with multiple paths passed as parameters" do
44
+ it "the config files override each other" do
45
+ conf = Test1.load("#{conf_path}/test1.conf", "#{conf_path}/test2.conf")
46
+ expect(conf.param1).to eq(10)
47
+ expect(conf.param2).to eq(20)
48
+ end
49
+ end
50
+
51
+ context "with no arguments" do
52
+ context "when usual_paths is set" do
53
+ it "loads configurations from the first existing path set in usual_paths" do
54
+ conf = UsualPathTest.load
55
+ expect(conf.param1).to eq(1)
56
+ expect(conf.param2).to eq(2)
57
+ end
58
+ end
59
+
60
+ context "when usual_paths is not set" do
61
+ it "raises an error" do
62
+ expect { Test1.load }.to raise_error(
63
+ RuntimeError,
64
+ "No path given and usual_paths not set"
65
+ )
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'when loading a config file with a faulty syntax' do
71
+ it "throws syntax error" do
72
+ expect {
73
+ Test1.load("#{conf_path}/syntax-error.conf")
74
+ }.to raise_error(Fuguta::SyntaxError)
75
+ end
76
+ end
36
77
  end
37
78
  end
@@ -8,4 +8,6 @@ require 'rspec'
8
8
  require 'fuguta'
9
9
 
10
10
  RSpec.configure do |config|
11
+ config.formatter = :documentation
12
+ config.color = true
11
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fuguta
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Axsh co. LTD
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-28 00:00:00.000000000 Z
11
+ date: 2014-08-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A configuration framework for Ruby programs
14
14
  email:
@@ -24,11 +24,12 @@ files:
24
24
  - fuguta.gemspec
25
25
  - lib/fuguta.rb
26
26
  - lib/fuguta/version.rb
27
+ - spec/conf_files/nest-test1.conf
28
+ - spec/conf_files/syntax-error.conf
29
+ - spec/conf_files/test1.conf
30
+ - spec/conf_files/test2.conf
27
31
  - spec/configuration_spec.rb
28
- - spec/nest-test1.conf
29
32
  - spec/spec_helper.rb
30
- - spec/test1.conf
31
- - spec/test2.conf
32
33
  homepage: https://github.com/axsh/fuguta
33
34
  licenses:
34
35
  - LGPLv3