nr 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,2 @@
1
+ pkg
2
+ *.rbc
@@ -0,0 +1,3 @@
1
+ [submodule "task"]
2
+ path = task
3
+ url = git://github.com/godfat/gemgem.git
@@ -0,0 +1,47 @@
1
+ # nr
2
+
3
+ by Lin Jen-Shin ([godfat](http://godfat.org))
4
+
5
+ ## LINKS:
6
+
7
+ * [github](https://github.com/godfat/nr)
8
+ * [rubygems](http://rubygems.org/gems/nr)
9
+ * [rdoc](http://rdoc.info/github/godfat/nr)
10
+
11
+ ## DESCRIPTION:
12
+
13
+ nr -- net received -- The other side of nc
14
+
15
+ Play with `nr localhost 1234` and `nc localhost 1234`
16
+
17
+ ## REQUIREMENTS:
18
+
19
+ * [cool.io][]
20
+
21
+ [cool.io]: https://github.com/tarcieri/cool.io
22
+
23
+ ## INSTALLATION:
24
+
25
+ gem install nr
26
+
27
+ ## SYNOPSIS:
28
+
29
+ Run the server with `nr localhost 1234` and play with `nc localhost 1234`
30
+
31
+ ## LICENSE:
32
+
33
+ Apache License 2.0
34
+
35
+ Copyright (c) 2011, Lin Jen-Shin (godfat)
36
+
37
+ Licensed under the Apache License, Version 2.0 (the "License");
38
+ you may not use this file except in compliance with the License.
39
+ You may obtain a copy of the License at
40
+
41
+ <http://www.apache.org/licenses/LICENSE-2.0>
42
+
43
+ Unless required by applicable law or agreed to in writing, software
44
+ distributed under the License is distributed on an "AS IS" BASIS,
45
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
46
+ See the License for the specific language governing permissions and
47
+ limitations under the License.
@@ -0,0 +1,18 @@
1
+
2
+ require "#{dir = File.dirname(__FILE__)}/task/gemgem"
3
+ Gemgem.dir = dir
4
+
5
+ ($LOAD_PATH << File.expand_path("#{Gemgem.dir}/lib")).uniq!
6
+
7
+ desc 'Generate gemspec'
8
+ task 'gem:spec' do
9
+ Gemgem.spec = Gemgem.create do |s|
10
+ require 'nr/version'
11
+ s.name = 'nr'
12
+ s.version = Nr::VERSION
13
+
14
+ %w[cool.io].each{ |g| s.add_runtime_dependency(g) }
15
+ end
16
+
17
+ Gemgem.write
18
+ end
data/bin/nr ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'nr'
4
+ Nr.start ARGV
@@ -0,0 +1,20 @@
1
+
2
+ require 'cool.io'
3
+
4
+ module Nr
5
+ class Connection < Coolio::TCPSocket
6
+ def on_close
7
+ Coolio::Loop.default.stop
8
+ end
9
+
10
+ def on_read data
11
+ print data
12
+ end
13
+ end
14
+
15
+ def self.start argv
16
+ loop = Coolio::Loop.default
17
+ Coolio::TCPServer.new(argv[0], argv[1].to_i, Connection).attach(loop)
18
+ loop.run
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+
2
+ module Nr
3
+ VERSION = '0.1.0'
4
+ end
@@ -0,0 +1,40 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "nr"
5
+ s.version = "0.1.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Lin Jen-Shin (godfat)"]
9
+ s.date = "2011-09-13"
10
+ s.description = "nr -- net received -- The other side of nc\n\nPlay with `nr localhost 1234` and `nc localhost 1234`"
11
+ s.email = ["godfat (XD) godfat.org"]
12
+ s.executables = ["nr"]
13
+ s.files = [
14
+ ".gitignore",
15
+ ".gitmodules",
16
+ "README.md",
17
+ "Rakefile",
18
+ "bin/nr",
19
+ "lib/nr.rb",
20
+ "lib/nr/version.rb",
21
+ "nr.gemspec",
22
+ "task/.gitignore",
23
+ "task/gemgem.rb"]
24
+ s.homepage = "https://github.com/godfat/nr"
25
+ s.require_paths = ["lib"]
26
+ s.rubygems_version = "1.8.10"
27
+ s.summary = "nr -- net received -- The other side of nc"
28
+
29
+ if s.respond_to? :specification_version then
30
+ s.specification_version = 3
31
+
32
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
33
+ s.add_runtime_dependency(%q<cool.io>, [">= 0"])
34
+ else
35
+ s.add_dependency(%q<cool.io>, [">= 0"])
36
+ end
37
+ else
38
+ s.add_dependency(%q<cool.io>, [">= 0"])
39
+ end
40
+ end
@@ -0,0 +1 @@
1
+ *.rbc
@@ -0,0 +1,265 @@
1
+
2
+ require 'pathname'
3
+
4
+ module Gemgem
5
+ class << self
6
+ attr_accessor :dir, :spec
7
+ end
8
+
9
+ module_function
10
+ def create
11
+ yield(spec = Gem::Specification.new{ |s|
12
+ s.authors = ['Lin Jen-Shin (godfat)']
13
+ s.email = ['godfat (XD) godfat.org']
14
+
15
+ s.description = description.join
16
+ s.summary = description.first
17
+
18
+ s.rubygems_version = Gem::VERSION
19
+ s.date = Time.now.strftime('%Y-%m-%d')
20
+ s.files = gem_files
21
+ s.test_files = gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
22
+ s.executables = Dir['bin/*'].map{ |f| File.basename(f) }
23
+ s.require_paths = %w[lib]
24
+ })
25
+ spec.homepage ||= "https://github.com/godfat/#{spec.name}"
26
+ spec
27
+ end
28
+
29
+ def readme
30
+ path = %w[README.md README].find{ |name|
31
+ File.exist?("#{Gemgem.dir}/#{name}")
32
+ }
33
+ @readme ||=
34
+ if path
35
+ ps = File.read(path).scan(/#+[^\n]+\n\n.+?(?=\n\n#+[^\n]+\n)/m)
36
+ ps.inject({'HEADER' => ps.first}){ |r, s, i|
37
+ r[s[/\w+/]] = s
38
+ r
39
+ }
40
+ else
41
+ {}
42
+ end
43
+ end
44
+
45
+ def description
46
+ @description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
47
+ end
48
+
49
+ def changes
50
+ path = %w[CHANGES.md CHANGES].find{ |name|
51
+ File.exist?("#{Gemgem.dir}/#{name}")
52
+ }
53
+ @changes ||=
54
+ if path
55
+ date = '\d+{4}\-\d+{2}\-\d{2}'
56
+ File.read(path).match(
57
+ /([^\n]+#{date}\n\n(.+?))(?=\n\n[^\n]+#{date}\n)/m)[1]
58
+ else
59
+ ''
60
+ end
61
+ end
62
+
63
+ def ann_md
64
+ "##{readme['HEADER'].sub(/([\w\-]+)/, "[\\1](#{spec.homepage})")}\n\n" \
65
+ "##{readme['DESCRIPTION'][/[^\n]+\n\n[^\n]+/]}\n\n" \
66
+ "### CHANGES:\n\n" \
67
+ "###{changes}\n\n" \
68
+ "##{readme['INSTALLATION']}\n\n" +
69
+ if readme['SYNOPSIS'] then "##{readme['SYNOPSIS']}" else '' end
70
+ end
71
+
72
+ def ann_html
73
+ gem 'nokogiri'
74
+ gem 'kramdown'
75
+
76
+ IO.popen('kramdown', 'r+') do |md|
77
+ md.puts Gemgem.ann_md
78
+ md.close_write
79
+ require 'nokogiri'
80
+ html = Nokogiri::XML.parse("<gemgem>#{md.read}</gemgem>")
81
+ html.css('*').each{ |n| n.delete('id') }
82
+ html.root.children.to_html
83
+ end
84
+ end
85
+
86
+ def ann_email
87
+ "#{readme['HEADER'].sub(/([\w\-]+)/, "\\1 <#{spec.homepage}>")}\n\n" \
88
+ "#{readme['DESCRIPTION']}\n\n" \
89
+ "#{readme['INSTALLATION']}\n\n" +
90
+ if readme['SYNOPSIS'] then "##{readme['SYNOPSIS']}\n\n" else '' end +
91
+ "## CHANGES:\n\n" \
92
+ "##{changes}\n\n"
93
+ end
94
+
95
+ def gem_tag
96
+ "#{spec.name}-#{spec.version}"
97
+ end
98
+
99
+ def write
100
+ File.open("#{dir}/#{spec.name}.gemspec", 'w'){ |f|
101
+ f << split_lines(spec.to_ruby) }
102
+ end
103
+
104
+ def split_lines ruby
105
+ ruby.gsub(/(.+?)\[(.+?)\]/){ |s|
106
+ if $2.index(',')
107
+ "#{$1}[\n #{$2.split(',').map(&:strip).join(",\n ")}]"
108
+ else
109
+ s
110
+ end
111
+ }
112
+ end
113
+
114
+ def all_files
115
+ @all_files ||= find_files(Pathname.new(dir)).map{ |file|
116
+ if file.to_s =~ %r{\.git/}
117
+ nil
118
+ else
119
+ file.to_s
120
+ end
121
+ }.compact.sort
122
+ end
123
+
124
+ def gem_files
125
+ @gem_files ||= all_files - ignored_files
126
+ end
127
+
128
+ def ignored_files
129
+ @ignored_file ||= all_files.select{ |path| ignore_patterns.find{ |ignore|
130
+ path =~ ignore && !git_files.include?(path)}}
131
+ end
132
+
133
+ def git_files
134
+ @git_files ||= if File.exist?("#{dir}/.git")
135
+ `git ls-files`.split("\n")
136
+ else
137
+ []
138
+ end
139
+ end
140
+
141
+ # protected
142
+ def find_files path
143
+ path.children.select(&:file?).map{|file| file.to_s[(dir.size+1)..-1]} +
144
+ path.children.select(&:directory?).map{|dir| find_files(dir)}.flatten
145
+ end
146
+
147
+ def ignore_patterns
148
+ @ignore_files ||= expand_patterns(
149
+ gitignore.split("\n").reject{ |pattern|
150
+ pattern.strip == ''
151
+ }).map{ |pattern| %r{^([^/]+/)*?#{Regexp.escape(pattern)}(/[^/]+)*?$} }
152
+ end
153
+
154
+ def expand_patterns pathes
155
+ pathes.map{ |path|
156
+ if path !~ /\*/
157
+ path
158
+ else
159
+ expand_patterns(
160
+ Dir[path] +
161
+ Pathname.new(File.dirname(path)).children.select(&:directory?).
162
+ map{ |prefix| "#{prefix}/#{File.basename(path)}" })
163
+ end
164
+ }.flatten
165
+ end
166
+
167
+ def gitignore
168
+ if File.exist?(path = "#{dir}/.gitignore")
169
+ File.read(path)
170
+ else
171
+ ''
172
+ end
173
+ end
174
+ end
175
+
176
+ namespace :gem do
177
+
178
+ desc 'Install gem'
179
+ task :install => [:build] do
180
+ sh("#{Gem.ruby} -S gem install pkg/#{Gemgem.gem_tag}")
181
+ end
182
+
183
+ desc 'Build gem'
184
+ task :build => [:spec] do
185
+ sh("#{Gem.ruby} -S gem build #{Gemgem.spec.name}.gemspec")
186
+ sh("mkdir -p pkg")
187
+ sh("mv #{Gemgem.gem_tag}.gem pkg/")
188
+ end
189
+
190
+ desc 'Release gem'
191
+ task :release => [:spec, :check, :build] do
192
+ sh("git tag #{Gemgem.gem_tag}")
193
+ sh("git push")
194
+ sh("git push --tags")
195
+ sh("#{Gem.ruby} -S gem push pkg/#{Gemgem.gem_tag}.gem")
196
+ end
197
+
198
+ task :check do
199
+ ver = Gemgem.spec.version.to_s
200
+
201
+ if ENV['VERSION'].nil?
202
+ puts("\x1b[35mExpected " \
203
+ "\x1b[33mVERSION\x1b[35m=\x1b[33m#{ver}\x1b[m")
204
+ exit(1)
205
+
206
+ elsif ENV['VERSION'] != ver
207
+ puts("\x1b[35mExpected \x1b[33mVERSION\x1b[35m=\x1b[33m#{ver} " \
208
+ "\x1b[35mbut got\n " \
209
+ "\x1b[33mVERSION\x1b[35m=\x1b[33m#{ENV['VERSION']}\x1b[m")
210
+ exit(2)
211
+ end
212
+ end
213
+
214
+ end # of gem namespace
215
+
216
+ desc 'Run tests in memory'
217
+ task :test do
218
+ require 'bacon'
219
+ Bacon.extend(Bacon::TestUnitOutput)
220
+ Bacon.summary_on_exit
221
+ $LOAD_PATH.unshift('lib')
222
+ Dir['./test/**/test_*.rb'].each{ |file| require file[0..-4] }
223
+ end
224
+
225
+ desc 'Run tests with shell'
226
+ task 'test:shell', :RUBY_OPTS do |t, args|
227
+ files = Dir['test/**/test_*.rb'].join(' ')
228
+
229
+ cmd = [Gem.ruby, args[:RUBY_OPTS],
230
+ '-I', 'lib', '-S', 'bacon', '--quiet', files]
231
+
232
+ sh(cmd.compact.join(' '))
233
+ end
234
+
235
+ desc 'Generate ann markdown'
236
+ task 'ann:md' => ['gem:spec'] do
237
+ puts Gemgem.ann_md
238
+ end
239
+
240
+ desc 'Generate ann html'
241
+ task 'ann:html' => ['gem:spec'] do
242
+ puts Gemgem.ann_html
243
+ end
244
+
245
+ desc 'Generate ann email'
246
+ task 'ann:email' => ['gem:spec'] do
247
+ puts Gemgem.ann_email
248
+ end
249
+
250
+ desc 'Generate rdoc'
251
+ task :doc => ['gem:spec'] do
252
+ sh("yardoc -o rdoc --main README.md" \
253
+ " --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
254
+ end
255
+
256
+ desc 'Remove ignored files'
257
+ task :clean => ['gem:spec'] do
258
+ trash = "~/.Trash/#{Gemgem.spec.name}/"
259
+ sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
260
+ Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
261
+ end
262
+
263
+ task :default do
264
+ puts `#{Gem.ruby} -S #{$PROGRAM_NAME} -T`
265
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lin Jen-Shin (godfat)
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-13 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cool.io
16
+ requirement: &2152449000 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2152449000
25
+ description: ! 'nr -- net received -- The other side of nc
26
+
27
+
28
+ Play with `nr localhost 1234` and `nc localhost 1234`'
29
+ email:
30
+ - godfat (XD) godfat.org
31
+ executables:
32
+ - nr
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - .gitignore
37
+ - .gitmodules
38
+ - README.md
39
+ - Rakefile
40
+ - bin/nr
41
+ - lib/nr.rb
42
+ - lib/nr/version.rb
43
+ - nr.gemspec
44
+ - task/.gitignore
45
+ - task/gemgem.rb
46
+ homepage: https://github.com/godfat/nr
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 1.8.10
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: nr -- net received -- The other side of nc
70
+ test_files: []