hosties 1.0.0 → 1.1.0.alpha

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: d0ddfeda2e90489df21afb44cb70c5560fd24b12
4
- data.tar.gz: 7307934a3183c4fcb74d1a4fe3e4c6401ecf7ba0
3
+ metadata.gz: b67e9ef6e1d2d98eaf6c3e5dc570e2b478e12708
4
+ data.tar.gz: d3fa2796ecfee0d21f0091c6ca6d1518961d281f
5
5
  SHA512:
6
- metadata.gz: e8c90640a12836827bc7c0df71a7496389833b5fafcfb495b35355efc650215032ae6e39b8b10870c40b9e36c9f62ed45025347f1d8d051175fe50c04813b7d4
7
- data.tar.gz: e17ba1f3cb0e4bfa34740edf9491124a97ef467cdd993dd4e478e257cfcf4d556dcdc2e34270962239b05a3114e604a6a8c45d59635bf4e532d55ed743360c1b
6
+ metadata.gz: c3b2df43b6b47519ad39ef1c339c60b94e0ad27f2d1b7941c4686e7cbaed8166735aa03ac4fa1c8b9a3fae126a41935e041030a669f6ab1c1410eb3d0d5ee326
7
+ data.tar.gz: 86b140c14683a0b37cf754158920181856cd4fb0bc85f560806e37166b13246a0da667a2db1c965a0c1bb44574a601163ab7d8c2ae3cec5aea9bce4e11879e51
data/lib/hosties.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'hosties/definitions'
2
2
  require 'hosties/reification'
3
+ require 'hosties/easydata'
3
4
 
4
5
  # A library to provide easily readable environment definitions.
5
6
  module Hosties
@@ -37,6 +37,8 @@ class HasAttributes
37
37
  end
38
38
 
39
39
  alias_method :have_attribute, :have_attributes
40
+ alias_method :has_attribute, :have_attribute
41
+ alias_method :has_attributes, :have_attributes
40
42
 
41
43
  # Helpful method to define constraints
42
44
  def where(name)
@@ -71,6 +73,8 @@ class HostRequirement < HasAttributes
71
73
  end
72
74
 
73
75
  alias_method :have_service, :have_services
76
+ alias_method :has_service, :have_service
77
+ alias_method :has_services, :have_services
74
78
 
75
79
  def finished
76
80
  Hosties::HostDefinitions[@type] = self
@@ -0,0 +1,40 @@
1
+ ###############################################################
2
+ # Provide a more convenient data structure to work with once #
3
+ # environment declarations have been read. #
4
+ ###############################################################
5
+ class DataWrapper
6
+ def metaclass
7
+ class << self
8
+ self
9
+ end
10
+ end
11
+ end
12
+
13
+ module Hosties
14
+ module EasyData
15
+ def self.fromHost(hash)
16
+ result = DataWrapper.new
17
+ hash.each do |k, v|
18
+ result.metaclass.send(:define_method, k) do v end
19
+ end
20
+ result
21
+ end
22
+ def self.fromEnv(hash)
23
+ result = DataWrapper.new
24
+ hash.each do |k, v|
25
+ result.metaclass.send(:define_method, k) do v end
26
+ end
27
+ # Add a hosts_by_type method
28
+ result.metaclass.send(:define_method, :hosts_by_type) do |type|
29
+ self.hosts.find_all do |host|
30
+ host.type == type
31
+ end
32
+ end
33
+ # Add an each_host method
34
+ result.metaclass.send(:define_method, :each_host) do |&block|
35
+ yield self.hosts
36
+ end
37
+ result
38
+ end
39
+ end
40
+ end
@@ -64,8 +64,8 @@ class HostBuilder < UsesAttributes
64
64
  @definition.services.each do |svc|
65
65
  raise ArgumentError, "Missing service #{svc}" if @service_ports[svc].nil?
66
66
  end
