higo 0.0.1.alpha → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6ef0dc27690d5b9720eb4c3266c4bf653c35df9
4
- data.tar.gz: d0437735de76419825f3e8eb3f32159c830039f1
3
+ metadata.gz: e64120e8327764a40c07d0d79c7efc78a1c4922d
4
+ data.tar.gz: 45fa3ad29a672badfa2e76936d92b027dec63a04
5
5
  SHA512:
6
- metadata.gz: 4bdf1616d5634ef5e5955b12e6b1f5447ce76f1a0f9b56feb2e6cd8668da7cc504b08a4e906e3a8c67d78a88ad49ce4880b7b05d3bc4e1b28c15f67caabbf0e8
7
- data.tar.gz: 32466bf5747e206bc9f0d64ce68d863b2a81949625cac0d1c9d6137e01fb663ab0cb9bff2b3e311fc2c3a9302727a2674ee970c982d902b4ce1eb0e79918cb21
6
+ metadata.gz: 642bd77bd34f6661554ce6d06a9936a0d20229f2a4523d81f002666e612789c4810bf91a1d875b57ed17e250f1c0d862290421b297801426d44cd2b5733e2cee
7
+ data.tar.gz: 1db2709a88a6d3c6746386ab75ce7d0e621217dad1c155c71f81a7aecfdf8bc78133bcb6b28d149a719e4702a37651402e0ce92c778ede8f6722491dc40f3279
data/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
  `gem install higo`
5
5
 
6
6
  Detailed usage examples can be found in the `/examples` directory.
