hosts 0.1.0

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