lane_groove 0.0.2

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/bin/lane_groove ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ require 'forever'
3
+
4
+ WORKING_DIR = Dir.getwd
5
+ puts "Working directory is #{WORKING_DIR}"
6
+ puts "WARNING: Working directory is empty!" if Dir.glob(File.join(WORKING_DIR, '*.yaml')).empty?
7
+
8
+ Forever.run do
9
+ dir WORKING_DIR
10
+ log File.join(WORKING_DIR, 'lane_groove.log')
11
+ pid File.join(WORKING_DIR, 'lane_groove.pid')
12
+
13
+ on_ready do
14
+ at_exit { stop! }
15
+ require '../lib/app.rb'
16
+ LaneGroove.run! :port => 6666
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'yaml'
4
+
5
+ WORKING_DIR = Dir.getwd
6
+
7
+ config_files = Dir.glob File.join(WORKING_DIR, '*.yaml')
8
+
9
+ config = {}
10
+
11
+ config_files.each do |file|
12
+ puts "Loading #{file}"
13
+ config[File.basename(file, '.yaml').to_sym] = YAML.load_file(file)
14
+ end
15
+
16
+ puts config.to_yaml
data/lib/app.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'yaml'
2
+ require 'json'
3
+ require 'xmlsimple'
4
+ require 'sinatra/base'
5
+ require 'rack/contrib'
6
+
7
+ class Hash
8
+ def upcase_keys
9
+ self.inject({}){ |new_hash, key_value|
10
+ key, value = key_value
11
+ value = value.upcase_keys if value.is_a?(Hash)
12
+ new_hash[key.upcase] = value
13
+ new_hash
14
+ }
15
+ end
16
+ end
17
+
18
+ class LaneGroove < Sinatra::Base
19
+ use Rack::CommonLogger
20
+ use Rack::Access, '/' => %w{ 127.0.0.1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 }
21
+
22
+ set :config, nil
23
+
24
+ static_dir = File.join(WORKING_DIR, 'static')
25
+
26
+ if File.exists? static_dir
27
+ puts "Serving static files from #{static_dir}"
28
+ set :static, true
29
+ set :public, static_dir
30
+ end
31
+
32
+ helpers do
33
+ def config_files
34
+ Dir.glob File.join(WORKING_DIR, '*.yaml')
35
+ end
36
+
37
+ def content_type_for(format)
38
+ {
39
+ :json => {'Content-Type' => 'application/json; charset=utf-8'},
40
+ :xml => {'Content-Type' => 'application/xml; charset=utf-8'},
41
+ :yaml => {'Content-Type' => 'application/x-yaml; charset=utf-8'},
42
+ :rb => {'Content-Type' => 'application/x-ruby; charset=utf-8'}
43
+ }[format]
44
+ end
45
+
46
+ def reload_yaml
47
+ self.class.config = {}
48
+
49
+ config_files.each do |file|
50
+ puts "Loading #{file}"
51
+ self.class.config[File.basename(file, '.yaml').to_sym] = YAML.load_file(file)
52
+ end
53
+
54
+ config.to_yaml
55
+ end
56
+
57
+ def config(*path)
58
+ reload_yaml if self.class.config.nil?
59
+ cfg = self.class.config
60
+
61
+ path.each do |node|
62
+ cfg = cfg[node]
63
+ break if cfg.nil?
64
+ end
65
+
66
+ return cfg
67
+ end
68
+ end
69
+
70
+ get /^(.*)\.([\w\d]{2,4})$/ do |path, ext|
71
+ reload_yaml if params['reload']
72
+
73
+ ext = ext.to_sym
74
+ path = path.split('/').delete_if{|n| n.empty?}.compact.map{|n| n.to_sym}
75
+
76
+ case ext
77
+ when :yaml then [200, content_type_for(:yaml), config(*path).to_yaml]
78
+ when :json then [200, content_type_for(:json), config(*path).to_json]
79
+ when :xml then [200, content_type_for(:xml), XmlSimple.xml_out(config(*path), 'RootName' => nil, 'NoAttr' => true)]
80
+ when :XML then [200, content_type_for(:xml), XmlSimple.xml_out(config(*path).upcase_keys, 'RootName' => nil, 'NoAttr' => true)]
81
+ when :rb then [200, content_type_for(:rb), config(*path).inspect]
82
+ else ; [404, {}, "unknown format #{ext}"]
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,163 @@
1
+ WORKING_DIR = File.join(Dir.getwd, 'config_files')
2
+
3
+ require '../lib/app.rb'
4
+ require 'test/unit'
5
+ require 'rack/test'
6
+ require 'fileutils'
7
+
8
+ class LaneGrooveTest < Test::Unit::TestCase
9
+ include Rack::Test::Methods
10
+
11
+ def app
12
+ LaneGroove
13
+ end
14
+
15
+ def config
16
+ {:test=>{:db=>{:host=>"my-db-server", :user=>"root", :pass=>"none"}, :redis=>{:host=>"my-redis-server"}}}
17
+ end
18
+
19
+ def config_all_xml
20
+ <<-EOX
21
+ <test>
22
+ <db>
23
+ <host>my-db-server</host>
24
+ <user>root</user>
25
+ <pass>none</pass>
26
+ </db>
27
+ <redis>
28
+ <host>my-redis-server</host>
29
+ </redis>
30
+ </test>
31
+ EOX
32
+ end
33
+
34
+ def config_db_xml
35
+ <<-EOX
36
+ <host>my-db-server</host>
37
+ <user>root</user>
38
+ <pass>none</pass>
39
+ EOX
40
+ end
41
+
42
+ def config_all_XML
43
+ <<-EOX
44
+ <TEST>
45
+ <DB>
46
+ <HOST>my-db-server</HOST>
47
+ <USER>root</USER>
48
+ <PASS>none</PASS>
49
+ </DB>
50
+ <REDIS>
51
+ <HOST>my-redis-server</HOST>
52
+ </REDIS>
53
+ </TEST>
54
+ EOX
55
+ end
56
+
57
+ def config_db_XML
58
+ <<-EOX
59
+ <HOST>my-db-server</HOST>
60
+ <USER>root</USER>
61
+ <PASS>none</PASS>
62
+ EOX
63
+ end
64
+
65
+ def test_all_rb
66
+ get '/.rb'
67
+ assert_equal 'application/x-ruby; charset=utf-8', last_response.content_type
68
+ assert_equal config.inspect, last_response.body
69
+ end
70
+ def test_db_rb
71
+ get '/test/db.rb'
72
+ assert_equal 'application/x-ruby; charset=utf-8', last_response.content_type
73
+ assert_equal config[:test][:db].inspect, last_response.body
74
+ end
75
+
76
+ def test_all_yaml
77
+ get '/.yaml'
78
+ assert_equal 'application/x-yaml; charset=utf-8', last_response.content_type
79
+ assert_equal config.to_yaml, last_response.body
80
+ end
81
+ def test_db_yaml
82
+ get '/test/db.yaml'
83
+ assert_equal 'application/x-yaml; charset=utf-8', last_response.content_type
84
+ assert_equal config[:test][:db].to_yaml, last_response.body
85
+ end
86
+
87
+ def test_all_json
88
+ get '/.json'
89
+ assert_equal 'application/json; charset=utf-8', last_response.content_type
90
+ assert_equal config.to_json, last_response.body
91
+ end
92
+ def test_db_json
93
+ get '/test/db.json'
94
+ assert_equal 'application/json; charset=utf-8', last_response.content_type
95
+ assert_equal config[:test][:db].to_json, last_response.body
96
+ end
97
+
98
+ def test_all_xml
99
+ get '/.xml'
100
+ assert_equal 'application/xml; charset=utf-8', last_response.content_type
101
+ assert_equal config_all_xml, last_response.body
102
+ end
103
+ def test_db_xml
104
+ get '/test/db.xml'
105
+ assert_equal 'application/xml; charset=utf-8', last_response.content_type
106
+ assert_equal config_db_xml, last_response.body
107
+ end
108
+
109
+ def test_all_XML
110
+ get '/.XML'
111
+ assert_equal 'application/xml; charset=utf-8', last_response.content_type
112
+ assert_equal config_all_XML, last_response.body
113
+ end
114
+ def test_db_XML
115
+ get '/test/db.XML'
116
+ assert_equal 'application/xml; charset=utf-8', last_response.content_type
117
+ assert_equal config_db_XML, last_response.body
118
+ end
119
+
120
+ def reset_assets
121
+ FileUtils.mv('config_files/more_test.yaml', 'config_files/test.yaml') if File.exists?('config_files/more_test.yaml')
122
+ FileUtils.mv('config_files/no_static', 'config_files/static') if File.exists?('config_files/no_static')
123
+ end
124
+
125
+ def setup
126
+ reset_assets
127
+ end
128
+
129
+ def teardown
130
+ reset_assets
131
+ end
132
+
133
+ def test_reloading
134
+ get '/test/db.rb'
135
+ assert_equal config[:test][:db].inspect, last_response.body
136
+
137
+ FileUtils.mv('config_files/test.yaml', 'config_files/more_test.yaml')
138
+
139
+ get '/test/db.rb'
140
+ assert_equal config[:test][:db].inspect, last_response.body
141
+
142
+ get '/more_test/db.rb?reload=true'
143
+ assert_equal config[:test][:db].inspect, last_response.body
144
+ end
145
+
146
+ def test_network_restrictions
147
+ get '/.yaml', {}, {'REMOTE_ADDR' => '134.34.3.2'}
148
+ assert_equal 403, last_response.status
149
+ assert_equal '', last_response.body
150
+ end
151
+
152
+ def test_static_files
153
+ get '/some.txt'
154
+ assert_equal 'some text', last_response.body
155
+ end
156
+ def test_static_files_no_dir
157
+ FileUtils.mv('config_files/static', 'config_files/no_static')
158
+ get '/some.txt'
159
+ assert_equal 404, last_response.status
160
+ assert_equal 'unknown format txt', last_response.body
161
+ end
162
+
163
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lane_groove
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.2
6
+ platform: ruby
7
+ authors:
8
+ - Niko
9
+ - Dittmann
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+
14
+ date: 2011-07-26 00:00:00 +02:00
15
+ default_executable:
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: xml-simple
19
+ prerelease: false
20
+ requirement: &id001 !ruby/object:Gem::Requirement
21
+ none: false
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: "0"
26
+ type: :runtime
27
+ version_requirements: *id001
28
+ - !ruby/object:Gem::Dependency
29
+ name: sinatra
30
+ prerelease: false
31
+ requirement: &id002 !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: "0"
37
+ type: :runtime
38
+ version_requirements: *id002
39
+ - !ruby/object:Gem::Dependency
40
+ name: rack-contrib
41
+ prerelease: false
42
+ requirement: &id003 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ type: :runtime
49
+ version_requirements: *id003
50
+ - !ruby/object:Gem::Dependency
51
+ name: rack-test
52
+ prerelease: false
53
+ requirement: &id004 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ type: :development
60
+ version_requirements: *id004
61
+ description: A small HTTP configuration server. Eats YAML, returns JSON, XML, YAML and rb. Restricts requests to local subnet.
62
+ email: mail@niko-dittmann.com
63
+ executables:
64
+ - lane_groove
65
+ - lane_groove_test
66
+ extensions: []
67
+
68
+ extra_rdoc_files: []
69
+
70
+ files:
71
+ - lib/app.rb
72
+ - test/lane_groove_test.rb
73
+ - bin/lane_groove
74
+ - bin/lane_groove_test
75
+ has_rdoc: true
76
+ homepage: http://github.com/niko/lane_groove
77
+ licenses: []
78
+
79
+ post_install_message:
80
+ rdoc_options: []
81
+
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: "0"
96
+ requirements: []
97
+
98
+ rubyforge_project: nowarning
99
+ rubygems_version: 1.5.2
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: A small HTTP configuration server. Eats YAML, returns JSON, XML, YAML and rb. Restricts requests to local subnet.
103
+ test_files:
104
+ - test/lane_groove_test.rb