quarry 0.3.0 → 0.4.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/CHANGES +40 -3
- data/MANIFEST +290 -78
- data/README +51 -37
- data/RELEASE +12 -0
- data/VERSION +1 -1
- data/bin/quarry +117 -0
- data/bin/quarry-doc +26 -0
- data/bin/ruby-break +10 -0
- data/bin/{xact-ruby → ruby-xacto} +0 -0
- data/doc/assets/images/clipboard.jpg +0 -0
- data/doc/assets/images/clipboard2.png +0 -0
- data/doc/assets/images/darksilver.png +0 -0
- data/doc/assets/images/icon/book.jpg +0 -0
- data/doc/assets/images/icon/download.gif +0 -0
- data/doc/assets/images/icon/letter_r.png +0 -0
- data/doc/assets/images/icon/license.png +0 -0
- data/doc/assets/images/icon/software.png +0 -0
- data/doc/assets/images/icon/source.png +0 -0
- data/doc/assets/images/miner.jpg +0 -0
- data/doc/assets/images/rbrylmtrx.png +0 -0
- data/doc/assets/images/ruby.gif +0 -0
- data/doc/assets/images/runneth.png +0 -0
- data/doc/assets/images/silver.gif +0 -0
- data/doc/assets/images/test.jpg +0 -0
- data/doc/assets/jquery/jquery.js +1 -0
- data/doc/assets/jquery/jquery.tabs.js +1 -0
- data/doc/assets/rdoc_ad.html +12 -0
- data/doc/assets/styles/index.css +138 -0
- data/doc/guide/stubs.md +125 -0
- data/doc/index.html +285 -0
- data/doc/log/bstats/stats.html +39 -0
- data/doc/log/notes.xml +32 -0
- data/doc/log/stats.html +25 -0
- data/doc/log/stats.log +14 -0
- data/doc/log/syntax.log +0 -0
- data/doc/rdoc/classes/Assertion/False.html +151 -106
- data/doc/rdoc/classes/Assertion/True.html +128 -113
- data/doc/rdoc/classes/Assertion.html +147 -77
- data/doc/rdoc/classes/Kernel.html +84 -65
- data/doc/rdoc/classes/Method.html +123 -92
- data/doc/rdoc/classes/Object.html +468 -115
- data/doc/rdoc/classes/Quarry/Break.html +231 -0
- data/doc/rdoc/classes/Quarry/Command.html +443 -0
- data/doc/rdoc/classes/Quarry/Extract.html +215 -0
- data/doc/rdoc/classes/Quarry/MethodProbe.html +203 -145
- data/doc/rdoc/classes/Quarry/Mock/Delegator.html +179 -0
- data/doc/rdoc/classes/Quarry/Mock/Setter.html +175 -0
- data/doc/rdoc/classes/Quarry/Mock.html +211 -67
- data/doc/rdoc/classes/Quarry/Spec/Comment.html +237 -0
- data/doc/rdoc/classes/Quarry/Spec/Config.html +257 -0
- data/doc/rdoc/classes/Quarry/Spec/Context.html +154 -0
- data/doc/rdoc/classes/Quarry/Spec/Document.html +382 -0
- data/doc/rdoc/classes/Quarry/Spec/Header.html +195 -0
- data/doc/rdoc/classes/Quarry/Spec/Macro.html +166 -0
- data/doc/rdoc/classes/Quarry/Spec/Markup.html +279 -0
- data/doc/rdoc/classes/Quarry/Spec/Reporter/DotProgress.html +234 -0
- data/doc/rdoc/classes/Quarry/Spec/Reporter/Summary.html +294 -0
- data/doc/rdoc/classes/Quarry/Spec/Reporter/Verbatim.html +311 -0
- data/doc/rdoc/classes/Quarry/Spec/Runner.html +352 -0
- data/doc/rdoc/classes/Quarry/Spec/Step.html +190 -0
- data/doc/rdoc/classes/Quarry/Spec/Template.html +205 -0
- data/doc/rdoc/classes/Quarry/Stub/Delegator.html +179 -0
- data/doc/rdoc/classes/Quarry/Stub/Setter.html +175 -0
- data/doc/rdoc/classes/Quarry/Stub.html +224 -0
- data/doc/rdoc/classes/Quarry.html +153 -154
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/CHANGES.html +126 -76
- data/doc/rdoc/files/COPYING.html +84 -73
- data/doc/rdoc/files/README.html +135 -111
- data/doc/rdoc/files/RELEASE.html +122 -0
- data/doc/rdoc/files/VERSION.html +85 -74
- data/doc/rdoc/files/bin/quarry-doc.html +109 -0
- data/doc/rdoc/files/bin/quarry.html +109 -0
- data/doc/rdoc/files/bin/ruby-break.html +108 -0
- data/doc/rdoc/files/bin/ruby-xacto.html +101 -0
- data/doc/rdoc/files/lib/quarry/assert_rb.html +155 -0
- data/doc/rdoc/files/lib/quarry/break_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/extract_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/loadmonitor_rb.html +80 -71
- data/doc/rdoc/files/lib/quarry/spec/config_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/spec/context_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/spec/document_rb.html +111 -0
- data/doc/rdoc/files/lib/quarry/spec/markup_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter/dotprogress_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter/summary_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter/verbatim_rb.html +108 -0
- data/doc/rdoc/files/lib/quarry/spec/reporter_rb.html +109 -0
- data/doc/rdoc/files/lib/quarry/spec/runner_rb.html +109 -0
- data/doc/rdoc/files/lib/quarry/spec/step_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/spec/template_rhtml.html +228 -0
- data/doc/rdoc/files/lib/quarry/spec_rb.html +113 -0
- data/doc/rdoc/files/lib/quarry/stub/mock_rb.html +101 -0
- data/doc/rdoc/files/lib/quarry/stub/probe_rb.html +122 -0
- data/doc/rdoc/files/lib/quarry/stub/spec_txt.html +118 -0
- data/doc/rdoc/files/lib/quarry/stub/stub_rb.html +101 -0
- data/doc/rdoc/fr_class_index.html +48 -52
- data/doc/rdoc/fr_file_index.html +47 -57
- data/doc/rdoc/fr_method_index.html +109 -69
- data/doc/rdoc/index.html +12 -14
- data/doc/rdoc/rdoc-style.css +154 -121
- data/doc/ri/Assertion/False/cdesc-False.yaml +5 -3
- data/doc/ri/Assertion/True/cdesc-True.yaml +4 -2
- data/doc/ri/Assertion/True/message-c.yaml +2 -2
- data/doc/ri/Assertion/True/message-i.yaml +1 -1
- data/doc/ri/Assertion/True/method_missing-i.yaml +4 -3
- data/doc/ri/Assertion/cdesc-Assertion.yaml +24 -1
- data/doc/ri/Object/assert%21-i.yaml +7 -4
- data/doc/ri/Object/assert-i.yaml +3 -2
- data/doc/ri/Object/assert_raises%21-i.yaml +12 -0
- data/doc/ri/Object/assert_raises-i.yaml +15 -0
- data/doc/ri/Object/cdesc-Object.yaml +24 -2
- data/doc/ri/{Quarry/Design/Specification/outline-i.yaml → Object/mock-i.yaml} +4 -4
- data/doc/ri/Object/refute-i.yaml +13 -0
- data/doc/ri/Object/refute_raises-i.yaml +17 -0
- data/doc/ri/Object/remove-i.yaml +12 -0
- data/doc/ri/{Quarry/Design/check-c.yaml → Object/should-i.yaml} +4 -4
- data/doc/ri/Object/should_not-i.yaml +12 -0
- data/doc/ri/Object/should_not_raise-i.yaml +12 -0
- data/doc/ri/Object/should_raise-i.yaml +12 -0
- data/doc/ri/{Quarry/Mock/Object/mock-c.yaml → Object/stub-i.yaml} +5 -5
- data/doc/ri/{Module/cdesc-Module.yaml → Quarry/Break/cdesc-Break.yaml} +10 -8
- data/doc/ri/Quarry/Break/edit-i.yaml +11 -0
- data/doc/ri/Quarry/Break/new-c.yaml +11 -0
- data/doc/ri/Quarry/Extract/cdesc-Extract.yaml +26 -0
- data/doc/ri/Quarry/Extract/create_test-i.yaml +12 -0
- data/doc/ri/Quarry/Extract/extract_test_from_file-i.yaml +12 -0
- data/doc/ri/Quarry/Extract/test_extract-i.yaml +18 -0
- data/doc/ri/Quarry/Mock/Delegator/cdesc-Delegator.yaml +20 -0
- data/doc/ri/Quarry/{Design/Specification/Context → Mock/Delegator}/method_missing-i.yaml +2 -2
- data/doc/ri/Quarry/{Design/specification-c.yaml → Mock/Delegator/new-c.yaml} +3 -3
- data/doc/ri/{Module/method_added-i.yaml → Quarry/Mock/Setter/%3d%3d-i.yaml} +3 -3
- data/doc/ri/Quarry/Mock/Setter/cdesc-Setter.yaml +18 -0
- data/doc/ri/Quarry/Mock/Setter/new-c.yaml +10 -0
- data/doc/ri/Quarry/Mock/__table__-i.yaml +11 -0
- data/doc/ri/Quarry/Mock/cdesc-Mock.yaml +17 -7
- data/doc/ri/Quarry/Mock/method_missing-i.yaml +12 -0
- data/doc/ri/Quarry/{Design/outline-c.yaml → Mock/new-c.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Comment/cdesc-Comment.yaml +33 -0
- data/doc/ri/Quarry/Spec/Comment/macro%3f-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Comment/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Comment/type-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/after-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/after_spec-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/before-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Config/before_spec-i.yaml +12 -0
- data/doc/ri/Quarry/{Design/Specification/Context/cdesc-Context.yaml → Spec/Config/cdesc-Config.yaml} +11 -9
- data/doc/ri/Quarry/{Mock/Object/mocks-c.yaml → Spec/Config/new-c.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Context/cdesc-Context.yaml +21 -0
- data/doc/ri/Quarry/{Design/specifications-c.yaml → Spec/Context/new-c.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Document/cdesc-Document.yaml +76 -0
- data/doc/ri/Quarry/Spec/Document/generate-i.yaml +12 -0
- data/doc/ri/Quarry/{Mock/Object/echo-c.yaml → Spec/Document/new-c.yaml} +4 -4
- data/doc/ri/Quarry/Spec/Document/quiet%3f-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Document/require_rdoc-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Document/save-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Document/template-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Header/cdesc-Header.yaml +30 -0
- data/doc/ri/Quarry/Spec/Header/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Macro/cdesc-Macro.yaml +22 -0
- data/doc/ri/Quarry/Spec/Macro/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Markup/cdesc-Markup.yaml +31 -0
- data/doc/ri/Quarry/Spec/Markup/description-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Markup/new-c.yaml +11 -0
- data/doc/ri/Quarry/Spec/Markup/parse-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Markup/parse_section-i.yaml +11 -0
- data/doc/ri/Quarry/Spec/Reporter/DotProgress/cdesc-DotProgress.yaml +21 -0
- data/doc/ri/Quarry/{Design/Specification/Context/specifications-i.yaml → Spec/Reporter/DotProgress/report_intro-i.yaml} +2 -2
- data/doc/ri/Quarry/Spec/Reporter/DotProgress/report_step-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/DotProgress/report_summary-i.yaml +16 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/cdesc-Summary.yaml +31 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_comment-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_error-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_fail-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_header-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Summary/report_macro-i.yaml +10 -0
- data/doc/ri/Quarry/{Design/Specification/Context/before-i.yaml → Spec/Reporter/Summary/report_pass-i.yaml} +3 -3
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/cdesc-Verbatim.yaml +29 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_comment-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_error-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_fail-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_header-i.yaml +16 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_macro-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/Verbatim/report_pass-i.yaml +10 -0
- data/doc/ri/Quarry/Spec/Reporter/cdesc-Reporter.yaml +20 -0
- data/doc/ri/Quarry/Spec/Runner/cdesc-Runner.yaml +47 -0
- data/doc/ri/Quarry/{Design/Specification → Spec/Runner}/check-i.yaml +3 -3
- data/doc/ri/Quarry/Spec/Runner/check_spec-i.yaml +12 -0
- data/doc/ri/Quarry/{Design/Specification → Spec/Runner}/new-c.yaml +2 -2
- data/doc/ri/Quarry/Spec/Runner/run_step-i.yaml +12 -0
- data/doc/ri/Quarry/Spec/Step/cdesc-Step.yaml +30 -0
- data/doc/ri/Quarry/Spec/Step/new-c.yaml +10 -0
- data/doc/ri/Quarry/Spec/Template/cdesc-Template.yaml +31 -0
- data/doc/ri/Quarry/Spec/Template/new-c.yaml +11 -0
- data/doc/ri/Quarry/{Design/Specification/Context/after-i.yaml → Spec/Template/parse_template-i.yaml} +3 -3
- data/doc/ri/Quarry/Spec/cdesc-Spec.yaml +15 -0
- data/doc/ri/Quarry/Stub/Delegator/cdesc-Delegator.yaml +20 -0
- data/doc/ri/Quarry/Stub/Delegator/method_missing-i.yaml +10 -0
- data/doc/ri/Quarry/Stub/Delegator/new-c.yaml +10 -0
- data/doc/ri/Quarry/Stub/Setter/%3d%3d-i.yaml +10 -0
- data/doc/ri/Quarry/Stub/Setter/cdesc-Setter.yaml +18 -0
- data/doc/ri/Quarry/Stub/Setter/new-c.yaml +10 -0
- data/doc/ri/Quarry/Stub/__table__-i.yaml +11 -0
- data/doc/ri/Quarry/Stub/cdesc-Stub.yaml +23 -0
- data/doc/ri/Quarry/Stub/method_missing-i.yaml +11 -0
- data/doc/ri/Quarry/Stub/new-c.yaml +10 -0
- data/doc/ri/Quarry/cdesc-Quarry.yaml +2 -3
- data/doc/ri/created.rid +1 -1
- data/doc/spec/stub.html +394 -0
- data/lib/quarry/assert.rb +198 -0
- data/lib/quarry/break.rb +51 -0
- data/lib/quarry/extract.rb +135 -0
- data/lib/quarry/loadmonitor.rb +6 -1
- data/lib/quarry/spec/config.rb +32 -0
- data/lib/quarry/spec/context.rb +19 -0
- data/lib/quarry/spec/document.rb +130 -0
- data/lib/quarry/spec/markup.rb +85 -0
- data/lib/quarry/spec/reporter/dotprogress.rb +66 -0
- data/lib/quarry/spec/reporter/summary.rb +74 -0
- data/lib/quarry/spec/reporter/verbatim.rb +87 -0
- data/lib/quarry/spec/reporter.rb +74 -0
- data/lib/quarry/spec/runner.rb +127 -0
- data/lib/quarry/spec/step.rb +78 -0
- data/lib/quarry/spec/template.rhtml +116 -0
- data/lib/quarry/spec.rb +7 -0
- data/lib/quarry/stub/mock.rb +94 -0
- data/lib/quarry/{methodprobe.rb → stub/probe.rb} +0 -0
- data/lib/quarry/stub/spec.txt +113 -0
- data/lib/quarry/stub/stub.rb +93 -0
- data/meta/abstract +5 -0
- data/meta/authors +1 -0
- data/meta/created +1 -0
- data/meta/homepage +1 -0
- data/meta/requires +1 -0
- data/meta/summary +1 -0
- data/spec/basic.rd +20 -0
- data/spec/complex.rd +50 -0
- data/spec/mock.rd +53 -0
- data/spec/stub.rd +61 -0
- data/{lib/quarry → work/consider}/document.rb +0 -0
- data/work/consider/fixture.rb +153 -0
- data/{lib/quarry → work/deprecated}/assert/must.rb +1 -0
- data/{lib/quarry → work/deprecated}/assert/should.rb +0 -0
- data/work/deprecated/build.rb +82 -0
- data/work/deprecated/mock/file.rb +11 -0
- data/work/deprecated/mock/mock.0.rb +77 -0
- data/work/deprecated/overlay.rb +64 -0
- data/work/deprecated/spec.rb +195 -0
- data/work/deprecated/stub/stub.0.rb +180 -0
- data/work/deprecated/stub/stub.1.rb +114 -0
- data/work/deprecated/stub/test_stub.rb +66 -0
- data/work/deprecated/test/case.rb +141 -0
- data/work/sandbox/assert.rb +100 -0
- data/work/sandbox/bug.rb +49 -0
- data/work/sandbox/build/announce.rb +213 -0
- data/work/sandbox/build/check.rb +109 -0
- data/work/sandbox/build/gem.rb +235 -0
- data/work/sandbox/build/make.rb +118 -0
- data/work/sandbox/build/manpage.rb +201 -0
- data/work/sandbox/build/notes.rb +214 -0
- data/work/sandbox/build/pack.rb +228 -0
- data/work/sandbox/build/rdoc.rb +289 -0
- data/work/sandbox/build/rubyforge.rb +91 -0
- data/work/sandbox/build/sign.rb +241 -0
- data/work/sandbox/build/stamp.rb +37 -0
- data/work/sandbox/build/stats.rb +154 -0
- data/work/sandbox/build/svn.rb +193 -0
- data/work/sandbox/build/test.rb +521 -0
- data/work/sandbox/design.rb +200 -0
- data/work/sandbox/iface_scanner.rb +102 -0
- data/work/sandbox/testunit/assertions/assert_has_keys.rb +38 -0
- data/work/sandbox/testunit/assertions/assert_has_only_keys.rb +38 -0
- data/work/sandbox/testunit/unit.rb +104 -0
- data/work/sandbox/unitspec.rb +54 -0
- data/work/sandbox/x_isotest.rb +532 -0
- metadata +318 -93
- data/METADATA +0 -22
- data/NEWS +0 -8
- data/bin/rubybreak +0 -3
- data/demo/spec/demo_check.rb +0 -21
- data/demo/spec/demo_outline.rb +0 -25
- data/demo/test/demo_run.rb +0 -21
- data/doc/manual.html2 +0 -1416
- data/doc/rdoc/classes/Module.html +0 -165
- data/doc/rdoc/classes/Quarry/Design/Specification/Context.html +0 -174
- data/doc/rdoc/classes/Quarry/Design/Specification.html +0 -265
- data/doc/rdoc/classes/Quarry/Design.html +0 -170
- data/doc/rdoc/classes/Quarry/Mock/Object.html +0 -276
- data/doc/rdoc/files/MANIFEST.html +0 -630
- data/doc/rdoc/files/METADATA.html +0 -92
- data/doc/rdoc/files/NEWS.html +0 -99
- data/doc/rdoc/files/bin/rubybreak.html +0 -96
- data/doc/rdoc/files/bin/xact-ruby.html +0 -92
- data/doc/rdoc/files/lib/quarry/assert/must_rb.html +0 -96
- data/doc/rdoc/files/lib/quarry/assert/should_rb.html +0 -96
- data/doc/rdoc/files/lib/quarry/assertion_rb.html +0 -96
- data/doc/rdoc/files/lib/quarry/breakout_rb.html +0 -144
- data/doc/rdoc/files/lib/quarry/design/spec_rb.html +0 -100
- data/doc/rdoc/files/lib/quarry/document_rb.html +0 -92
- data/doc/rdoc/files/lib/quarry/methodprobe_rb.html +0 -111
- data/doc/rdoc/files/lib/quarry/mock/object_rb.html +0 -123
- data/doc/rdoc/files/lib/quarry/mockery_rb.html +0 -115
- data/doc/ri/Module/doc-i.yaml +0 -16
- data/doc/ri/Quarry/Design/Specification/cdesc-Specification.yaml +0 -44
- data/doc/ri/Quarry/Design/cdesc-Design.yaml +0 -22
- data/doc/ri/Quarry/Mock/Object/cdesc-Object.yaml +0 -52
- data/doc/ri/Quarry/Mock/Object/keys-c.yaml +0 -12
- data/doc/ri/Quarry/Mock/Object/spin-c.yaml +0 -12
- data/doc/ri/Quarry/Mockery-i.yaml +0 -12
- data/lib/quarry/assertion.rb +0 -95
- data/lib/quarry/breakout.rb +0 -45
- data/lib/quarry/design/spec.rb +0 -197
- data/lib/quarry/mock/object.rb +0 -169
- data/lib/quarry/mockery.rb +0 -85
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# = TITLE:
|
|
2
|
+
#
|
|
3
|
+
# Sign DSL
|
|
4
|
+
#
|
|
5
|
+
# = COPYING:
|
|
6
|
+
#
|
|
7
|
+
# Copyright (c) 2007,2008 Tiger Ops
|
|
8
|
+
#
|
|
9
|
+
# This file is part of the Reap program.
|
|
10
|
+
#
|
|
11
|
+
# Reap is free software: you can redistribute it and/or modify
|
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
14
|
+
# (at your option) any later version.
|
|
15
|
+
#
|
|
16
|
+
# Reap is distributed in the hope that it will be useful,
|
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19
|
+
# GNU General Public License for more details.
|
|
20
|
+
#
|
|
21
|
+
# You should have received a copy of the GNU General Public License
|
|
22
|
+
# along with Reap. If not, see <http://www.gnu.org/licenses/>.
|
|
23
|
+
#
|
|
24
|
+
# = TODO:
|
|
25
|
+
# - Do signitures belong under data/{name}/?
|
|
26
|
+
# Heck do all these metadata files belong there?
|
|
27
|
+
# OTOH using remote require, how would one access these?
|
|
28
|
+
# should they be contigious to the libs themselves?
|
|
29
|
+
|
|
30
|
+
#require 'autorake/tasks/manifest'
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
module Quarry
|
|
34
|
+
|
|
35
|
+
# Create signitures for libraries.
|
|
36
|
+
# FIXME
|
|
37
|
+
|
|
38
|
+
class Sign < Build
|
|
39
|
+
|
|
40
|
+
# Default set of files to sign.
|
|
41
|
+
DEFAULT_SIGN_FILES = ['lib/**/*', 'ext/**/*']
|
|
42
|
+
|
|
43
|
+
DEFAULT_PUBLIC_KEY = 'pubkey.pem'
|
|
44
|
+
DEFAULT_PRIVATE_KEY = '_privkey.pem'
|
|
45
|
+
|
|
46
|
+
# Generate file signitures. This task generates signitures
|
|
47
|
+
# for each library file using public/private keys.
|
|
48
|
+
# The sign script will generate encrypted signitures for
|
|
49
|
+
# files in the project --by default the lib/ and ext/ files.
|
|
50
|
+
#
|
|
51
|
+
# name Project name [name]
|
|
52
|
+
# keyfile Pathname to .pem file for private key
|
|
53
|
+
# files Files to include/exclude.
|
|
54
|
+
# output Directory to store signiture files
|
|
55
|
+
# [data/{name}/signitures/]
|
|
56
|
+
#
|
|
57
|
+
# By default the keyfile is '_privkey.pem'. (BE SURE NEVER
|
|
58
|
+
# TO PUBLISH THIS FILE!!!) But if no a private key file is
|
|
59
|
+
# given/found, this will ask if you would like to
|
|
60
|
+
# generate one. It also can generate a public key for the
|
|
61
|
+
# project if it does not have one.
|
|
62
|
+
#
|
|
63
|
+
# There are two ways to approach key usage here. Either
|
|
64
|
+
# a per project key pair, or use a personal key pair.
|
|
65
|
+
|
|
66
|
+
def sign( override=nil )
|
|
67
|
+
name = info.project
|
|
68
|
+
keyfile = info.private_key
|
|
69
|
+
|
|
70
|
+
output = info.sign_output
|
|
71
|
+
files = info.sign_files
|
|
72
|
+
|
|
73
|
+
files ||= DEFAULT_SIGN_FILES
|
|
74
|
+
keyfile ||= DEFAULT_PRIVATE_KEY
|
|
75
|
+
output ||= File.join('data',name,'signitures')
|
|
76
|
+
|
|
77
|
+
files = Dir.multiglob_with_default(DEFAULT_SIGN_FILES, files)
|
|
78
|
+
|
|
79
|
+
unless File.directory?( dir = File.dirname(output) )
|
|
80
|
+
puts "Output directory #{dir} doesn't exist."
|
|
81
|
+
return nil
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
output = File.expand_path(output)
|
|
85
|
+
|
|
86
|
+
unless keyfile and File.exist?(keyfile)
|
|
87
|
+
ans = ask("Private key file required. Generate one?", "yN")
|
|
88
|
+
case ans
|
|
89
|
+
when 'y', 'Y'
|
|
90
|
+
keyfile = genkey(name)
|
|
91
|
+
puts "\nFile '#{keyfile}' created. Be sure to keep this file private and secure."
|
|
92
|
+
else
|
|
93
|
+
puts "Task cancelled."
|
|
94
|
+
exit -1
|
|
95
|
+
#return nil
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
keyfile = File.expand_path(keyfile)
|
|
100
|
+
|
|
101
|
+
generate_signitures(keyfile, files, output)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
|
|
106
|
+
# Generate a signiture for a file.
|
|
107
|
+
|
|
108
|
+
def generate_signitures( keyfile, files, to_folder )
|
|
109
|
+
privkey = load_key(keyfile)
|
|
110
|
+
|
|
111
|
+
dir = File.dirname(to_folder)
|
|
112
|
+
save_key(privkey.public_key, File.join(dir, DEFAULT_PUBLIC_KEY))
|
|
113
|
+
|
|
114
|
+
fu.mkdir_p(to_folder)
|
|
115
|
+
files.each do |file|
|
|
116
|
+
next if File.directory?(file)
|
|
117
|
+
sig = sign_file(privkey, file)
|
|
118
|
+
write_signiture(to_folder, file, sig)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Write signiture to file.
|
|
123
|
+
|
|
124
|
+
def write_signiture( to_folder, file, sig )
|
|
125
|
+
sigfile = File.join(to_folder, file + '.sig')
|
|
126
|
+
fu.mkdir_p(File.dirname(sigfile))
|
|
127
|
+
if project.dryrun?
|
|
128
|
+
puts "(save #{sigfile})" unless project.quiet?
|
|
129
|
+
else
|
|
130
|
+
File.open( sigfile, 'w' ) do |f|
|
|
131
|
+
f << sig
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Generate a signiture of a file.
|
|
137
|
+
|
|
138
|
+
def sign_file( key, file )
|
|
139
|
+
plain = File.read( file )
|
|
140
|
+
dig = digester(info.digest||'sha256').new
|
|
141
|
+
sig = key.sign(dig, plain)
|
|
142
|
+
return sig
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Verify a signiture of a file.
|
|
146
|
+
|
|
147
|
+
def verify_signiture?( pubkey, sig, plain )
|
|
148
|
+
plain = plain.read if IO === plain
|
|
149
|
+
dig = digester(info.digest||'sha256').new
|
|
150
|
+
success = pubkey.verify(dig, sig, plain)
|
|
151
|
+
return success
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Generate a public key from a private key.
|
|
155
|
+
#
|
|
156
|
+
#def pubkey( privkey )
|
|
157
|
+
# pubkey = privkey.public_key
|
|
158
|
+
# return pubkey
|
|
159
|
+
#end
|
|
160
|
+
|
|
161
|
+
# Load key.
|
|
162
|
+
|
|
163
|
+
def load_key( file )
|
|
164
|
+
key = OpenSSL::PKey::RSA.new(File.read(file))
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Save key.
|
|
168
|
+
|
|
169
|
+
def save_key( key, file )
|
|
170
|
+
if project.dryrun?
|
|
171
|
+
puts "(save #{file})" unless project.quiet?
|
|
172
|
+
else
|
|
173
|
+
File.open( file, 'w' ) do |f|
|
|
174
|
+
f << key.to_pem
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Generate a private key and save it to '_privkey.pem'.
|
|
180
|
+
|
|
181
|
+
def genkey( name )
|
|
182
|
+
key = OpenSSL::PKey::RSA.new(2048){ print "." } # @name }
|
|
183
|
+
save_key( key, PRIVATE_KEY )
|
|
184
|
+
return PRIVATE_KEY
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# def write_keypair( libname )
|
|
188
|
+
# privkey = genkey( libname )
|
|
189
|
+
# pubkey = privkey.public_key
|
|
190
|
+
# save_key( privkey, "privkey.pem" )
|
|
191
|
+
# save_key( pubkey, "pubkey.pem" )
|
|
192
|
+
# puts "Key pair generated. Please secure privkey.pem."
|
|
193
|
+
# end
|
|
194
|
+
#
|
|
195
|
+
# # Generate a private key.
|
|
196
|
+
#
|
|
197
|
+
# def genkey( libname='.' )
|
|
198
|
+
# key = OpenSSL::PKey::RSA.new(2048) { print "." } # libname }
|
|
199
|
+
# return key
|
|
200
|
+
# end
|
|
201
|
+
#
|
|
202
|
+
# # Generate a public key from a private key.
|
|
203
|
+
#
|
|
204
|
+
# def pubkey( privkey )
|
|
205
|
+
# pubkey = privkey.public_key
|
|
206
|
+
# return pubkey
|
|
207
|
+
# end
|
|
208
|
+
|
|
209
|
+
# Return a digest class for given +type+.
|
|
210
|
+
# Supported digests are:
|
|
211
|
+
#
|
|
212
|
+
# * md5
|
|
213
|
+
# * sha1
|
|
214
|
+
# * sha128 (same as sha1)
|
|
215
|
+
# * sha256
|
|
216
|
+
# * sha512
|
|
217
|
+
#
|
|
218
|
+
# Default digest type is sha256.
|
|
219
|
+
|
|
220
|
+
# def digester( type=nil )
|
|
221
|
+
# require 'openssl'
|
|
222
|
+
# type = 'sha256' unless type
|
|
223
|
+
# case type.to_s.downcase
|
|
224
|
+
# when 'md5'
|
|
225
|
+
# require 'digest/md5'
|
|
226
|
+
# Digest::MD5
|
|
227
|
+
# when 'sha128', 'sha1'
|
|
228
|
+
# require 'digest/sha1' #need?
|
|
229
|
+
# OpenSSL::Digest::SHA1
|
|
230
|
+
# when 'sha256'
|
|
231
|
+
# require 'digest/sha1' #need?
|
|
232
|
+
# OpenSSL::Digest::SHA256
|
|
233
|
+
# when 'sha512'
|
|
234
|
+
# require 'digest/sha1' #need?
|
|
235
|
+
# OpenSSL::Digest::SHA512
|
|
236
|
+
# end
|
|
237
|
+
# end
|
|
238
|
+
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
rquire 'quarry/build'
|
|
2
|
+
|
|
3
|
+
module Quarry
|
|
4
|
+
|
|
5
|
+
# Create a VERSION stamp.
|
|
6
|
+
|
|
7
|
+
class Stamp < Build
|
|
8
|
+
|
|
9
|
+
attr_accessor :file
|
|
10
|
+
attr_accessor :name
|
|
11
|
+
attr_accessor :version
|
|
12
|
+
attr_accessor :status
|
|
13
|
+
|
|
14
|
+
attr_accessor :default
|
|
15
|
+
attr_accessor :libpath
|
|
16
|
+
|
|
17
|
+
# Update release "stamp" (.roll) file.
|
|
18
|
+
|
|
19
|
+
def stamp
|
|
20
|
+
w = ''
|
|
21
|
+
w << "#{name} #{version} #{status} #{Time.now.strftime('%Y-%m-%d')}"
|
|
22
|
+
w << " #{default}" if default
|
|
23
|
+
w << "\n"
|
|
24
|
+
w << libpath.join("\n")
|
|
25
|
+
|
|
26
|
+
if dryrun?
|
|
27
|
+
puts file + ":"
|
|
28
|
+
puts w
|
|
29
|
+
else
|
|
30
|
+
File.open(file, 'w'){|f| f << w}
|
|
31
|
+
puts "#{file} updated."
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
require 'quarry/build'
|
|
2
|
+
|
|
3
|
+
module Quarry
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
class Stats < Build
|
|
8
|
+
|
|
9
|
+
DEFAULT_LOADPATH = ['lib']
|
|
10
|
+
|
|
11
|
+
# List of file path(s) of project scripts to code count.
|
|
12
|
+
|
|
13
|
+
attr_accessor :loadpath
|
|
14
|
+
attr_accessor :exclude
|
|
15
|
+
|
|
16
|
+
alias_method :include, :loadpath
|
|
17
|
+
alias_method :include=, :loadpath=
|
|
18
|
+
|
|
19
|
+
# Simple code count analysis.
|
|
20
|
+
#
|
|
21
|
+
# Scan source code counting files, lines of code and
|
|
22
|
+
# comments and presents a report of it's findings.
|
|
23
|
+
#
|
|
24
|
+
# scripts Files to include and/or exclude in
|
|
25
|
+
# analysis. The default includes all
|
|
26
|
+
# files in the lib/ and ext/ directories.
|
|
27
|
+
#
|
|
28
|
+
# TODO Support - and + augmentations for configuration ?
|
|
29
|
+
|
|
30
|
+
def stats(options=nil)
|
|
31
|
+
options ||= {}
|
|
32
|
+
|
|
33
|
+
glob = options[:include] || options[:loadpath] || loadpath || DEFAULT_LOADPATH
|
|
34
|
+
excl = options[:exclude] || exclude || []
|
|
35
|
+
|
|
36
|
+
if String===glob
|
|
37
|
+
glob = glob.split(/[:;]/)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
files = multiglob_r(*glob) - multiglob_r(*excl)
|
|
41
|
+
|
|
42
|
+
#() #.inject([]){ |memo, find| memo.concat(glob(find)); memo }
|
|
43
|
+
#Dir.multiglob_with_default(DEFAULT_STATS_FILES)
|
|
44
|
+
|
|
45
|
+
fc, l, c, r, t, s = *line_count(*files)
|
|
46
|
+
|
|
47
|
+
fct, lt, ct, rt, tt, st = *([0]*6)
|
|
48
|
+
if File.directory?('test')
|
|
49
|
+
fct, lt, ct, rt, tt, st = *line_count('test/**/*')
|
|
50
|
+
t = lt if lt > 0
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
rat = lambda do |d,n|
|
|
54
|
+
if d > n and n != 0
|
|
55
|
+
"%.1f" % [ d.to_f / n ]
|
|
56
|
+
elsif n > d and d != 0
|
|
57
|
+
"-" #"%.1f:1" % [ n.to_f / d ]
|
|
58
|
+
elsif d == 0 or n == 0
|
|
59
|
+
"-"
|
|
60
|
+
else
|
|
61
|
+
"1.0"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
per = lambda do |n,d|
|
|
66
|
+
if d != 0
|
|
67
|
+
(((n.to_f / d)*100).to_i).to_s + "%"
|
|
68
|
+
else
|
|
69
|
+
"-"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
max = l.to_s.size + 4
|
|
74
|
+
|
|
75
|
+
puts
|
|
76
|
+
#puts "FILES:"
|
|
77
|
+
#puts " source: #{fc}"
|
|
78
|
+
#puts " test : #{fct}"
|
|
79
|
+
#puts " total : #{fc+fct}"
|
|
80
|
+
#puts
|
|
81
|
+
#puts "LINES:"
|
|
82
|
+
#puts " code : %#{max}s %4s" % [ c.to_s, per[c,l] ]
|
|
83
|
+
#puts " docs : %#{max}s %4s" % [ r.to_s, per[r,l] ]
|
|
84
|
+
#puts " space : %#{max}s %4s" % [ s.to_s, per[s,l] ]
|
|
85
|
+
#puts " test : %#{max}s %4s" % [ t.to_s, per[t,l] ]
|
|
86
|
+
#puts " total : %#{max}s %4s" % [ l.to_s, per[l,l] ]
|
|
87
|
+
#puts
|
|
88
|
+
#puts "Ratio to 1 :"
|
|
89
|
+
#puts " code to test : #{rat[c,t]} #{per[c,t]}"
|
|
90
|
+
|
|
91
|
+
head = ["Total", "Code", "-%-", "Docs", "-%-", "Blank", "-%-", "Files"]
|
|
92
|
+
prod = [l.to_s, c.to_s, per[c,l], r.to_s, per[r,l], s.to_s, per[s,l], fc]
|
|
93
|
+
test = [lt.to_s, ct.to_s, per[ct,l], rt.to_s, per[rt,l], st.to_s, per[st,l], fct]
|
|
94
|
+
totl = [(l+lt), (c+ct), per[c+ct,l+lt], (r+rt), per[r+rt,l+lt], (s+st), per[s+st,l+lt], (fc+fct)]
|
|
95
|
+
|
|
96
|
+
puts "TYPE %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % head
|
|
97
|
+
puts "Source %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % prod
|
|
98
|
+
puts "Test %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % test
|
|
99
|
+
puts "Total %#{max}s %#{max}s %4s %#{max}s %4s %#{max}s %4s %#{max}s" % totl
|
|
100
|
+
puts
|
|
101
|
+
puts "RATIO Code Docs Blank Test Total"
|
|
102
|
+
puts "Code %7s %7s %7s %7s %7s" % [ rat[c,c], rat[c,r], rat[c,s], rat[c,t], rat[c,l] ]
|
|
103
|
+
puts "Docs %7s %7s %7s %7s %7s" % [ rat[r,c], rat[r,r], rat[r,s], rat[r,t], rat[r,l] ]
|
|
104
|
+
puts "Blank %7s %7s %7s %7s %7s" % [ rat[s,c], rat[s,r], rat[s,s], rat[s,t], rat[s,l] ]
|
|
105
|
+
puts "Test %7s %7s %7s %7s %7s" % [ rat[t,c], rat[t,r], rat[t,s], rat[t,t], rat[t,l] ]
|
|
106
|
+
puts "Total %7s %7s %7s %7s %7s" % [ rat[l,c], rat[l,r], rat[l,s], rat[l,t], rat[l,l] ]
|
|
107
|
+
puts
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
private
|
|
111
|
+
|
|
112
|
+
# Return line counts for files.
|
|
113
|
+
|
|
114
|
+
def line_count( *files )
|
|
115
|
+
files = files.inject([]) do |memo, find|
|
|
116
|
+
memo.concat(Dir.glob(find)); memo
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
fc, l, c, t, r = 0, 0, 0, 0, 0
|
|
120
|
+
bt, rb = false, false
|
|
121
|
+
|
|
122
|
+
files.each do |fname|
|
|
123
|
+
next unless fname =~ /.*rb/ # TODO should this be done?
|
|
124
|
+
fc += 1
|
|
125
|
+
File.open( fname ) do |f|
|
|
126
|
+
while line = f.gets
|
|
127
|
+
l += 1
|
|
128
|
+
next if line =~ /^\s*$/
|
|
129
|
+
case line
|
|
130
|
+
when /^=begin\s+test/
|
|
131
|
+
tb = true; t+=1
|
|
132
|
+
when /^=begin/
|
|
133
|
+
rb = true; r+=1
|
|
134
|
+
when /^=end/
|
|
135
|
+
t+=1 if tb
|
|
136
|
+
r+=1 if rb
|
|
137
|
+
rb, tb = false, false
|
|
138
|
+
when /^\s*#/
|
|
139
|
+
r += 1
|
|
140
|
+
else
|
|
141
|
+
c+=1 if !(rb or tb)
|
|
142
|
+
r+=1 if rb
|
|
143
|
+
t+=1 if tb
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
s = l - c - r - t
|
|
149
|
+
return fc, l, c, r, t, s
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
end
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
require 'quarry/build'
|
|
2
|
+
|
|
3
|
+
module Quarry
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
class Svn < Build
|
|
8
|
+
|
|
9
|
+
# Tag current version (via rubyforge).
|
|
10
|
+
|
|
11
|
+
def tag
|
|
12
|
+
name, version = release.name, release.version
|
|
13
|
+
|
|
14
|
+
config = configuration['tag']
|
|
15
|
+
|
|
16
|
+
prefix = commandline('prefix') || config['prefix']
|
|
17
|
+
prefix = prefix + '_' if prefix && prefix !~ /[_-]$/
|
|
18
|
+
|
|
19
|
+
tagdir = config['tagdir'] || 'tags'
|
|
20
|
+
|
|
21
|
+
rubyforge_username = ENV['RUBYFORGE_USERNAME']
|
|
22
|
+
rubyforge_project = config['project'] || name
|
|
23
|
+
|
|
24
|
+
abort "Need RUBYFORGE_USERNAME evironment setting." unless rubyforge_username
|
|
25
|
+
|
|
26
|
+
tagname = "#{prefix}#{version}"
|
|
27
|
+
tagname = File.join(tagdir, tagname) if tagdir
|
|
28
|
+
|
|
29
|
+
puts "Tag '#{tagname}' ?"
|
|
30
|
+
|
|
31
|
+
case ask("Continue? [yN]").strip.downcase
|
|
32
|
+
when 'y', 'yes'
|
|
33
|
+
svn "copy", "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{name}/trunk",
|
|
34
|
+
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{name}/#{tagname}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Create changelog.
|
|
39
|
+
|
|
40
|
+
def log(format=:rd)
|
|
41
|
+
case format
|
|
42
|
+
when :rd
|
|
43
|
+
log_rd
|
|
44
|
+
when :xml
|
|
45
|
+
log_xml
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Create a human readable changelog.
|
|
50
|
+
|
|
51
|
+
def log_rd
|
|
52
|
+
config = configuration['log']
|
|
53
|
+
txtlog = config['file'] || 'ChangeLog'
|
|
54
|
+
|
|
55
|
+
text = `svn log`
|
|
56
|
+
|
|
57
|
+
changes = log_parse(text)
|
|
58
|
+
sorted = log_organize(changes)
|
|
59
|
+
string = log_format(sorted)
|
|
60
|
+
|
|
61
|
+
if dryrun?
|
|
62
|
+
puts string
|
|
63
|
+
else
|
|
64
|
+
File.open(txtlog, 'w'){|f| f << string }
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
|
|
72
|
+
def log_parse(text)
|
|
73
|
+
changes = []
|
|
74
|
+
entries = text.split(/^[-]+\n/)
|
|
75
|
+
entries.shift # get rid of emtpy first
|
|
76
|
+
entries.each do |entry|
|
|
77
|
+
lines = entry.split(/\n/)
|
|
78
|
+
data = lines.shift
|
|
79
|
+
text = lines.join("\n").strip
|
|
80
|
+
|
|
81
|
+
rev, who, date, *rest = *data.split('|')
|
|
82
|
+
rev.strip!
|
|
83
|
+
who.strip!
|
|
84
|
+
date = date.strip.split(/\s+/).first
|
|
85
|
+
|
|
86
|
+
changes << [ date, who, rev, text ]
|
|
87
|
+
end
|
|
88
|
+
changes
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
#
|
|
92
|
+
|
|
93
|
+
def log_organize(changes)
|
|
94
|
+
mapped = {}
|
|
95
|
+
changes.each do |date, who, rev, text|
|
|
96
|
+
mapped[[date, who]] ||= []
|
|
97
|
+
mapped[[date, who]] << [text, rev]
|
|
98
|
+
end
|
|
99
|
+
sorted = []
|
|
100
|
+
mapped.each do |(date, who), entries|
|
|
101
|
+
sorted << [ date, who, entries ]
|
|
102
|
+
end
|
|
103
|
+
sorted.sort{ |a,b| b[0] <=> a[0] }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
#
|
|
107
|
+
|
|
108
|
+
def log_format(sorted)
|
|
109
|
+
string = "= ChangeLog\n\n"
|
|
110
|
+
sorted.each do |date, who, entries|
|
|
111
|
+
string << "== #{date} #{who}\n\n" # no email :(
|
|
112
|
+
entries.each do |entry|
|
|
113
|
+
string << "* #{entry.first} (#{entry.last})\n"
|
|
114
|
+
end
|
|
115
|
+
string << "\n"
|
|
116
|
+
end
|
|
117
|
+
string
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
public
|
|
121
|
+
|
|
122
|
+
# Create a XML-formatted changelog.
|
|
123
|
+
|
|
124
|
+
def log_xml
|
|
125
|
+
config = configuration['log']
|
|
126
|
+
xmlfile = config['xmlfile'] || 'doc/changelog.xml'
|
|
127
|
+
xslfile = File.join(File.dirname(xmlfile), 'changelog.xsl')
|
|
128
|
+
|
|
129
|
+
log_xsl(xslfile)
|
|
130
|
+
|
|
131
|
+
text = `svn log --xml`
|
|
132
|
+
i = text.index("?>\n")
|
|
133
|
+
text.insert(i+2, "\n" + '<?xml-stylesheet href="changelog.xsl" type="text/xsl" ?>')
|
|
134
|
+
|
|
135
|
+
if dryrun?
|
|
136
|
+
puts text
|
|
137
|
+
else
|
|
138
|
+
File.open(xmlfile){ |f| f << text }
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
|
|
146
|
+
def log_xsl(xslfile)
|
|
147
|
+
if force? or not File.exist?(xslfile)
|
|
148
|
+
File.open(xslfile, 'w') do |f|
|
|
149
|
+
f << XSLOG
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
XSLOG = <<-END
|
|
155
|
+
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
156
|
+
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
|
157
|
+
|
|
158
|
+
<xsl:output cdata-section-elements="script"/>
|
|
159
|
+
|
|
160
|
+
<xsl:template match="/">
|
|
161
|
+
<html>
|
|
162
|
+
<head>
|
|
163
|
+
<title>Changelog</title>
|
|
164
|
+
<link REL='SHORTCUT ICON' HREF="../img/ruby-sm.png" />
|
|
165
|
+
<style>
|
|
166
|
+
td { font-family: sans-serif; padding: 0px 10px; }
|
|
167
|
+
</style>
|
|
168
|
+
</head>
|
|
169
|
+
<body>
|
|
170
|
+
<div class="container">
|
|
171
|
+
<h1>Changelog</h1>
|
|
172
|
+
<table style="width: 100%;">
|
|
173
|
+
<xsl:apply-templates />
|
|
174
|
+
</table>
|
|
175
|
+
</div>
|
|
176
|
+
</body>
|
|
177
|
+
</html>
|
|
178
|
+
</xsl:template>
|
|
179
|
+
|
|
180
|
+
<xsl:template match="logentry">
|
|
181
|
+
<tr>
|
|
182
|
+
<td><b><pre><xsl:value-of select="msg"/></pre></b></td>
|
|
183
|
+
<td><xsl:value-of select="author"/></td>
|
|
184
|
+
<td><xsl:value-of select="date"/></td>
|
|
185
|
+
</tr>
|
|
186
|
+
</xsl:template>
|
|
187
|
+
|
|
188
|
+
</xsl:stylesheet>
|
|
189
|
+
END
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|