readme 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.
data/.ruby ADDED
@@ -0,0 +1,71 @@
1
+ ---
2
+ source:
3
+ - var
4
+ authors:
5
+ - name: Trans
6
+ email: transfire@gmail.com
7
+ copyrights:
8
+ - holder: Rubyworks
9
+ year: '2011'
10
+ license: BSD-2-Clause
11
+ replacements: []
12
+ alternatives: []
13
+ requirements:
14
+ - name: detroit
15
+ groups:
16
+ - build
17
+ development: true
18
+ - name: reap
19
+ groups:
20
+ - build
21
+ development: true
22
+ - name: mast
23
+ groups:
24
+ - test
25
+ development: true
26
+ - name: rubytest
27
+ groups:
28
+ - test
29
+ development: true
30
+ - name: citron
31
+ groups:
32
+ - test
33
+ development: true
34
+ - name: ae
35
+ groups:
36
+ - test
37
+ development: true
38
+ - name: simplecov
39
+ groups:
40
+ - test
41
+ development: true
42
+ dependencies: []
43
+ conflicts: []
44
+ repositories:
45
+ - uri: git://github.com/rubyworks/readme.git
46
+ scm: git
47
+ name: upstream
48
+ resources:
49
+ home: http://rubyworks.github.com/readme
50
+ code: http://github.com/rubyworks/readme
51
+ bugs: http://github.com/rubyworks/readme/issues
52
+ mail: http://groups.google.com/groups/rubyworks-mailinglist
53
+ extra: {}
54
+ load_path:
55
+ - lib
56
+ revision: 0
57
+ created: '2009-07-22'
58
+ summary: Extract information from README files.
59
+ title: Readme
60
+ version: 0.1.0
61
+ name: readme
62
+ description: ! 'Ever thought perhaps that all the effect in creating a good README,
63
+ while
64
+
65
+ great for your end-userss, did''t every do you a hill of beans worth of good
66
+
67
+ when it came to constructing your project''s metadata. Well, hang on to your
68
+
69
+ nerd glasses! Here comes a gem that does just that!'
70
+ organization: rubyworks
71
+ date: '2012-02-08'
@@ -0,0 +1,10 @@
1
+ # Release History
2
+
3
+ ## 0.1.0 | 2011-01-01
4
+
5
+ First release of Readme project, spun-off from the Ruby POM project.
6
+
7
+ Changes:
8
+
9
+ * Happy first release day!
10
+
@@ -0,0 +1,52 @@
1
+ # README
2
+
3
+ [Website](http://rubyworks.github.com/readme) /
4
+ [Development](http://github.com/rubyworks/readme) /
5
+ [Issue Tracker](http://github.com/rubyworks/readme/issues) /
6
+ [Mailing List](http://groups.google.com/groups/rubyworks-mailinglist)
7
+
8
+ [![Build Status](https://secure.travis-ci.org/rubyworks/readme.png)](http://travis-ci.org/rubyworks/readme)
9
+
10
+
11
+ ## Description
12
+
13
+ Ever thought perhaps that all the effect in creating a good README, while
14
+ great for your end-users, didn't every do you a hill of beans worth of good
15
+ when it came to constructing your project's metadata. Well, hang on to your
16
+ nerd glasses! Here comes a gem that does just that!
17
+
18
+ Okay, don't get too excited just yet. Readme's heuristics are rather limited
19
+ thus far, but with time and contribution she'll be right fine in the not
20
+ to distant future.
21
+
22
+
23
+ ## Instruction
24
+
25
+ The library is about as easy to use as you can imagine.
26
+
27
+ require 'readme'
28
+
29
+ readme = Readme.file
30
+
31
+ readme.name
32
+ readme.description
33
+ readme.copyright
34
+
35
+ It also come with a command line client to pump out the data into variant
36
+ formats, such a YAML, JSON and even Ruby code.
37
+
38
+ $ readme --yaml
39
+
40
+ $ readme description
41
+
42
+ See the [API documentation](http:/rubydoc.info/gems/readme) and `readme --help` for more information.
43
+
44
+
45
+ ## Copyright
46
+
47
+ Copyright (c) 2009 Rubyworks. All rights reserved.
48
+
49
+ Readme can be redistributed in accordance with the **BSD-2-Clause** license.
50
+
51
+ See COPYING.md file for details.
52
+
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'readme'
3
+ Readme.cli(*ARGV)
@@ -0,0 +1,287 @@
1
+ # Readme is designed to parse a README file applying various hueristics
2
+ # in order to descern metadata about a project.
3
+ #
4
+ # The heuristics are fairly simplistic at this point, but will improve
5
+ # with time and contribution.
6
+ #
7
+ class Readme
8
+
9
+ if RUBY_VERSION < '1.9'
10
+ require 'readme/version'
11
+ require 'readme/cli'
12
+ else
13
+ require_relative 'readme/version'
14
+ require_relative 'readme/cli'
15
+ end
16
+
17
+ # File glob for matching README file.
18
+ FILE_PATTERN = "README{,.*}"
19
+
20
+ #
21
+ def self.file(path=Dir.pwd)
22
+ if File.directory?(path)
23
+ path = Dir.glob(File.join(path, FILE_PATTERN), File::FNM_CASEFOLD).first
24
+ end
25
+ if path
26
+ new(File.read(path), path)
27
+ else
28
+ raise IOError, "no such README -- #{path}"
29
+ end
30
+ end
31
+
32
+ #
33
+ def initialize(text, file=nil)
34
+ @text = text
35
+ @file = file
36
+ @data = {}
37
+ parse
38
+ end
39
+
40
+ #
41
+ # The ERADME file path, if provided.
42
+ #
43
+ attr :file
44
+
45
+ #
46
+ # The README text.
47
+ #
48
+ attr :text
49
+
50
+ #
51
+ # Location of README file, if file was provided.
52
+ #
53
+ # @return [String] Directory of README file
54
+ #
55
+ def root
56
+ File.dirname(file) if file
57
+ end
58
+
59
+ #
60
+ # The full README text.
61
+ #
62
+ # @return [String] The complete README text.
63
+ #
64
+ def to_s
65
+ text.to_s
66
+ end
67
+
68
+ #
69
+ # Access to underlying parse table.
70
+ #
71
+ def [](name)
72
+ @data[name.to_s]
73
+ #return nil unless file
74
+ #if respond_to?(name)
75
+ # __send__(name)
76
+ #else
77
+ # nil
78
+ #end
79
+ end
80
+
81
+ #
82
+ def name
83
+ @data['name']
84
+ end
85
+
86
+ #
87
+ def title
88
+ @data['title']
89
+ end
90
+
91
+ #
92
+ def description
93
+ @data['description']
94
+ end
95
+
96
+ #
97
+ def license
98
+ @data['license']
99
+ end
100
+
101
+ #
102
+ def copyright
103
+ @data['copyright']
104
+ end
105
+
106
+ #
107
+ def authors
108
+ @data['authors']
109
+ end
110
+
111
+ #
112
+ def resources
113
+ @data['resources'] ||= {}
114
+ end
115
+
116
+ #
117
+ def homepage
118
+ resources['home']
119
+ end
120
+
121
+ #
122
+ def wiki
123
+ resources['wiki']
124
+ end
125
+
126
+ #
127
+ def issues
128
+ resources['issues']
129
+ end
130
+
131
+ #
132
+ # Return file extension of README. Even if the file has no extension,
133
+ # this method will look at the contents and try to determine it.
134
+ #
135
+ # @todo Improve type heuristics.
136
+ #
137
+ # @return [String] Extension type, e.g. `.md`.
138
+ #
139
+ def extname
140
+ ext = File.extname(file)
141
+ if ext.empty?
142
+ ext = '.rdoc' if /^\=/ =~ text
143
+ ext = '.md' if /^\#/ =~ text
144
+ end
145
+ return ext
146
+ end
147
+
148
+ #
149
+ # Access to a copy of the underlying parse table.
150
+ #
151
+ # @return [Hash] Copy of the underlying table.
152
+ #
153
+ def to_h
154
+ @data.dup
155
+ end
156
+
157
+ private
158
+
159
+ #
160
+ def parse
161
+ parse_title
162
+ parse_description
163
+ parse_license
164
+ parse_copyright
165
+ parse_resources
166
+ end
167
+
168
+ #
169
+ def parse_title
170
+ if md = /^[=#]\s*(.*?)$/m.match(text)
171
+ title = md[1].strip
172
+ @data['title'] = title
173
+ @data['name'] = title.downcase.gsub(/\s+/, '_')
174
+ end
175
+ end
176
+
177
+ #
178
+ def parse_description
179
+ if md = /[=#]+\s*(DESCRIPTION|ABSTRACT)[:]*(.*?)[=#]/mi.match(text)
180
+ @data['description'] = md[2].strip #.sub("\n", ' ') # unfold instead of sub?
181
+ else
182
+ d = []
183
+ o = false
184
+ text.split("\n").each do |line|
185
+ if o
186
+ if /^(\w|\s*$)/ !~ line
187
+ break d
188
+ else
189
+ d << line
190
+ end
191
+ else
192
+ if /^\w/ =~ line
193
+ d << line
194
+ o = true
195
+ end
196
+ end
197
+ end
198
+ @data['description'] = d.join(' ').strip
199
+ end
200
+ end
201
+
202
+ #
203
+ def parse_license
204
+ if md = /[=]+\s*(LICENSE)/i.match(text)
205
+ section = md.post_match
206
+ @data['license'] = (
207
+ case section
208
+ when /LGPL/
209
+ "LGPL"
210
+ when /GPL/
211
+ "GPL"
212
+ when /MIT/
213
+ "MIT"
214
+ when /BSD/
215
+ "BSD"
216
+ end
217
+ )
218
+ end
219
+ end
220
+
221
+ #
222
+ def parse_copyright
223
+ md = /Copyright.*?\d+(.*?)$/.match(text)
224
+ if md
225
+ copyright = md[0]
226
+
227
+ authors = md[1].split(/(and|\&|\,)/).map{|a|a.strip}
228
+ authors = authors.map{ |a| a.sub(/all rights reserved\.?/i, '').strip.chomp('.') }
229
+
230
+ @data['copyright'] = copyright
231
+ @data['authors'] = authors
232
+ end
233
+ end
234
+
235
+ #
236
+ def parse_resources
237
+ @data['resources'] = {}
238
+
239
+ scan_for_github
240
+ scan_for_google_groups
241
+
242
+ text.scan(/(\w+)\:\s*(http:.*?[\w\/])$/) do |m|
243
+ @data['resources'][$1] = $2
244
+ end
245
+ end
246
+
247
+ #
248
+ # TODO: Improve on github matching.
249
+ def scan_for_github
250
+ text.scan(/http\:.*?github\.com.*?[">)\s]/) do |m|
251
+ case m
252
+ when /wiki/
253
+ @data['resources']['wiki'] = m[0...-1]
254
+ when /issues/
255
+ @data['resources']['issues'] = m[0...-1]
256
+ else
257
+ if m[0] =~ /:\/\/github/
258
+ @data['resources']['code'] = m[0...-1]
259
+ else
260
+ @data['resources']['home'] = m[0...-1]
261
+ end
262
+ end
263
+ end
264
+ end
265
+
266
+ #
267
+ def scan_for_google_groups
268
+ if m = /http\:.*?groups\.google\.com.*?[">)\s]/.match(text)
269
+ @data['resources']['mail'] = m[0][0...-1]
270
+ end
271
+ end
272
+
273
+ #
274
+ # TODO: parse readme into sections of [label, text].
275
+ #def sections
276
+ # @sections ||= (
277
+ # secs = text.split(/^(==|##)/)
278
+ # secs.map do |sec|
279
+ # i = sec.index("\n")
280
+ # n = sec[0..i].sub(/^[=#]*/, '')
281
+ # t = sec[i+1..-1]
282
+ # [n, t]
283
+ # end
284
+ # )
285
+ #end
286
+ end
287
+
@@ -0,0 +1,59 @@
1
+ class Readme
2
+
3
+ require 'optparse'
4
+
5
+ def self.cli(*argv)
6
+ format = nil
7
+ name = nil
8
+
9
+ OptionParser.new do |opt|
10
+ opt.banner = 'Usage: readme [option] [field]'
11
+ opt.on('-y', '--yml', '--yaml', 'return in YAML format') do
12
+ format = :yaml
13
+ end
14
+ opt.on('-j', '--json', 'return in JSON format') do
15
+ format = :json
16
+ end
17
+ opt.on('-r', '--ruby', 'return in Ruby code format') do
18
+ format = :ruby
19
+ end
20
+ opt.on_tail('-h', '--help', 'show this help message') do
21
+ puts opt
22
+ exit
23
+ end
24
+ end.parse!(argv)
25
+
26
+ if argv.first
27
+ name = argv.shift
28
+ data = Readme.file[name]
29
+ else
30
+ if format
31
+ data = Readme.file.to_h
32
+ else
33
+ data = Readme.file
34
+ end
35
+ end
36
+
37
+ case format
38
+ when :yaml
39
+ require 'yaml'
40
+ puts data.to_yaml
41
+ when :json
42
+ require 'json'
43
+ puts data.to_json
44
+ when :ruby
45
+ data = {name => data} if name
46
+ data.each do |k,v|
47
+ case v
48
+ when Hash
49
+ puts "#{k} #{v.inspect[1...-1]}"
50
+ else
51
+ puts "#{k} #{v.inspect}"
52
+ end
53
+ end
54
+ else
55
+ puts data #Readme.file.to_s
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,3 @@
1
+ class Readme
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: readme
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Trans
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: detroit
16
+ requirement: &20548700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *20548700
25
+ - !ruby/object:Gem::Dependency
26
+ name: reap
27
+ requirement: &20548060 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *20548060
36
+ - !ruby/object:Gem::Dependency
37
+ name: mast
38
+ requirement: &20547460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *20547460
47
+ - !ruby/object:Gem::Dependency
48
+ name: rubytest
49
+ requirement: &20546860 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *20546860
58
+ - !ruby/object:Gem::Dependency
59
+ name: citron
60
+ requirement: &20546260 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *20546260
69
+ - !ruby/object:Gem::Dependency
70
+ name: ae
71
+ requirement: &20545680 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *20545680
80
+ - !ruby/object:Gem::Dependency
81
+ name: simplecov
82
+ requirement: &20545100 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *20545100
91
+ description: ! 'Ever thought perhaps that all the effect in creating a good README,
92
+ while
93
+
94
+ great for your end-userss, did''t every do you a hill of beans worth of good
95
+
96
+ when it came to constructing your project''s metadata. Well, hang on to your
97
+
98
+ nerd glasses! Here comes a gem that does just that!'
99
+ email:
100
+ - transfire@gmail.com
101
+ executables:
102
+ - readme
103
+ extensions: []
104
+ extra_rdoc_files:
105
+ - HISTORY.md
106
+ - README.md
107
+ files:
108
+ - .ruby
109
+ - bin/readme
110
+ - lib/readme/cli.rb
111
+ - lib/readme/version.rb
112
+ - lib/readme.rb
113
+ - HISTORY.md
114
+ - README.md
115
+ homepage: http://rubyworks.github.com/readme
116
+ licenses:
117
+ - BSD-2-Clause
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ required_rubygems_version: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 1.8.11
137
+ signing_key:
138
+ specification_version: 3
139
+ summary: Extract information from README files.
140
+ test_files: []