egi 0.0.2 → 0.0.3

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/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ruby-head
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.0.3
4
+ * ENHANCEMENT
5
+ * EGI.env loads Egi.config_file, ./egi.conf, or /etc/egi.conf
6
+ * you can set default to env and group
7
+
3
8
  ## 0.0.2
4
9
  * ENHANCEMENT
5
10
  * CAP_ENV to set environment and get by Egi.env
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # egi
1
+ # egi [![Build Status](https://secure.travis-ci.org/okitan/egi.png)](http://travis-ci.org/okitan/egi)
2
+
3
+ tested in ruby 1.8.7, 1.9.2, 1.9.3, and head
2
4
 
3
5
  ## About egi
4
6
  environment, group, and item
@@ -7,6 +9,9 @@ environment, group, and item
7
9
 
8
10
  % cat egi.conf
9
11
  env(:development) {
12
+ item :vhost0301, { :tags => [ :mysqld, :rails ] }
13
+ }
14
+ env(:production) {
10
15
  group(:mysqld) {
11
16
  item :vhost0421, { :tags => [ :master ] }
12
17
  item :vhost0422
@@ -15,7 +20,7 @@ environment, group, and item
15
20
  # you can define item without group
16
21
  item :vhost0423, { :tags => [ :rails ] }
17
22
  }
18
- % EGI_ENV=egi irb
23
+ % EGI_ENV=production irb
19
24
  > require 'egi'
20
25
  > # find by group or tag
21
26
  > Egi.env.mysqld #=> [ { :name => :vhost0421, :tags => [ :mysqld, :master ] },
@@ -24,19 +29,41 @@ environment, group, and item
24
29
  > Egi.env.master #=> [ { :name => :vhost0421, :tags => [ :mysqld, :master ] } ]
25
30
  > # fetch by name
26
31
  > Egi.env.vhost0423 #=> { :name => :vhost0423, :tags => [ :rails ]},
27
-
32
+ % EGI_ENV=development irb
33
+ > require 'egi'
34
+ > Egi.env.mysqld #=> [ { :name => :vhost0301, :tags => [ :mysqld, :rails ] } ]
35
+ # can not fetch other envs
36
+ > Egi.env.vhost0421 #=> nil
28
37
 
29
38
  ## Syntax
30
39
 
31
40
  ### env
32
- T.B.D
41
+ env(name, &block)
42
+ * name
43
+ * the name of env
44
+ * &block
45
+ * to define item
33
46
 
34
47
  ### group
35
- not yet implemented
48
+ tag to the member of the group.
49
+
50
+ group(name, &block)
51
+ * name
52
+ * the name of group
53
+ * tagged to the member of the group
54
+ * &block
55
+ * to define item for the member of the group
36
56
 
37
57
  ### item
38
- T.B.D
58
+ item(name, hash)
59
+ * name
60
+ * the name of item
61
+ * if defined the same name, hash will be merged
62
+ * hash
63
+ * the property of item
64
+ * :tags
65
+ * you can search by tags
39
66
 
40
67
  ## Aliases
41
68
 
42
- T.B.D
69
+ not yet implemented
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core'
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec) do |spec|
6
+ spec.pattern = FileList['spec/**/*_spec.rb']
7
+ end
8
+
9
+ task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
data/egi.gemspec CHANGED
@@ -19,8 +19,9 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  # specify any dependencies here; for example:
22
- [ [ 'rspec' ],
23
- [ 'autowatchr' ]
22
+ [ [ 'rake' ],
23
+ [ 'rspec' ],
24
+ [ 'autowatchr' ],
24
25
  ].each do |gem, version|
25
26
  s.add_development_dependency gem, version
26
27
  end
data/lib/egi/env.rb CHANGED
@@ -1,7 +1,12 @@
1
1
  module Egi
2
2
  class Env
3
3
  def initialize(name)
4
- @name = name
4
+ @name = name
5
+ @default = {}
6
+ end
7
+
8
+ def set(default = {})
9
+ @default = default
5
10
  end
6
11
 
7
12
  def merge!(other)
@@ -15,10 +20,10 @@ module Egi
15
20
  end
16
21
 
17
22
  def items
18
- @items ||= Hash.new {|hash, key| hash[key] = Item[:name => key] }
23
+ @items ||= Hash.new {|hash, key| hash[key] = Item[{ :name => key }.merge(@default)] }
19
24
  end
20
25
 
21
- def item(name, hash)
26
+ def item(name, hash = {})
22
27
  items[name.to_sym].update(hash)
23
28
  end
24
29
  end
data/lib/egi/group.rb CHANGED
@@ -2,13 +2,23 @@ module Egi
2
2
  class Group
3
3
  def initialize(name = nil)
4
4
  @tags = name ? [ name ] : [ ]
5
+ @default = {}
6
+ end
7
+
8
+ def set(default)
9
+ @default = default
10
+ end
11
+
12
+ def instance_eval(&block)
13
+ super
14
+ self # for method chain
5
15
  end
6
16
 
7
17
  def items
8
- @items ||= Hash.new {|hash, key| hash[key] = Item[:name => key, :tags => @tags] }
18
+ @items ||= Hash.new {|hash, key| hash[key] = Item[{ :name => key, :tags => @tags }.merge(@default)] }
9
19
  end
10
20
 
11
- def item(name, hash)
21
+ def item(name, hash = {})
12
22
  items[name.to_sym].update(hash)
13
23
  self # for method chain
14
24
  end
data/lib/egi/sandbox.rb CHANGED
@@ -13,24 +13,31 @@ module Egi
13
13
  @current_env = name
14
14
 
15
15
  to_load = opts[:load]
16
- env = envs[name]
17
- env.merge!(envs[to_load]) if envs.has_key?(to_load)
18
- env.instance_eval(&block) if block_given?
19
-
20
- # define method_missing to access item
21
- def env.method_missing(name, *args)
22
- raise MethodMissing if args.size > 0
23
- items.has_key?(name) ? items[name] : nil
24
- end
16
+ envs[name].merge!(envs[to_load]) if envs.has_key?(to_load)
17
+ envs[name].instance_eval(&block) if block_given?
25
18
  end
26
19
 
27
20
  def eval(str)
28
21
  instance_eval(str)
22
+
23
+ # define method_missing to access items
24
+ envs.each_value do |env|
25
+ def env.method_missing(name, *args)
26
+ super if args.size > 0
27
+ items.has_key?(name) ? items[name] : nil
28
+ end
29
+ end
30
+
29
31
  envs
30
32
  end
31
33
 
32
- def method_missing(name, *args)
33
- envs[@current_env].send(name, *args)
34
+ def method_missing(name, *args, &block)
35
+ begin
36
+ envs[@current_env].send(name, *args, &block)
37
+ rescue => e
38
+ puts "#{name}(#{args}) #{block_given? ? "with block" : ""} is called at #{@current_env} env"
39
+ raise e
40
+ end
34
41
  end
35
42
  end
36
43
  end
data/lib/egi.rb CHANGED
@@ -7,6 +7,8 @@ module Egi
7
7
  autoload :Item, 'egi/item'
8
8
 
9
9
  def env
10
+ load_file(config_file) unless @env
11
+
10
12
  name = ENV['EGI_ENV'] || 'default'
11
13
  self[name]
12
14
  end
@@ -15,6 +17,10 @@ module Egi
15
17
  @env.has_key?(name) ? @env[name] : nil
16
18
  end
17
19
 
20
+ def load_file(file)
21
+ load(File.read(file))
22
+ end
23
+
18
24
  def load(str)
19
25
  @env = Sandbox.new.eval(str)
20
26
  end
@@ -22,5 +28,16 @@ module Egi
22
28
  def reset
23
29
  @env = nil
24
30
  end
25
- module_function :[], :load, :reset
31
+ def config_file
32
+ @config_file ||
33
+ ( File.exist?('./egi.conf') && './egi.conf' ) ||
34
+ ( File.exist?('/etc/egi.conf') && '/etc/egi.conf') ||
35
+ raise('you should set Egi.config_file or put ./egi.conf or /etc/egi.conf')
36
+ end
37
+
38
+ def config_file=(file)
39
+ @config_file = file
40
+ end
41
+
42
+ module_function :env, :[], :load, :reset, :config_file, :config_file=
26
43
  end
data/spec/egi_spec.rb CHANGED
@@ -14,21 +14,82 @@ RSpec::Matchers.define :have_item do |key, value|
14
14
  diffable
15
15
  end
16
16
 
17
+ shared_examples_for :sample_environments do
18
+ context 'makes env1' do
19
+ subject { described_class[:env1] }
20
+
21
+ it { should have_item(:a, :hoge => :fuga) }
22
+ it { should have_item(:b, :fuga => :ugu) }
23
+ end
24
+
25
+ context 'makes env_group' do
26
+ subject { described_class[:env_group] }
27
+ it { should have_item(:a, :hoge => :fuga, :tags => [ :hoge ]) }
28
+ it { should have_item(:b, :tags => [ :hoge, :fuga ]) }
29
+ end
30
+
31
+ context 'makes env2' do
32
+ subject { described_class[:env2] }
33
+
34
+ it { should have_item(:a, :hoge => :ugu) }
35
+ its(:b) { should be_nil }
36
+ end
37
+
38
+ context 'makes loaded_env1 which loads env1' do
39
+ subject { described_class[:loaded_env1] }
40
+
41
+ it { should have_item(:a, :hoge => :ugu) }
42
+ it { should have_item(:b, :fuga => :ugu) }
43
+ end
44
+
45
+ context 'makes env with default' do
46
+ subject { described_class[:env_with_default] }
47
+
48
+ it { should have_item(:a, :hoge => :ugu) }
49
+ it { should have_item(:b, :hoge => :fuga) }
50
+ it { should have_item(:c, :hoge => :piyo, :tags => []) }
51
+ it { should have_item(:d, :hoge => :puyo, :tags => []) }
52
+ end
53
+
54
+ context 'does not make env3' do
55
+ subject { described_class[:env3] }
56
+ it { should be_nil }
57
+ end
58
+ end
59
+
17
60
  describe klass, '.load environments:' do
18
61
  environments = <<-EOS
19
62
  env(:env1) {
20
- item :a, { :hoge => :fuga }
21
- item :b, { :fuga => :ugu }
63
+ item :a, :hoge => :fuga
64
+ item :b, :fuga => :ugu
22
65
  }
23
66
 
67
+ env(:env_group) {
68
+ group(:hoge) {
69
+ item :a, :hoge => :fuga
70
+ item :b, :tags => [ :fuga ]
71
+ }
72
+ }
73
+
24
74
  env(:env2) {
25
- item :a, { :hoge => :ugu }
75
+ item :a, :hoge => :ugu
26
76
  }
27
77
 
28
- env(:env_group) {
29
- group(:hoge) {
30
- item :a, { :hoge => :fuga }
31
- item :b, { :tags => [ :fuga ] }
78
+ env(:loaded_env1, :load => :env1) {
79
+ item :a, :hoge => :ugu
80
+ }
81
+
82
+ env(:env_with_default) {
83
+ set :hoge => :ugu
84
+
85
+ item :a
86
+ item :b, :hoge => :fuga
87
+
88
+ group {
89
+ set :hoge => :piyo
90
+
91
+ item :c
92
+ item :d, :hoge => :puyo
32
93
  }
33
94
  }
34
95
  EOS
@@ -37,99 +98,45 @@ env(:env_group) {
37
98
  before(:all) { described_class.load(environments) }
38
99
  after(:all) { described_class.reset }
39
100
 
40
- context 'makes env1' do
41
- subject { described_class[:env1] }
42
-
43
- it { should have_item(:a, :hoge => :fuga) }
44
- it { should have_item(:b, :fuga => :ugu) }
45
- end
46
-
47
- context 'makes env2' do
48
- subject { described_class[:env2] }
49
-
50
- it { should have_item(:a, :hoge => :ugu) }
51
- its(:b) { should be_nil }
52
- end
53
-
54
- context 'makes env_group' do
55
- subject { described_class[:env_group] }
56
- it { should have_item(:a, :hoge => :fuga, :tags => [ :hoge ]) }
57
- it { should have_item(:b, :tags => [ :hoge, :fuga ]) }
58
- end
59
-
60
- context 'does not make env3' do
61
- subject { described_class[:env3] }
62
- it { should be_nil }
63
- end
101
+ it_should_behave_like :sample_environments
64
102
  end
65
103
  end
66
104
 
67
- describe klass, '.load environments:' do
105
+ describe klass, '.load flat environments:' do
68
106
  environments = <<-EOS
69
107
  env :env1
70
- item :a, { :hoge => :fuga }
71
- item :b, { :fuga => :ugu }
108
+ item :a, :hoge => :fuga
109
+ item :b, :fuga => :ugu
110
+
111
+ env :env_group
112
+ group(:hoge) {
113
+ item :a, :hoge => :fuga
114
+ item :b, :tags => [ :fuga ]
115
+ }
72
116
 
73
117
  env :env2
74
- item :a, { :hoge => :ugu }
75
- EOS
118
+ item :a, :hoge => :ugu
76
119
 
77
- context "\n#{environments}" do
78
- before(:all) { described_class.load(environments) }
79
- after(:all) { described_class.reset }
80
-
81
- context 'makes env1' do
82
- subject { described_class[:env1] }
83
-
84
- it { should have_item(:a, :hoge => :fuga) }
85
- it { should have_item(:b, :fuga => :ugu) }
86
- end
87
-
88
- context 'makes env2' do
89
- subject { described_class[:env2] }
90
-
91
- it { should have_item(:a, :hoge => :ugu) }
92
- its(:b) { should be_nil }
93
- end
94
-
95
- context 'does not make env3' do
96
- subject { described_class[:env3] }
97
- it { should be_nil }
98
- end
99
- end
100
- end
120
+ env :loaded_env1, :load => :env1
121
+ item :a, :hoge => :ugu
101
122
 
102
- describe klass, '.load environments using load to inherit default:' do
103
- environments = <<-EOS
104
- env :env1
105
- item :a, { :hoge => :fuga }
106
- item :b, { :fuga => :ugu }
123
+ env :env_with_default
124
+ set :hoge => :ugu
107
125
 
108
- env :env2, :load => :env1
109
- item :a, { :hoge => :ugu }
126
+ item :a
127
+ item :b, :hoge => :fuga
128
+ group {
129
+ set :hoge => :piyo
130
+
131
+ item :c
132
+ item :d, :hoge => :puyo
133
+ }
110
134
  EOS
111
135
 
112
136
  context "\n#{environments}" do
113
137
  before(:all) { described_class.load(environments) }
114
138
  after(:all) { described_class.reset }
115
139
 
116
- context 'makes env1' do
117
- subject { described_class[:env1] }
118
-
119
- it { should have_item(:a, :hoge => :fuga) }
120
- it { should have_item(:b, :fuga => :ugu) }
121
- end
122
-
123
- context 'makes env2' do
124
- subject { described_class[:env2] }
125
-
126
- it { should have_item(:a, :hoge => :ugu) }
127
- it { should have_item(:b, :fuga => :ugu) }
128
- end
129
-
130
- context 'does not make env3' do
131
- subject { described_class[:env3] }
132
- it { should be_nil }
133
- end
140
+ it_should_behave_like :sample_environments
134
141
  end
135
142
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-25 00:00:00.000000000 Z
12
+ date: 2011-11-28 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &84892960 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *84892960
14
25
  - !ruby/object:Gem::Dependency
15
26
  name: rspec
16
- requirement: &71572070 !ruby/object:Gem::Requirement
27
+ requirement: &84892670 !ruby/object:Gem::Requirement
17
28
  none: false
18
29
  requirements:
19
30
  - - ! '>='
@@ -21,10 +32,10 @@ dependencies:
21
32
  version: '0'
22
33
  type: :development
23
34
  prerelease: false
24
- version_requirements: *71572070
35
+ version_requirements: *84892670
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: autowatchr
27
- requirement: &71571750 !ruby/object:Gem::Requirement
38
+ requirement: &84892430 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,7 +43,7 @@ dependencies:
32
43
  version: '0'
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *71571750
46
+ version_requirements: *84892430
36
47
  description: manage multi-environments
37
48
  email:
38
49
  - okitakunio@gmail.com
@@ -43,6 +54,7 @@ files:
43
54
  - .gitignore
44
55
  - .rspec
45
56
  - .rvmrc
57
+ - .travis.yml
46
58
  - CHANGELOG.md
47
59
  - Gemfile
48
60
  - README.md