hosts 0.1.0

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.
@@ -0,0 +1,57 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
+
5
+ This file is part of Hosts.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted, provided that the above
9
+ copyright notice and this permission notice appear in all copies.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ =end
19
+
20
+ require File.expand_path('../lib/aef/hosts/version', __FILE__)
21
+
22
+ Gem::Specification.new do |s|
23
+ s.name = 'hosts'
24
+ s.version = Aef::Hosts::VERSION.dup
25
+ s.authors = ['Alexander E. Fischer']
26
+ s.email = ['aef@raxys.net']
27
+ s.homepage = 'http://github.com/aef/hosts'
28
+ s.license = 'ISC'
29
+ s.summary = 'Host file manipulation for Ruby.'
30
+ s.description = <<-DESCRIPTION
31
+ Hosts is a Ruby library able to read or manipulate the operating system's host
32
+ files. When manipulating it tries to preserve their original formatting.
33
+ DESCRIPTION
34
+
35
+ s.rubyforge_project = nil
36
+ s.has_rdoc = 'yard'
37
+ s.extra_rdoc_files = ['HISTORY.md', 'LICENSE.md']
38
+
39
+ s.files = `git ls-files`.lines.map(&:chomp)
40
+ s.test_files = `git ls-files -- {test,spec,features}/*`.lines.map(&:chomp)
41
+ s.executables = `git ls-files -- bin/*`.lines.map{|f| File.basename(f.chomp) }
42
+ s.require_paths = ["lib"]
43
+
44
+ s.required_ruby_version = '>= 1.8.7'
45
+
46
+ s.add_dependency('linebreak', '~> 2.0.0')
47
+
48
+ s.add_development_dependency('bundler', '~> 1.1.0')
49
+ s.add_development_dependency('rake', '~> 0.9.2')
50
+ s.add_development_dependency('rspec', '~> 2.8.0')
51
+ s.add_development_dependency('simplecov', '~> 0.6.1')
52
+ s.add_development_dependency('pry', '~> 0.9.8')
53
+ s.add_development_dependency('yard', '~> 0.7.5')
54
+
55
+ s.cert_chain = "#{ENV['GEM_CERT_CHAIN']}".split(':')
56
+ s.signing_key = ENV['GEM_SIGNING_KEY']
57
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
+
5
+ This file is part of Hosts.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted, provided that the above
9
+ copyright notice and this permission notice appear in all copies.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ =end
19
+
20
+ require 'set'
21
+ require 'pathname'
22
+ require 'aef/linebreak'
23
+
24
+ # Namespace for projects of Alexander E. Fischer <aef@raxys.net>.
25
+ #
26
+ # If you want to be able to simply type Example instead of Aef::Example to
27
+ # address classes in this namespace simply write the following before using the
28
+ # classes.
29
+ #
30
+ # @example Including the namespace
31
+ # include Aef
32
+ # @author Alexander E. Fischer
33
+ module Aef
34
+
35
+ # Namespace for the hosts library
36
+ module Hosts
37
+
38
+ # An exception for errors happening while parsing a hosts file
39
+ class ParserError < RuntimeError; end
40
+ end
41
+ end
42
+
43
+ require 'aef/hosts/version'
44
+ require 'aef/hosts/helpers'
45
+ require 'aef/hosts/file'
46
+ require 'aef/hosts/element'
47
+ require 'aef/hosts/section'
48
+ require 'aef/hosts/entry'
49
+ require 'aef/hosts/comment'
50
+ require 'aef/hosts/empty_element'
51
+
@@ -0,0 +1,73 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
+
5
+ This file is part of Hosts.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted, provided that the above
9
+ copyright notice and this permission notice appear in all copies.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ =end
19
+
20
+ require 'aef/hosts'
21
+
22
+ module Aef
23
+ module Hosts
24
+
25
+ # Represents a comment-only line as element of a hosts file
26
+ class Comment < Element
27
+
28
+ # The comment
29
+ #
30
+ # @return [String]
31
+ attr_reader :comment
32
+
33
+ # Initializes a comment
34
+ #
35
+ # @param comment [String] the comment
36
+ # @param options [Hash]
37
+ # @option options [String] :cache sets a cached String representation
38
+ def initialize(comment, options = {})
39
+ validate_options(options, :cache)
40
+
41
+ raise ArgumentError, 'Comment cannot be empty' unless comment
42
+
43
+ @comment = comment.to_s
44
+ @cache = options[:cache].to_s unless options[:cache].nil?
45
+ end
46
+
47
+ # Sets the comment
48
+ def comment=(comment)
49
+ set_if_changed(:comment, comment.to_s) do
50
+ invalidate_cache!
51
+ end
52
+ end
53
+
54
+ # A String representation for debugging purposes
55
+ #
56
+ # @return [String]
57
+ def inspect
58
+ generate_inspect(self, :comment, :cache)
59
+ end
60
+
61
+ protected
62
+
63
+ # Defines the algorithm to generate a String representation from scratch.
64
+ #
65
+ # @return [String] a generated String representation
66
+ def generate_string(options = {})
67
+ "##{comment}\n"
68
+ end
69
+ end
70
+
71
+ end
72
+ end
73
+
@@ -0,0 +1,108 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
+
5
+ This file is part of Hosts.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted, provided that the above
9
+ copyright notice and this permission notice appear in all copies.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ =end
19
+
20
+ require 'aef/hosts'
21
+
22
+ module Aef
23
+ module Hosts
24
+
25
+ # The base class for elements which are aggregated by the Aef::Hosts::File
26
+ # class.
27
+ #
28
+ # @abstract This class is not supposed to be instantiated.
29
+ class Element
30
+
31
+ include Helpers
32
+
33
+ # Cached String representation
34
+ #
35
+ # @return [String, Hash, nil]
36
+ attr_reader :cache
37
+
38
+ # Deletes the cached String representation
39
+ #
40
+ # @return [Aef::Hosts::Element] a self reference
41
+ def invalidate_cache!
42
+ @cache = nil
43
+
44
+ self
45
+ end
46
+
47
+ # Tells if a String representation is cached or not
48
+ #
49
+ # @return [true, false] true if cache is not empty
50
+ def cache_filled?
51
+ @cache ? true : false
52
+ end
53
+
54
+ # A String representation for debugging purposes
55
+ #
56
+ # @return [String]
57
+ def inspect
58
+ generate_inspect(self, :cache)
59
+ end
60
+
61
+ # Provides a String representation of the element
62
+ #
63
+ # @param [Hash] options
64
+ # @option options [true, false] :force_generation if set to true, the
65
+ # cache won't be used, even if it not empty
66
+ # @option options [:unix, :windows, :mac] :linebreak_encoding the
67
+ # linebreak encoding of the result. If nothing is specified the result
68
+ # will be encoded as if :unix was specified.
69
+ # @see Aef::Linebreak#encode
70
+ def to_s(options = {})
71
+ validate_options(options, :force_generation, :linebreak_encoding)
72
+
73
+ string = ''
74
+
75
+ if !cache_filled? || options[:force_generation]
76
+ string << generate_string(options)
77
+ else
78
+ string << cache_string(options)
79
+ end
80
+
81
+ if options[:linebreak_encoding]
82
+ string = Aef::Linebreak.encode(string, options[:linebreak_encoding])
83
+ end
84
+
85
+ string
86
+ end
87
+
88
+ protected
89
+
90
+ # Defines the algorithm to generate a String representation from scratch.
91
+ #
92
+ # @abstract This method needs to be implemented in descendant classes.
93
+ # @return [String] a generated String representation
94
+ def generate_string(options = {})
95
+ raise NotImplementedError
96
+ end
97
+
98
+ # Defines the algorithm to construct the String representation from cache
99
+ #
100
+ # @return [String] the cached String representation
101
+ def cache_string(options = {})
102
+ @cache.dup
103
+ end
104
+ end
105
+
106
+ end
107
+ end
108
+
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
+
5
+ This file is part of Hosts.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted, provided that the above
9
+ copyright notice and this permission notice appear in all copies.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ =end
19
+
20
+ require 'aef/hosts'
21
+
22
+ module Aef
23
+ module Hosts
24
+
25
+ # Represents an empty line as element of a hosts file
26
+ class EmptyElement < Element
27
+
28
+ # Initializes an empty Element
29
+ #
30
+ # @param [Hash] options
31
+ # @option options [String] :cache sets a cached String representation
32
+ def initialize(options = {})
33
+ validate_options(options, :cache)
34
+
35
+ @cache = options[:cache].to_s unless options[:cache].nil?
36
+ end
37
+
38
+ protected
39
+
40
+ # Defines the algorithm to generate a String representation from scratch.
41
+ #
42
+ # @return [String] a generated String representation
43
+ def generate_string(options = {})
44
+ "\n"
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+
@@ -0,0 +1,123 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
+
5
+ This file is part of Hosts.
6
+
7
+ Permission to use, copy, modify, and/or distribute this software for any
8
+ purpose with or without fee is hereby granted, provided that the above
9
+ copyright notice and this permission notice appear in all copies.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
+ PERFORMANCE OF THIS SOFTWARE.
18
+ =end
19
+
20
+ require 'aef/hosts'
21
+
22
+ module Aef
23
+ module Hosts
24
+
25
+ # Represents an entry line as element of a hosts file
26
+ class Entry < Element
27
+
28
+ # The network address
29
+ #
30
+ # @return [String]
31
+ attr_reader :address
32
+
33
+ # The primary hostname for the address
34
+ #
35
+ # @return [String]
36
+ attr_reader :name
37
+
38
+ # Optional comment
39
+ #
40
+ # @return [String]
41
+ attr_reader :comment
42
+
43
+ # Optional alias hostnames
44
+ #
45
+ # @return [Array<String>]
46
+ attr_reader :aliases
47
+
48
+ # Initializes an entry.
49
+ #
50
+ # @param [String] address the network address
51
+ # @param [String] name the primary hostname for the address
52
+ # @param [Hash] options
53
+ # @option options [Array<String>] :aliases a list of aliases for the
54
+ # address
55
+ # @option options [String] :comment a comment for the entry
56
+ # @option options [String] :cache a cached String representation
57
+ def initialize(address, name, options = {})
58
+ validate_options(options, :aliases, :comment, :cache)
59
+
60
+ raise ArgumentError, 'Address cannot be empty' unless address
61
+ raise ArgumentError, 'Name cannot be empty' unless name
62
+
63
+ @address = address.to_s
64
+ @name = name.to_s
65
+ @aliases = options[:aliases] || []
66
+ @comment = options[:comment].to_s unless options[:comment].nil?
67
+ @cache = options[:cache].to_s unless options[:cache].nil?
68
+ end
69
+
70
+ # Sets the network address
71
+ def address=(address)
72
+ set_if_changed(:address, address.to_s) do
73
+ invalidate_cache!
74
+ end
75
+ end
76
+
77
+ # Sets the primary hostname for the address
78
+ def name=(name)
79
+ set_if_changed(:name, name.to_s) do
80
+ invalidate_cache!
81
+ end
82
+ end
83
+
84
+ # Sets the optional comment
85
+ def comment=(comment)
86
+ set_if_changed(:comment, comment.to_s) do
87
+ invalidate_cache!
88
+ end
89
+ end
90
+
91
+ # Sets the optional alias hostnames
92
+ def aliases=(aliases)
93
+ set_if_changed(:aliases, [*aliases]) do
94
+ invalidate_cache!
95
+ end
96
+ end
97
+
98
+ # A String representation for debugging purposes
99
+ #
100
+ # @return [String]
101
+ def inspect
102
+ generate_inspect(self, :address, :name, :aliases, :comment, :cache)
103
+ end
104
+
105
+ protected
106
+
107
+ # Defines the algorithm to generate a String representation from scratch.
108
+ #
109
+ # @abstract This method needs to be implemented in descendant classes.
110
+ # @return [String] a generated String representation
111
+ def generate_string(options = nil)
112
+ if comment
113
+ suffix = " ##{comment}\n"
114
+ else
115
+ suffix = "\n"
116
+ end
117
+
118
+ [address, name, *aliases].join(' ') << suffix
119
+ end
120
+
121
+ end
122
+ end
123
+ end