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.
Binary file
@@ -0,0 +1,12 @@
1
+ # Project metadata
2
+ nbproject
3
+ .idea
4
+
5
+ Gemfile.lock
6
+
7
+ doc
8
+ coverage
9
+ pkg
10
+ .yardoc
11
+ .rbx
12
+ *.rbc
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,8 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx-18mode
6
+ - rbx-19mode
7
+ - jruby-18mode
8
+ - jruby-19mode
@@ -0,0 +1,5 @@
1
+ --protected
2
+ --no-private
3
+ -
4
+ HISTORY.md
5
+ LICENSE.md
data/Gemfile ADDED
@@ -0,0 +1,23 @@
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
+ source 'http://rubygems.org'
21
+
22
+ # Specify your gem's dependencies in weekling.gemspec
23
+ gemspec
@@ -0,0 +1,6 @@
1
+ 0.1.0 / 2012-04-04
2
+ ==================
3
+
4
+ * 1 major enhancement
5
+
6
+ * Birthday!
@@ -0,0 +1,15 @@
1
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
2
+
3
+ Hosts is licensed under the following ISC-style license:
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
11
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,347 @@
1
+ Hosts
2
+ =====
3
+
4
+ [![Build Status](https://secure.travis-ci.org/aef/hosts.png)](
5
+ https://secure.travis-ci.org/aef/hosts)
6
+
7
+ * [Documentation][docs]
8
+ * [Project][project]
9
+
10
+ [docs]: http://rdoc.info/github/aef/hosts/
11
+ [project]: https://github.com/aef/hosts/
12
+
13
+ Description
14
+ -----------
15
+
16
+ Hosts is a Ruby library able to read or manipulate the operating system's host
17
+ files. When manipulating it tries to preserve their original formatting.
18
+
19
+ Features / Problems
20
+ -------------------
21
+
22
+ This project tries to conform to:
23
+
24
+ * [Semantic Versioning (2.0.0-rc.1)][semver]
25
+ * [Ruby Packaging Standard (0.5-draft)][rps]
26
+ * [Ruby Style Guide][style]
27
+ * [Gem Packaging: Best Practices][gem]
28
+
29
+ [semver]: http://semver.org/
30
+ [rps]: http://chneukirchen.github.com/rps/
31
+ [style]: https://github.com/bbatsov/ruby-style-guide
32
+ [gem]: http://weblog.rubyonrails.org/2009/9/1/gem-packaging-best-practices
33
+
34
+ Additional facts:
35
+
36
+ * Written purely in Ruby.
37
+ * Documented with YARD.
38
+ * Intended to be used with Ruby 1.8.7 or higher.
39
+ * Cryptographically signed gem and git tags.
40
+
41
+ Synopsis
42
+ --------
43
+
44
+ This documentation defines the public interface of the software. Don't rely
45
+ on elements marked as private. Those should be hidden in the documentation
46
+ by default.
47
+
48
+ This is still experimental software, even the public interface may change
49
+ substantially in future releases.
50
+
51
+ ### Loading
52
+
53
+ In most cases you want to load the library by the following command:
54
+
55
+ ~~~~~ ruby
56
+ require 'hosts'
57
+ ~~~~~
58
+
59
+ In a bundler Gemfile you should use the following:
60
+
61
+ ~~~~~ ruby
62
+ gem 'hosts'
63
+ ~~~~~
64
+
65
+ ### Reading a hosts file
66
+
67
+ You can either read a hosts file from the file system:
68
+
69
+ ~~~~~ ruby
70
+ hosts = Hosts::File.read('/etc/hosts')
71
+ ~~~~~
72
+
73
+ Or you can parse a String containing the content of a hosts file:
74
+
75
+ ~~~~~ ruby
76
+ hosts = Hosts::File.parse(hosts_content)
77
+ ~~~~~
78
+
79
+ ### Elements
80
+
81
+ Afterwards the hosts file's elements are accessible through the elements attribute:
82
+
83
+ ~~~~~ ruby
84
+ hosts.elements
85
+ # => [ #<Aef::Hosts::Entry: address="127.0.0.1" name="localhost" aliases=[] comment=nil cached!>,
86
+ # #<Aef::Hosts::EmptyElement: cached!>,
87
+ # #<Aef::Hosts::Entry: address="192.168.1.1" name="myhost" aliases=["myhost.mydomain"] comment=" Some comment" cached!>
88
+ # ]
89
+ ~~~~~
90
+
91
+ Elements can simply be appended to the existing elements array:
92
+
93
+ ~~~~~ ruby
94
+ hosts.elements << new_element
95
+ hosts.elements += new_elements
96
+ ~~~~~
97
+
98
+ Or you can insert elements at specific positions:
99
+
100
+ ~~~~~ ruby
101
+ hosts.elements.insert(0, new_element)
102
+ ~~~~~
103
+
104
+ There are four different types of elements for a hosts file:
105
+
106
+ #### Entry
107
+
108
+ The Entry is the most common element of a hosts file. A single entry has
109
+ an address, a name and optionally an unlimited amount of alias names and a
110
+ comment.
111
+
112
+ ~~~~~ ruby
113
+ Hosts::Entry.new('10.23.5.1', 'otherhost',
114
+ :aliases => ['otherhost.mydomain'],
115
+ :comment => ' A new host')
116
+ ~~~~~
117
+
118
+ #### Comment
119
+
120
+ A Comment represents a line containing only a comment.
121
+
122
+ ~~~~~ ruby
123
+ Hosts::Comment.new(' Nothing special')
124
+ ~~~~~
125
+
126
+ #### Section
127
+
128
+ A section has a name and optionally an unlimited amount of inner elements. In
129
+ String representation a section is enclosed by easily distinguishable header
130
+ and footer
131
+
132
+ # ----- BEGIN SECTION somename -----
133
+ # Elements here
134
+ # ----- END SECTION somename -----
135
+
136
+ A section is created by the following:
137
+
138
+ ~~~~~ ruby
139
+ elements
140
+ # => [#<Aef::Hosts::Comment comment=" Elements here">]
141
+
142
+ section = Hosts::Section.new('somename', :elements => elements)
143
+ ~~~~~
144
+
145
+ On an existing Section, elements can be modified in the same way as on a File:
146
+
147
+ ~~~~~ ruby
148
+ section.elements
149
+ # => [#<Aef::Hosts::Comment comment=" Elements here">]
150
+ ~~~~~
151
+
152
+ #### Empty element
153
+
154
+ Also, to represent completly empty lines without abandoning their whitespace
155
+ contents there is an EmptyElement.
156
+
157
+ ~~~~~ ruby
158
+ Hosts::EmptyElement.new
159
+ ~~~~~
160
+
161
+ #### Cache
162
+
163
+ When creating an element you can also specify it's String cache. This is done
164
+ automatically when reading in an existing hosts file. Should you for any reason
165
+ want to do this manually, do it like the following:
166
+
167
+ ~~~~~ ruby
168
+ Hosts::EmptyElement.new(:cache => " \t ")
169
+ ~~~~~
170
+
171
+ Note that the semantics for cache of a Section differ. See the class
172
+ documentation for this.
173
+
174
+ ### Generating a String representation
175
+
176
+ To render the hosts file back into a String simply call the #to_s method:
177
+
178
+ ~~~~~ ruby
179
+ hosts.to_s
180
+ # => " 127.0.0.1\tlocalhost\n \n 192.168.1.1\tmyhost\tmyhost.mydomain\t# Some comment\n"
181
+ ~~~~~
182
+
183
+ If you have read the hosts file from a file system path you can simply save it
184
+ back to this path:
185
+
186
+ ~~~~~ ruby
187
+ hosts.write
188
+ ~~~~~
189
+
190
+ Otherwise, if there is no known path for the file already you can specify one
191
+ for each write operation:
192
+
193
+ ~~~~~ ruby
194
+ hosts.write(:path => '/tmp/hosts')
195
+ ~~~~~
196
+
197
+ Or set the path for all future write operations by setting the path attribute:
198
+
199
+ ~~~~~ ruby
200
+ hosts.path = '/tmp/hosts'
201
+
202
+ hosts.write
203
+ ~~~~~
204
+
205
+ ### String cache
206
+
207
+ Normally, if a cached String representation of an element is available, it will
208
+ be used instead of rendering a new one to preserve the overall layout of the
209
+ hosts file. If you which to generate the whole file from scratch, simply supply
210
+ the :force_generation option:
211
+
212
+ ~~~~~ ruby
213
+ hosts.to_s(:force_generation => true)
214
+ # => "127.0.0.1 localhost\n\n192.168.1.1 myhost myhost.mydomain # Some comment\n"
215
+ ~~~~~
216
+
217
+ Instead of temporarily ignoring the cached String representation you could also
218
+ invalidate the cache completely:
219
+
220
+ ~~~~~ ruby
221
+ hosts.invalidate_cache!
222
+ ~~~~~
223
+
224
+ This can also be done on single elements of the hosts file:
225
+
226
+ ~~~~~ ruby
227
+ hosts.elements[1].invalidate_cache!
228
+ ~~~~~
229
+
230
+ If you change attributes of an element, the cache will be cleaned
231
+ automatically:
232
+
233
+ ~~~~~ ruby
234
+ hosts.elements[0].address = '127.0.1.1'
235
+ ~~~~~
236
+
237
+ Requirements
238
+ ------------
239
+
240
+ * Ruby 1.8.7 or higher
241
+
242
+ Installation
243
+ ------------
244
+
245
+ On *nix systems you may need to prefix the command with sudo to get root
246
+ privileges.
247
+
248
+ ### High security (recommended)
249
+
250
+ There is a high security installation option available through rubygems. It is
251
+ highly recommended over the normal installation, although it may be a bit less
252
+ comfortable. To use the installation method, you will need my [gem signing
253
+ public key][gemkey], which I use for cryptographic signatures on all my gems.
254
+
255
+ Add the key to your rubygems' trusted certificates by the following command:
256
+
257
+ gem cert --add aef-gem.pem
258
+
259
+ Now you can install the gem while automatically verifying it's signature by the
260
+ following command:
261
+
262
+ gem install hosts -P HighSecurity
263
+
264
+ Please notice that you may need other keys for dependent libraries, so you may
265
+ have to install dependencies manually.
266
+
267
+ [gemkey]: http://aef.name/crypto/aef-gem.pem
268
+
269
+ ### Normal
270
+
271
+ gem install hosts
272
+
273
+ ### Automated testing
274
+
275
+ Go into the root directory of the installed gem and run the following command
276
+ to fetch all development dependencies:
277
+
278
+ bundle
279
+
280
+ Afterwards start the test runner:
281
+
282
+ rake spec
283
+
284
+ If something goes wrong you should be noticed through failing examples.
285
+
286
+ Development
287
+ -----------
288
+
289
+ ### Bugs Reports and Feature Requests
290
+
291
+ Please use the [issue tracker][issues] on github.com to let me know about errors
292
+ or ideas for improvement of this software.
293
+
294
+ [issues]: https://github.com/aef/hosts/issues/
295
+
296
+ ### Source code
297
+
298
+ This software is developed in the source code management system git hosted
299
+ at github.com. You can download the most recent sourcecode through the
300
+ following command:
301
+
302
+ git clone https://github.com/aef/hosts.git
303
+
304
+ The final commit before each released gem version will be marked by a tag
305
+ named like the version with a prefixed lower-case "v", as required by Semantic
306
+ Versioning. Every tag will be signed by my [OpenPGP public key][openpgp] which
307
+ enables you to verify your copy of the code cryptographically.
308
+
309
+ [openpgp]: http://aef.name/crypto/aef-openpgp.asc
310
+
311
+ Add the key to your GnuPG keyring by the following command:
312
+
313
+ gpg --import aef-openpgp.asc
314
+
315
+ This command will tell you if your code is of integrity and authentic:
316
+
317
+ git tag -v [TAG NAME]
318
+
319
+ ### Contribution
320
+
321
+ Help on making this software better is always very appreciated. If you want
322
+ your changes to be included in the official release, please clone my project
323
+ on github.com, create a named branch to commit and push your changes into and
324
+ send me a pull request afterwards.
325
+
326
+ Please make sure to write tests for your changes so that I won't break them
327
+ when changing other things on the library. Also notice that I can't promise
328
+ to include your changes before reviewing them.
329
+
330
+ License
331
+ -------
332
+
333
+ Copyright Alexander E. Fischer <aef@raxys.net>, 2012
334
+
335
+ This file is part of Hosts.
336
+
337
+ Permission to use, copy, modify, and/or distribute this software for any
338
+ purpose with or without fee is hereby granted, provided that the above
339
+ copyright notice and this permission notice appear in all copies.
340
+
341
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
342
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
343
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
344
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
345
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
346
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
347
+ PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,48 @@
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 'bundler/gem_tasks'
21
+ require 'rake'
22
+ require 'pathname'
23
+ require 'yard'
24
+ require 'rspec/core/rake_task'
25
+
26
+ RSpec::Core::RakeTask.new
27
+
28
+ YARD::Rake::YardocTask.new('doc')
29
+
30
+ desc "Removes temporary project files"
31
+ task :clean do
32
+ %w{doc coverage pkg .yardoc .rbx Gemfile.lock}.map{|name| Pathname.new(name) }.each do |path|
33
+ path.rmtree if path.exist?
34
+ end
35
+
36
+ Pathname.glob('*.gem').each &:delete
37
+ Pathname.glob('**/*.rbc').each &:delete
38
+ end
39
+
40
+ desc "Opens an interactive console with the library loaded"
41
+ task :console do
42
+ Bundler.setup
43
+ require 'pry'
44
+ require 'hosts'
45
+ Pry.start
46
+ end
47
+
48
+ task :default => :spec