7
+ Documentation can be found [here](http://www.rubydoc.info/github/rhodee/higo/master).
7
8
 
8
9
  ## Gem Story - TL;DR
9
10
  Higo creates 'config' objects dynamic using the well understood `configure` block:
@@ -32,13 +33,13 @@ were taken. Sure I could've named it `figy`, but that would be too confusing. So
32
33
 
33
34
 
34
35
  __Note__-if you already defined `method_missing` in your class `Higo` will honor that and that is likely not what you
35
- want. Higo might now be right for you at this stage.
36
+ want. Higo might not be right for you at this stage.
36
37
 
37
38
  ### To Do List
38
39
 
39
40
  * ~~Generate arbitrary configuration values~~
40
41
  * Improve support for subclasses that define `method_missing`
41
- * Read from an external source
42
+ * ~~Read from an external source~~
42
43
  * Improve documentation
43
44
 
44
45
  ## Contributing
@@ -3,13 +3,14 @@
3
3
  #
4
4
  module Higo
5
5
  def self.included(mod)
6
+ # If the module is included write to a variable
6
7
  mod.extend(Macros)
7
8
  end
8
9
 
9
10
  module Macros
10
- def configure(&block)
11
- configuration ||= Higo::Configurable.new
12
- configuration.instance_eval(&block)
11
+ def configure(path:nil, &block)
12
+ configuration ||= Higo::Configurable.generate_configurable(path)
13
+ configuration.instance_eval(&block) if block_given?
13
14
  return configuration
14
15
  end
15
16
  end
@@ -20,12 +21,36 @@ module Higo
20
21
  #
21
22
  # @param [Proc]
22
23
  # @return [Configurable] responds to getter, setter, predicate methods defined
23
- def self.configure(&block)
24
- configuration = generate_configurable
25
- configuration.instance_eval(&block)
24
+ def self.configure(path:nil, &block)
25
+ configuration = generate_configurable(path)
26
+ configuration.instance_eval(&block) if block_given?
26
27
  return configuration
27
28
  end
28
29
 
30
+ def self.inherited(mod)
31
+ # If the class is inherited write to a variable
32
+ end
33
+
34
+ def initialize(file)
35
+ if file
36
+ values = if file =~ /http/
37
+ Transport::Web.transport(path: file).finish
38
+ elsif file =~ /.?(txt|json)/
39
+ Transport::File.transport(path: file).finish
40
+ else
41
+ raise 'Unable to read this type of file'
42
+ end
43
+ values.each do |key,value|
44
+ self.class.__send__(:attr_accessor, key)
45
+ self.class.__send__(:define_method, "#{key}?", proc { !!value })
46
+ instance_variable_set("@#{key}", value)
47
+ end
48
+ else
49
+ super()
50
+ end
51
+ self
52
+ end
53
+
29
54
  def respond_to_missing?(method_name, include_private = false)
30
55
  super unless self.instance_variables.include?(convert_method_to_symbol(method_name))
31
56
  end
@@ -34,32 +59,29 @@ module Higo
34
59
  # all unknown methods are defined as getter, setters and predicate methods
35
60
  def method_missing(meth, *args, &block)
36
61
 
37
- if defined?(super)
38
- klass = self.class
39
- super(meth, *args, &block) if respond_to?(meth)
62
+ # check for a variable and then delegate to that method missing implementation
63
+ # should instruct user to call super() as well
64
+ klass = self.class
65
+ super(meth, *args, &block) if respond_to?(meth)
40
66
 
41
- ivar = convert_method_to_symbol(meth)
42
- data = args.size == 1 ? args.first : args
67
+ ivar = convert_method_to_symbol(meth)
68
+ data = args.size == 1 ? args.first : args
43
69
 
44
- klass.__send__(:attr_accessor, ivar)
45
- klass.__send__(:define_method, "#{ivar}?", proc { !!data })
70
+ klass.__send__(:attr_accessor, ivar)
71
+ klass.__send__(:define_method, "#{ivar}?", proc { !!data })
46
72
 
47
- instance_variable_set("@#{ivar}", data)
73
+ instance_variable_set("@#{ivar}", data)
48
74
 
49
- self
50
- else
51
- super
52
- end
75
+ self
53
76
  end
54
77
 
55
-
56
78
  private
57
79
  def convert_method_to_symbol(meth)
58
80
  meth.to_s.gsub('=', '').to_sym
59
81
  end
60
82
 
61
- def self.generate_configurable
62
- configuration ||= Configurable.new
83
+ def self.generate_configurable(path=nil)
84
+ configuration ||= Higo::Configurable.new(path)
63
85
  end
64
86
  end
65
87
  end
@@ -0,0 +1,47 @@
1
+ module Higo
2
+ module Transport
3
+ class File
4
+
5
+ attr_reader :path
6
+ attr_accessor :responses, :_raw_file
7
+
8
+ def initialize(path: nil)
9
+ @path = find_file(path)
10
+ @_raw_file = {}
11
+ @responses = {}
12
+ end
13
+
14
+ def self.transport(path)
15
+ file = new(path)
16
+ file._raw_file = Fiber.new { ::File.open(file.path, 'r') { |f| f.readlines.map } }
17
+ file
18
+ end
19
+
20
+ def finish
21
+ _raw_file.resume.map do |val|
22
+ responses.merge!(Hash[*process_value(val)])
23
+ end
24
+ responses
25
+ end
26
+
27
+ private
28
+ def process_value(str, delimeter='=')
29
+ if path.extname.tr('.','') == 'txt'
30
+ str.tr('\'','').chomp.split(delimeter)
31
+ end
32
+ end
33
+
34
+ def find_file(path)
35
+ path_to_file = Pathname.new(path)
36
+
37
+ if path_to_file.file?
38
+ return path_to_file
39
+ elsif path_to_file.relative? && path_to_file.expand_path.file?
40
+ return path_to_file
41
+ else
42
+ raise 'Unable to find file at location'
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,61 @@
1
+ module Higo
2
+ module Transport
3
+ class Web
4
+
5
+ attr_reader :path
6
+ attr_accessor :response, :_raw_data
7
+
8
+ def initialize(path: nil)
9
+ @path = URI(path)
10
+ @_raw_data = nil
11
+ @response = nil
12
+ end
13
+
14
+ def self.transport(url)
15
+ request = new(url)
16
+ request._raw_data = Fiber.new do
17
+ http = Net::HTTP.new(request.path.host, request.path.port)
18
+ http.use_ssl = true if request.path.port == 443
19
+ http.request(Net::HTTP::Get.new(request.path.to_s))
20
+ end
21
+ request
22
+ end
23
+
24
+ def finish
25
+ data = _raw_data.resume
26
+ temp_file = Tempfile.new([self.path.host.tr('.',''), ::Pathname.new(self.path.to_s).extname])
27
+ if success?(data.code) && data.body.bytesize > 0
28
+ ::File.open(temp_file.path, 'w') { |f| f.write(data.body) }
29
+ response = Transport::File.transport(path: temp_file.path).finish
30
+ temp_file.unlink
31
+ else
32
+ raise 'No Data at endpoint'
33
+ end
34
+ response
35
+ rescue => e
36
+ raise e if e.class == SocketError
37
+ end
38
+
39
+ private
40
+ def bad_request?(code)
41
+ (400..499).member?(status_code(code))
42
+ end
43
+
44
+ def server_unavailable?(code)
45
+ (500..599).member?(status_code(code))
46
+ end
47
+
48
+ def success?(code)
49
+ (200..399).member?(status_code(code))
50
+ end
51
+
52
+ def status_code(code)
53
+ Integer(code) rescue nil
54
+ end
55
+
56
+ def value(code, value)
57
+ {":#{code}" => value}
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,6 @@
1
+ module Higo
2
+ module Transport
3
+ autoload :File, 'higo/transport/file'
4
+ autoload :Web, 'higo/transport/web'
5
+ end
6
+ end
data/lib/higo/version.rb CHANGED
@@ -3,7 +3,7 @@ module Higo
3
3
  Major = 0
4
4
  Minor = 0
5
5
  Tiny = 1
6
- Pre = "alpha"
6
+ Pre = nil
7
7
 
8
8
  String = [Major, Minor, Tiny, Pre].compact.join(".")
9
9
  end
data/lib/higo.rb CHANGED
@@ -22,7 +22,16 @@
22
22
  #
23
23
  # See https://github.com/rhodee/higo for updates.
24
24
  #
25
+ #
26
+ # stdlib
27
+ require 'pathname'
28
+ require 'fiber'
29
+ require 'uri'
30
+ require 'net/https'
31
+ require 'tempfile'
32
+
25
33
  module Higo
26
- autoload :Version, 'higo/version'
27
- autoload :Configurable, 'higo/configurable'
34
+ autoload :Version, 'higo/version'
35
+ autoload :Configurable, 'higo/configurable'
36
+ autoload :Transport, 'higo/transport'
28
37
  end
@@ -10,4 +10,20 @@ class TestConfigurable < Higo::TestCase
10
10
  assert_includes @configuration.methods, :foo?
11
11
  assert_includes @configuration.methods, :foo=
12
12
  end
13
+
14
+ def test_file_read
15
+ @configuration = Higo::Configurable.configure(path: 'test/support/config_values.txt')
16
+
17
+ assert_includes @configuration.methods, :username?
18
+ assert_includes @configuration.methods, :username=
19
+ end
20
+
21
+ def test_config_merge
22
+ @configuration = Higo::Configurable.configure(path: 'test/support/config_values.txt') do |conf|
23
+ conf.foo = 'whooaaaaa'
24
+ end
25
+
26
+ assert_includes @configuration.methods, :foo
27
+ assert_includes @configuration.methods, :username?
28
+ end
13
29
  end
@@ -0,0 +1,18 @@
1
+ require_relative './test_helper'
2
+ require 'higo/transport/file'
3
+
4
+ class TestFileTransport < Higo::TestCase
5
+ def test_file_path
6
+ resource = Higo::Transport::File.new(path: 'test/support/config_values.txt')
7
+ assert_instance_of Pathname, resource.path
8
+ end
9
+
10
+ def test_file_path_error
11
+ assert_raises(RuntimeError) { Higo::Transport::File.new(path: 'test/support/no_file_here.txt') }
12
+ end
13
+
14
+ def test_file_read
15
+ results = Higo::Transport::File.transport(path: 'test/support/config_values.txt').finish
16
+ refute_equal true, results.empty?
17
+ end
18
+ end
data/test/test_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require File.expand_path("../lib/higo", File.dirname(__FILE__))
2
2
 
3
3
  # Load support files
4
- Dir.glob(File.expand_path('./support/*', File.dirname(__FILE__))) {|file| require file }
4
+ Dir.glob(File.expand_path('./support/*.rb', File.dirname(__FILE__))) {|file| require file }
5
5
 
6
6
  require 'minitest/autorun'
7
7
  require 'minitest/pride'
@@ -0,0 +1,26 @@
1
+ require_relative './test_helper'
2
+ require 'higo/transport/web'
3
+
4
+ class TestWebTransport < Higo::TestCase
5
+
6
+ def setup
7
+ @web_request = Higo::Transport::Web.new(path: 'https://gist.githubusercontent.com/rhodee/9732239/raw/356c3877c5055a19b11ed6ed083387c7cd78cdf7/test.txt')
8
+ end
9
+
10
+ def teardown
11
+ @web_request = nil
12
+ end
13
+
14
+ def test_transport_retrieval
15
+ assert @web_request.path.to_s =~ /http/
16
+ end
17
+
18
+ def test_resource_path_error
19
+ assert_raises(SocketError) { Higo::Transport::Web.transport(path: 'http://www.notaresource.comz').finish }
20
+ end
21
+
22
+ def test_file_read
23
+ results = Higo::Transport::Web.transport(path: @web_request.path.to_s).finish
24
+ refute_equal true, results.empty?
25
+ end
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: higo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - rhodee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-23 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yard
@@ -134,11 +134,16 @@ files:
134
134
  - higo.gemspec
135
135
  - lib/higo.rb
136
136
  - lib/higo/configurable.rb
137
+ - lib/higo/transport.rb
138
+ - lib/higo/transport/file.rb
139
+ - lib/higo/transport/web.rb
137
140
  - lib/higo/version.rb
138
141
  - test/test_configurable.rb
142
+ - test/test_file_transport.rb
139
143
  - test/test_helper.rb
140
- - test/test_higo_inheritance.rb
144
+ - test/test_higo_included.rb
141
145
  - test/test_higo_subclass.rb
146
+ - test/test_web_transport.rb
142
147
  homepage: https://github.com/rhodee/higo
143
148
  licenses:
144
149
  - MIT
@@ -154,12 +159,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
154
159
  version: '0'
155
160
  required_rubygems_version: !ruby/object:Gem::Requirement
156
161
  requirements:
157
- - - ">"
162
+ - - ">="
158
163
  - !ruby/object:Gem::Version
159
- version: 1.3.1
164
+ version: '0'
160
165
  requirements: []
161
166
  rubyforge_project:
162
- rubygems_version: 2.2.0
167
+ rubygems_version: 2.2.2
163
168
  signing_key:
164
169
  specification_version: 4
165
170
  summary: A (soon) to be highly configurable configuration manager.