egi 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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