67
- # TODO: More clever data repackaging
68
- super.merge({ :hostname => @hostname }).merge(@service_ports)
67
+ # TODO: Declare these reserved names
68
+ super.merge({ :hostname => @hostname, :type => @type }).merge(@service_ports)
69
69
  end
70
70
  end
71
71
 
@@ -75,7 +75,7 @@ class EnvironmentBuilder < UsesAttributes
75
75
  if Hosties::EnvironmentDefinitions[type].nil? then
76
76
  raise ArgumentError, "Unrecognized environment type"
77
77
  end
78
- @hosts = {} # host type => array of hosts' data
78
+ @hosts = []
79
79
  @type = type
80
80
  @definition = Hosties::EnvironmentDefinitions[@type]
81
81
  super(@definition) # Creates attribute code
@@ -86,8 +86,7 @@ class EnvironmentBuilder < UsesAttributes
86
86
  begin
87
87
  builder = HostBuilder.new(host_type, hostname)
88
88
  builder.instance_eval(&block)
89
- if @hosts[host_type].nil? then @hosts[host_type] = [] end
90
- @hosts[host_type] << builder.finish
89
+ @hosts << Hosties::EasyData.fromHost(builder.finish)
91
90
  rescue ArgumentError => ex
92
91
  #puts "Problem declaring host: #{ex}"
93
92
  raise ex
@@ -99,19 +98,11 @@ class EnvironmentBuilder < UsesAttributes
99
98
  def finish
100
99
  # Verify all of the required hosts were set
101
100
  @definition.hosts.each do |host_type|
102
- raise ArgumentError, "Missing #{host_type} host" unless @hosts.include? host_type
103
- end
104
- retval = super.merge({ :hosts => @hosts })
105
- Hosties::Environments[@type] << retval
106
- # Add ourselves into the grouped listing if necessary
107
- attr = @definition.grouping
108
- unless attr.nil? then # TODO: This is really ugly
109
- if Hosties::GroupedEnvironments[@type].nil? then
110
- Hosties::GroupedEnvironments[@type] = Hash.new{|h,k| h[k] = []}
101
+ unless @hosts.detect { |host| host.type == host_type } then
102
+ raise ArgumentError, "Missing #{host_type} host"
111
103
  end
112
- Hosties::GroupedEnvironments[@type][retval[attr]] << retval
113
104
  end
114
- retval
105
+ super.merge({ :hosts => @hosts })
115
106
  end
116
107
  end
117
108
 
@@ -120,6 +111,16 @@ def environment_for(type, &block)
120
111
  builder = EnvironmentBuilder.new(type)
121
112
  builder.instance_eval(&block)
122
113
  data = builder.finish
114
+ nice_version = Hosties::EasyData.fromEnv(data)
115
+ Hosties::Environments[type] << nice_version
116
+ definition = Hosties::EnvironmentDefinitions[type]
117
+ # Add into the grouped listing if necessary
118
+ unless definition.grouping.nil? then
119
+ if Hosties::GroupedEnvironments[type].nil? then
120
+ Hosties::GroupedEnvironments[type] = Hash.new{|h,k| h[k] = []}
121
+ end
122
+ Hosties::GroupedEnvironments[type][data[definition.grouping]] << nice_version
123
+ end
123
124
  rescue ArgumentError => ex
124
125
  puts "Problem declaring environment: #{ex}"
125
126
  raise ex
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hosties::EasyData do
4
+ it 'should turn host declarations into something awesome' do
5
+ host_type :easydata_one do
6
+ have_service :http
7
+ have_attribute :attr_one
8
+ end
9
+ builder = HostBuilder.new(:easydata_one, "localhost")
10
+ builder.http 80
11
+ builder.attr_one "One!"
12
+ result = Hosties::EasyData.fromHost(builder.finish)
13
+ expect(result.http).to eq(80)
14
+ expect(result.attr_one).to eq("One!")
15
+ expect(result.hostname).to eq("localhost")
16
+ expect(result.type).to eq(:easydata_one)
17
+ end
18
+
19
+ it 'should turn environment declarations into something awesome too' do
20
+ host_type :easydata_two do end
21
+ host_type :easydata_three do end
22
+ environment_type :easydata_one do
23
+ need :easydata_two, :easydata_three
24
+ have_attribute :environment
25
+ where(:environment).can_be :dev, :testing
26
+ end
27
+ builder = EnvironmentBuilder.new :easydata_one
28
+ builder.easydata_two "0.0.0.0" do end
29
+ builder.easydata_three "1.1.1.1" do end
30
+ builder.environment :dev
31
+ result = Hosties::EasyData.fromEnv(builder.finish)
32
+ expect(result.environment).to eq(:dev)
33
+ type_two_hosts = result.hosts_by_type(:easydata_two)
34
+ expect(type_two_hosts.size).to eq(1)
35
+ host = type_two_hosts.first
36
+ expect(host.hostname).to eq("0.0.0.0")
37
+ end
38
+ end
data/spec/hosties_spec.rb CHANGED
@@ -5,7 +5,7 @@ describe Hosties do
5
5
  host_type :special_host do
6
6
  end
7
7
  instance = HostBuilder.new(:special_host, "0.0.0.0")
8
- expect(instance.finish).to eq({ :hostname => "0.0.0.0"})
8
+ expect(instance.finish).to eq({ :hostname => "0.0.0.0", :type => :special_host})
9
9
  end
10
10
 
11
11
  it 'catches missing services' do
@@ -81,12 +81,12 @@ describe Hosties do
81
81
  end
82
82
  expect(Hosties::Environments[:typical_product].nil?).to eq(false)
83
83
  data = Hosties::Environments[:typical_product].first
84
- expect(data[:environment]).to eq(:qa)
85
- expect(data[:hosts][:monitoring].size).to eq(2) # Two monitoring hosts
86
- expect(data[:hosts][:service_host].size).to eq(1)
87
- service_host = data[:hosts][:service_host].first
88
- expect(service_host[:service_port]).to eq(1234)
89
- expect(service_host[:uuid]).to eq("81E3C1D4-C040-4D59-A56F-4273384D576B")
84
+ expect(data.environment).to eq(:qa)
85
+ expect(data.hosts_by_type(:monitoring).size).to eq(2) # Two monitoring hosts
86
+ expect(data.hosts_by_type(:service_host).size).to eq(1)
87
+ service_host = data.hosts_by_type(:service_host).first
88
+ expect(service_host.service_port).to eq(1234)
89
+ expect(service_host.uuid).to eq("81E3C1D4-C040-4D59-A56F-4273384D576B")
90
90
  end
91
91
 
92
92
  it 'can group environments by attribute' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hosties
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0.alpha
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ron Dahlgren
@@ -32,10 +32,12 @@ executables: []
32
32
  extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
- - lib/hosties/Definitions.rb
36
- - lib/hosties/Reification.rb
35
+ - lib/hosties/definitions.rb
36
+ - lib/hosties/easydata.rb
37
+ - lib/hosties/reification.rb
37
38
  - lib/hosties.rb
38
39
  - spec/definitions_spec.rb
40
+ - spec/easydata_spec.rb
39
41
  - spec/hosties_spec.rb
40
42
  - spec/reification_spec.rb
41
43
  - spec/spec_helper.rb
@@ -54,9 +56,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
54
56
  version: '0'
55
57
  required_rubygems_version: !ruby/object:Gem::Requirement
56
58
  requirements:
57
- - - '>='
59
+ - - '>'
58
60
  - !ruby/object:Gem::Version
59
- version: '0'
61
+ version: 1.3.1
60
62
  requirements: []
61
63
  rubyforge_project:
62
64
  rubygems_version: 2.0.3
@@ -65,6 +67,7 @@ specification_version: 4
65
67
  summary: Easy environment description
66
68
  test_files:
67
69
  - spec/definitions_spec.rb
70
+ - spec/easydata_spec.rb
68
71
  - spec/hosties_spec.rb
69
72
  - spec/reification_spec.rb
70
73
  - spec/spec_helper.rb