mtk 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. data/.yardopts +3 -2
  2. data/DEVELOPMENT_NOTES.md +114 -0
  3. data/INTRO.md +64 -8
  4. data/LICENSE.txt +1 -1
  5. data/README.md +31 -102
  6. data/Rakefile +56 -18
  7. data/bin/mtk +215 -0
  8. data/examples/crescendo.rb +5 -5
  9. data/examples/drum_pattern1.rb +23 -0
  10. data/examples/dynamic_pattern.rb +8 -11
  11. data/examples/gets_and_play.rb +26 -0
  12. data/examples/notation.rb +22 -0
  13. data/examples/play_midi.rb +8 -10
  14. data/examples/random_tone_row.rb +2 -2
  15. data/examples/syntax_to_midi.rb +28 -0
  16. data/examples/test_output.rb +8 -0
  17. data/examples/tone_row_melody.rb +6 -6
  18. data/lib/mtk.rb +52 -40
  19. data/lib/mtk/chord.rb +55 -0
  20. data/lib/mtk/constants/durations.rb +57 -0
  21. data/lib/mtk/constants/intensities.rb +61 -0
  22. data/lib/mtk/constants/intervals.rb +73 -0
  23. data/lib/mtk/constants/pitch_classes.rb +29 -0
  24. data/lib/mtk/constants/pitches.rb +52 -0
  25. data/lib/mtk/duration.rb +211 -0
  26. data/lib/mtk/events/event.rb +119 -0
  27. data/lib/mtk/events/note.rb +112 -0
  28. data/lib/mtk/events/parameter.rb +54 -0
  29. data/lib/mtk/helpers/collection.rb +164 -0
  30. data/lib/mtk/helpers/convert.rb +36 -0
  31. data/lib/mtk/helpers/lilypond.rb +162 -0
  32. data/lib/mtk/helpers/output_selector.rb +67 -0
  33. data/lib/mtk/helpers/pitch_collection.rb +23 -0
  34. data/lib/mtk/helpers/pseudo_constants.rb +26 -0
  35. data/lib/mtk/intensity.rb +156 -0
  36. data/lib/mtk/interval.rb +155 -0
  37. data/lib/mtk/lang/mtk_grammar.citrus +190 -13
  38. data/lib/mtk/lang/parser.rb +29 -0
  39. data/lib/mtk/melody.rb +94 -0
  40. data/lib/mtk/midi/dls_synth_device.rb +144 -0
  41. data/lib/mtk/midi/dls_synth_output.rb +62 -0
  42. data/lib/mtk/midi/file.rb +67 -32
  43. data/lib/mtk/midi/input.rb +97 -0
  44. data/lib/mtk/midi/jsound_input.rb +36 -17
  45. data/lib/mtk/midi/jsound_output.rb +48 -46
  46. data/lib/mtk/midi/output.rb +195 -0
  47. data/lib/mtk/midi/unimidi_input.rb +117 -0
  48. data/lib/mtk/midi/unimidi_output.rb +121 -0
  49. data/lib/mtk/{_numeric_extensions.rb → numeric_extensions.rb} +12 -0
  50. data/lib/mtk/patterns/chain.rb +49 -0
  51. data/lib/mtk/{pattern → patterns}/choice.rb +14 -8
  52. data/lib/mtk/patterns/cycle.rb +18 -0
  53. data/lib/mtk/patterns/for_each.rb +71 -0
  54. data/lib/mtk/patterns/function.rb +39 -0
  55. data/lib/mtk/{pattern → patterns}/lines.rb +11 -17
  56. data/lib/mtk/{pattern → patterns}/palindrome.rb +11 -8
  57. data/lib/mtk/patterns/pattern.rb +171 -0
  58. data/lib/mtk/patterns/sequence.rb +20 -0
  59. data/lib/mtk/pitch.rb +7 -6
  60. data/lib/mtk/pitch_class.rb +124 -46
  61. data/lib/mtk/pitch_class_set.rb +58 -35
  62. data/lib/mtk/sequencers/event_builder.rb +131 -0
  63. data/lib/mtk/sequencers/legato_sequencer.rb +24 -0
  64. data/lib/mtk/sequencers/rhythmic_sequencer.rb +28 -0
  65. data/lib/mtk/{sequencer/abstract_sequencer.rb → sequencers/sequencer.rb} +37 -11
  66. data/lib/mtk/{sequencer → sequencers}/step_sequencer.rb +4 -4
  67. data/lib/mtk/timeline.rb +39 -22
  68. data/lib/mtk/variable.rb +32 -0
  69. data/spec/mtk/chord_spec.rb +83 -0
  70. data/spec/mtk/{_constants → constants}/durations_spec.rb +12 -41
  71. data/spec/mtk/{_constants → constants}/intensities_spec.rb +13 -37
  72. data/spec/mtk/{_constants → constants}/intervals_spec.rb +14 -32
  73. data/spec/mtk/{_constants → constants}/pitch_classes_spec.rb +8 -4
  74. data/spec/mtk/{_constants → constants}/pitches_spec.rb +5 -1
  75. data/spec/mtk/duration_spec.rb +372 -0
  76. data/spec/mtk/events/event_spec.rb +234 -0
  77. data/spec/mtk/events/note_spec.rb +174 -0
  78. data/spec/mtk/events/parameter_spec.rb +220 -0
  79. data/spec/mtk/{helper → helpers}/collection_spec.rb +86 -3
  80. data/spec/mtk/{helper → helpers}/pseudo_constants_spec.rb +2 -2
  81. data/spec/mtk/intensity_spec.rb +289 -0
  82. data/spec/mtk/interval_spec.rb +265 -0
  83. data/spec/mtk/lang/parser_spec.rb +597 -0
  84. data/spec/mtk/melody_spec.rb +223 -0
  85. data/spec/mtk/midi/file_spec.rb +16 -16
  86. data/spec/mtk/midi/jsound_input_spec.rb +11 -0
  87. data/spec/mtk/midi/jsound_output_spec.rb +11 -0
  88. data/spec/mtk/midi/output_spec.rb +102 -0
  89. data/spec/mtk/midi/unimidi_input_spec.rb +11 -0
  90. data/spec/mtk/midi/unimidi_output_spec.rb +11 -0
  91. data/spec/mtk/{_numeric_extensions_spec.rb → numeric_extensions_spec.rb} +1 -0
  92. data/spec/mtk/patterns/chain_spec.rb +110 -0
  93. data/spec/mtk/{pattern → patterns}/choice_spec.rb +20 -30
  94. data/spec/mtk/{pattern → patterns}/cycle_spec.rb +25 -35
  95. data/spec/mtk/patterns/for_each_spec.rb +136 -0
  96. data/spec/mtk/{pattern → patterns}/function_spec.rb +17 -30
  97. data/spec/mtk/{pattern → patterns}/lines_spec.rb +11 -27
  98. data/spec/mtk/{pattern → patterns}/palindrome_spec.rb +13 -29
  99. data/spec/mtk/patterns/pattern_spec.rb +132 -0
  100. data/spec/mtk/patterns/sequence_spec.rb +203 -0
  101. data/spec/mtk/pitch_class_set_spec.rb +23 -21
  102. data/spec/mtk/pitch_class_spec.rb +151 -39
  103. data/spec/mtk/pitch_spec.rb +22 -1
  104. data/spec/mtk/sequencers/event_builder_spec.rb +245 -0
  105. data/spec/mtk/sequencers/legato_sequencer_spec.rb +45 -0
  106. data/spec/mtk/sequencers/rhythmic_sequencer_spec.rb +84 -0
  107. data/spec/mtk/sequencers/sequencer_spec.rb +215 -0
  108. data/spec/mtk/{sequencer → sequencers}/step_sequencer_spec.rb +35 -13
  109. data/spec/mtk/timeline_spec.rb +109 -16
  110. data/spec/mtk/variable_spec.rb +52 -0
  111. data/spec/spec_coverage.rb +2 -0
  112. data/spec/spec_helper.rb +3 -0
  113. metadata +188 -91
  114. data/lib/mtk/_constants/durations.rb +0 -80
  115. data/lib/mtk/_constants/intensities.rb +0 -81
  116. data/lib/mtk/_constants/intervals.rb +0 -85
  117. data/lib/mtk/_constants/pitch_classes.rb +0 -35
  118. data/lib/mtk/_constants/pitches.rb +0 -49
  119. data/lib/mtk/event.rb +0 -70
  120. data/lib/mtk/helper/collection.rb +0 -114
  121. data/lib/mtk/helper/event_builder.rb +0 -85
  122. data/lib/mtk/helper/pseudo_constants.rb +0 -26
  123. data/lib/mtk/lang/grammar.rb +0 -17
  124. data/lib/mtk/note.rb +0 -63
  125. data/lib/mtk/pattern/abstract_pattern.rb +0 -132
  126. data/lib/mtk/pattern/cycle.rb +0 -51
  127. data/lib/mtk/pattern/enumerator.rb +0 -26
  128. data/lib/mtk/pattern/function.rb +0 -46
  129. data/lib/mtk/pattern/sequence.rb +0 -30
  130. data/lib/mtk/pitch_set.rb +0 -84
  131. data/lib/mtk/sequencer/rhythmic_sequencer.rb +0 -29
  132. data/lib/mtk/transform/invertible.rb +0 -15
  133. data/lib/mtk/transform/mappable.rb +0 -18
  134. data/lib/mtk/transform/set_theory_operations.rb +0 -34
  135. data/lib/mtk/transform/transposable.rb +0 -14
  136. data/spec/mtk/event_spec.rb +0 -139
  137. data/spec/mtk/helper/event_builder_spec.rb +0 -92
  138. data/spec/mtk/lang/grammar_spec.rb +0 -100
  139. data/spec/mtk/note_spec.rb +0 -115
  140. data/spec/mtk/pattern/abstract_pattern_spec.rb +0 -45
  141. data/spec/mtk/pattern/note_cycle_spec.rb.bak +0 -116
  142. data/spec/mtk/pattern/pitch_cycle_spec.rb.bak +0 -47
  143. data/spec/mtk/pattern/pitch_sequence_spec.rb.bak +0 -37
  144. data/spec/mtk/pattern/sequence_spec.rb +0 -151
  145. data/spec/mtk/pitch_set_spec.rb +0 -198
  146. data/spec/mtk/sequencer/abstract_sequencer_spec.rb +0 -159
  147. data/spec/mtk/sequencer/rhythmic_sequencer_spec.rb +0 -49
data/.yardopts CHANGED
@@ -1,9 +1,10 @@
1
1
  --readme README.md
2
- --title 'MTK (Music ToolKit for Ruby)'
2
+ --title 'MTK (Music Tool Kit for Ruby)'
3
3
  --charset utf-8
4
4
  --protected
5
+ --no-private
5
6
  lib/**/*.rb
6
7
  - *.md
7
8
  - examples/*
8
9
  - lib/**/*.citrus
9
-
10
+ - LICENSE.txt
@@ -0,0 +1,114 @@
1
+ MTK
2
+ ===
3
+
4
+ [![Build Status](https://secure.travis-ci.org/adamjmurray/mtk.png)](http://travis-ci.org/adamjmurray/mtk)
5
+
6
+ Music Tool Kit for Ruby
7
+ -----------------------
8
+
9
+ Classes for modeling music with a focus on simplicity. Support for reading/writing MIDI files and realtime MIDI.
10
+
11
+
12
+
13
+ Getting Started
14
+ ---------------
15
+
16
+ gem install mtk
17
+
18
+ or download the source from here and add mtk/lib to your $LOAD_PATH. Then...
19
+
20
+ require 'mtk'
21
+
22
+ Some examples are available in the examples folder (more coming soon).
23
+ The specs provide a lot of details of usage...
24
+
25
+
26
+
27
+ Goals
28
+ -----
29
+
30
+ * Build musical generators to assist with composing music
31
+ * Re-implement Cosy (http://compusition.com/web/software/cosy) using these models as the "backend"
32
+
33
+
34
+
35
+ Status
36
+ ------
37
+
38
+ Alpha phase, API subject to change. Feedback welcome!
39
+
40
+
41
+
42
+ Requirements
43
+ ------------
44
+
45
+ ### Ruby Version
46
+
47
+ Ruby 1.9+ or JRuby 1.6+
48
+
49
+
50
+ ### Dependencies
51
+
52
+ MTK's core features should not depend on anything outside of the Ruby standard library.
53
+
54
+
55
+ MTK's optional features typically require gems. Currently the following gems are required:
56
+
57
+ * MIDI file I/O requires the __midilib__ gem
58
+
59
+ * realtime MIDI I/O with (MRI/YARV) Ruby requires the __unimidi__ and __gamelan__ gems
60
+
61
+ * realtime MIDI I/O with JRuby require the __jsound__ and __gamelan__ gems
62
+
63
+ * The custom MTK syntax (work in progress) requires the __citrus__ gem
64
+
65
+
66
+ Development requires the gems for optional features, plus the following:
67
+
68
+ * rake
69
+ * rspec (tests)
70
+ * yard (docs)
71
+
72
+ You shouldn't need to worry about the dependencies too much. A Gemfile is provided to sort this out for you:
73
+
74
+ gem install bundler
75
+ bundle install
76
+
77
+ [rvm](https://rvm.beginrescueend.com/) is required for cross version testing (see Development Notes below)
78
+
79
+
80
+
81
+ Documentation
82
+ -------------
83
+
84
+ Gem 0.0.2: http://rdoc.info/gems/mtk/0.0.2/frames (TODO: update this)
85
+
86
+ Latest for source: http://rubydoc.info/github/adamjmurray/mtk/master/frames
87
+
88
+
89
+
90
+ Development Notes
91
+ -----------------
92
+
93
+ ### Run Tests ###
94
+
95
+ Test with current version of Ruby:
96
+
97
+ bundle exec rake test
98
+
99
+ Test with all supported versions of Ruby (requires [rvm](https://rvm.beginrescueend.com/), YARV 1.9.3, and JRuby 1.6.7):
100
+
101
+ bundle exec rake test:all
102
+
103
+ The test:all test must pass for a pull request to be accepted or for a release of the mtk gem.
104
+
105
+
106
+ ### Generate Docs ###
107
+
108
+ bundle exec rake doc
109
+ open doc/frames.html
110
+
111
+ or, to automatically refresh the documentation as you work:
112
+
113
+ bundle exec yard server -r
114
+ open http://localhost:8808
data/INTRO.md CHANGED
@@ -6,21 +6,19 @@ Core Concepts
6
6
  ### Core data types
7
7
 
8
8
  These model the basic properties of musical events:
9
- * pitch_class (MTK class)
10
- * pitch (MTK class)
11
- * intensity (Numeric)
12
- * duration (Numeric)
9
+ * PitchClass
10
+ * Pitch
11
+ * Duration
12
+ * Intensity
13
13
 
14
- Like Numeric types, PitchClass and Pitch are immutable. This helps avoid confusing bugs.
14
+ These types are all immutable. This helps avoid confusing bugs.
15
15
  Mostly you don't need to worry about this. Just remember when you call methods that change the value, like #invert,
16
16
  it does not change the value in-place. For example:
17
17
 
18
18
  p = PitchClass[G]
19
19
  p = p.invert(E) # because p.invert(E) does not change p
20
20
 
21
- For efficiency and convenience, intensity and duration are modeled using Ruby's Numeric types (Fixnum, Float, etc).
22
-
23
- Intensity is intended to range from 0.0 (minimum intensity) to 1.0 (maximum intensity).
21
+ Intensity values are intended to range from 0.0 (minimum intensity) to 1.0 (maximum intensity).
24
22
 
25
23
  A Duration of 1 is one beat (usually a quarter note, depending on the meter). By convention, negative durations
26
24
  indicate a rest that lasts for the absolute value duration.
@@ -70,4 +68,62 @@ Future?
70
68
  Convert patterns into timelines
71
69
 
72
70
 
71
+ <br/>
72
+ ### Syntax
73
+
74
+ Basic Tenants
75
+
76
+ * Minimal syntax: less typing means more music!
77
+ * Be case-insensitive to avoid typos caused by lower vs upper case (there's one notable exception for intervals: m2 vs M2)
78
+ * pitch and duration are the most important properties
79
+ * pitch is more important than rhythm
80
+
81
+ Because pitch class and duration are such important properties, and we want to minimize typing, we represent these with 1 letter.
82
+
83
+ **Diatonic Pitch Class: c d e f g a b**
84
+
85
+ **Chromatic Pitch Class (Sharp/Flat): c c# db d d# eb e e# fb f f# gb g g# ab a a# bb b b#**
86
+
87
+ Double-sharps (c##) and double-flats (dbb) are also allowed. You may prefer Bb to bb, etc
88
+
89
+ **Pitch (Pitch Class + Octave Number): c4 db5 c-1 g9**
90
+
91
+ c-1 (that's octave number: negative 1) is the lowest note. g9 is the highest.
92
+
93
+ **Duration: w h q i s r x (that's: whole note, half, quarter, eighth, sixteenth, thirty-second, sixty-fourth)**
94
+
95
+ Why "i", "r", and "x"? We're trying to keep these one letter. 'e', 'r', and 's' were already used,
96
+ so we just move along the letters of the word until we find an unused letter.
97
+
98
+ For intensity, we'll try to use standard music notation, but 'f' conflicts, so we handle this the same way we did with durations:
99
+
100
+ **Intensity: ppp pp p mp mf o ff fff**
101
+
102
+ (You may find it helpful to think "loud" for "o")
103
+
104
+
105
+ TODO: keep documenting this...
106
+
107
+
108
+ Summary of single-letter assignments:
109
+ ```
110
+ a -> pitch class a
111
+ b -> pitch class b, flat modifier on pitch class
112
+ c -> pitch class c
113
+ d -> pitch class d
114
+ e -> pitch class e
115
+ f -> pitch class f
116
+
117
+ h -> half note duration
118
+ i -> eighth note duration
119
+
120
+ o -> forte intensity
121
+ p -> piano intensity
122
+ q -> quarter note duration
123
+ r -> thirty-second note duration
124
+ s -> sixteenth note duration
125
+ t -> triplet modifier on durations
73
126
 
127
+ w -> whole note duration
128
+ x -> sixty-fourth note duration
129
+ ```
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011, Adam Murray (adam@compusition.com).
1
+ Copyright (c) 2011-2013, Adam Murray (adam@compusition.com).
2
2
 
3
3
  All rights reserved.
4
4
 
data/README.md CHANGED
@@ -1,127 +1,56 @@
1
- MTK
1
+ MTK: a Music Tool Kit for Ruby
2
2
  ===
3
3
 
4
- Music ToolKit for Ruby
5
- ----------------------
4
+ MTK is a Ruby library and custom [domain-specific language](https://en.wikipedia.org/wiki/Domain-specific_language) (DSL) for generating musical material.
6
5
 
7
- Classes for modeling music with a focus on simplicity. Support for reading/writing MIDI files and realtime MIDI.
6
+ MTK is flexible: You may use the custom music-generating language without writing any Ruby code, or you may avoid the custom language
7
+ and only program in Ruby, or anywhere in between.
8
8
 
9
9
 
10
+ Features
11
+ --------
12
+ * A minimalist syntax (DSL) for generating musical patterns
13
+ * Read and write MIDI files
14
+ * Record and output realtime MIDI signals
15
+ * Sequence MIDI-compatible event streams
16
+ * Manipulate musical objects like pitch, duration, and intensity
17
+ * Generate deterministic and non-deterministic music via flexible patterns such as looping sequences and random choices
10
18
 
11
19
  Getting Started
12
20
  ---------------
13
21
 
14
- gem install mtk
22
+ # NOTE: This project is not ready yet, these instructions will not work! Please check back in a little while once I have mtk version 0.0.3 released to rubygems.org.
15
23
 
16
- or download the source from here and add mtk/lib to your $LOAD_PATH. Then...
24
+ MTK works with Ruby 1.9, Ruby 2.0, and JRuby
17
25
 
18
- require 'mtk'
26
+ 0. Install
19
27
 
20
- Some examples are available in the examples folder (more coming soon).
21
- The specs provide a lot of details of usage...
28
+ gem install mtk
22
29
 
30
+ or if using JRuby:
23
31
 
32
+ jgem install mtk
24
33
 
25
- Goals
26
- -----
34
+ 0. Learn the command-line interface:
27
35
 
28
- * Build musical generators to assist with composing music
29
- * Re-implement Cosy (http://compusition.com/web/software/cosy) using these models as the "backend"
36
+ mtk --help
30
37
 
38
+ 0. Learn the MTK syntax:
31
39
 
40
+ mtk --tutorial
32
41
 
33
- Status
34
- ------
42
+ 0. Check out examples: ... TODO
35
43
 
36
- Alpha phase, API subject to change. Feedback welcome!
44
+ 0. Read the [MTK Ruby library documentation](http://rubydoc.info/github/adamjmurray/mtk/master/frames) (TODO: update this 0.0.3 gem version when ready)
37
45
 
46
+ TODO: explain how to hear output on different platforms (maybe in the mtk command line help?)
38
47
 
39
48
 
40
- Requirements
41
- ------------
49
+ About this project
50
+ ------------------
51
+ This project is developed by [Adam Murray (github.com/adamjmurray)](http://github.com/adamjmurray).
42
52
 
43
- ### Ruby Version
53
+ It is a free and open source project licensed under [a permissive BSD-style license](https://raw.github.com/adamjmurray/mtk/master/LICENSE.txt).
54
+ I simply ask for credit by including my copyright in derivative works.
44
55
 
45
- Ruby 1.8+ or JRuby 1.5+
46
-
47
-
48
- ### Dependencies
49
-
50
- MTK's core features should not depend on anything outside of the Ruby standard library.
51
-
52
- MTK's optional features typically require gems. Currently the following gems are required:
53
-
54
- * midilib: required by MTK::MIDI::File for file I/O
55
-
56
- * jsound and gamelan: required by MTK::MIDI::JSoundInput/Output (also requires JRuby)
57
-
58
- Development requires all the gems for optional features, plus the following development tools:
59
-
60
- * rake
61
- * rspec (tests)
62
- * yard (docs)
63
- * yard-rspec (docs)
64
- * rdiscount (docs)
65
-
66
- [rvm](https://rvm.beginrescueend.com/) is recommended for cross version testing (see Development Notes below)
67
-
68
-
69
-
70
- Documentation
71
- -------------
72
-
73
- Gem: http://rdoc.info/gems/mtk/0.0.2/frames
74
-
75
- Latest for source: http://rubydoc.info/github/adamjmurray/mtk/master/frames
76
-
77
-
78
-
79
- Development Notes
80
- -----------------
81
-
82
- ### Run Tests ###
83
-
84
- Test with current version of Ruby:
85
-
86
- rake spec
87
-
88
- Test with all supported versions of Ruby (requires [rvm](https://rvm.beginrescueend.com/), MRI 1.8.7, YARV 1.9.2, JRuby 1.5.6, and JRuby 1.6.2):
89
-
90
- rake spec:xversion
91
-
92
- The spec:xversion test must pass for a pull request to be accepted or for a release of the mtk gem.
93
-
94
-
95
- ### Generate Docs ###
96
-
97
- yard
98
- open doc/frames.html
99
-
100
- or, to automatically refresh the documentation as you work:
101
-
102
- yard server -r
103
- open http://localhost:8808
104
-
105
-
106
- ### Project Roadmap ###
107
-
108
- https://www.pivotaltracker.com/projects/295419
109
-
110
-
111
-
112
- Changelog
113
- ---------
114
-
115
- * July 8, 2011: version 0.0.2
116
- - Added a Sequencer module to build Timelines out of Patterns
117
- - Overhauled Pattern module: removed type-specific patterns, and added the Palindrome, Lines, and Function patterns
118
- - Patterns can now be nested (they can contain other Patterns)
119
- - Patterns can now be typed, to distinguish Numeric Patterns as :pitch (i.e. intervals), :intensity, :duration, or :rhythm patterns
120
- - Removed auto-sorting behavior from PitchClassSet to support 12-tone rows and atonal composition techniques
121
- - Added #quantize and #shift features to Timeline
122
- - Got rid of Chord class, model Chords with PitchSets or Arrays of Notes instead
123
- - Added support for realtime MIDI I/O with JSound (JRuby only)
124
- - various cleanup and reorganization
125
-
126
- * June 8, 2011: version 0.0.1
127
- - First gem release.
56
+ You can learn more about the development of this project at the [development notes page](https://github.com/adamjmurray/mtk/blob/master/DEVELOPMENT_NOTES.md).
data/Rakefile CHANGED
@@ -1,13 +1,17 @@
1
1
  require 'rspec/core/rake_task'
2
2
  require 'rake/clean'
3
- require 'yard'
4
3
 
5
- task :default => :spec
4
+ MTK_VERSION = '0.0.3'
6
5
 
7
- CLEAN.include('html','doc') # clean and clobber do the same thing for now
6
+ SUPPORTED_RUBIES = %w[ 1.9.3 2.0 jruby-1.7.4 ]
7
+ ENV['JRUBY_OPTS'] = '--1.9'
8
+
9
+ task :default => :test
10
+
11
+ CLEAN.include('html','doc','coverage.data','coverage', '*.gem') # clean and clobber do the same thing for now
8
12
 
9
13
  desc "Run RSpec tests with full output"
10
- RSpec::Core::RakeTask.new do |spec|
14
+ RSpec::Core::RakeTask.new('test') do |spec|
11
15
  spec.rspec_opts = ["--color", "--format", "nested"]
12
16
  if ARGV[1]
13
17
  # only run specs with filenames starting with the command line argument
@@ -15,29 +19,63 @@ RSpec::Core::RakeTask.new do |spec|
15
19
  end
16
20
  end
17
21
 
18
- namespace :spec do
22
+ task :spec => :test
23
+
24
+
25
+ namespace :gem do
26
+ desc "Install gems for supported versions of Ruby: #{SUPPORTED_RUBIES.join ', '}"
27
+ task :install_dependencies do
28
+ fail unless system("rvm #{SUPPORTED_RUBIES.join ','} do bundle install")
29
+ end
30
+
31
+ desc "Build the gemspec for C-Ruby and JRuby"
32
+ task :build do
33
+ ENV['MTK_VERSION'] = MTK_VERSION
34
+ ENV['MTK_BUILD_FOR_JRUBY'] = 'true'
35
+ `gem build ./mtk.gemspec`
36
+ `mv mtk-#{MTK_VERSION}.gem mtk-#{MTK_VERSION}-jruby.gem`
37
+ puts "Built mtk-#{MTK_VERSION}-jruby.gem"
19
38
 
20
- desc "Run RSpecs tests with summary output and fast failure"
39
+ ENV['MTK_BUILD_FOR_JRUBY'] = nil
40
+ `gem build ./mtk.gemspec`
41
+ puts "Built mtk-#{MTK_VERSION}.gem"
42
+ end
43
+ end
44
+
45
+
46
+ namespace :test do
47
+ desc "Run RSpec tests with summary output and fast failure"
21
48
  RSpec::Core::RakeTask.new(:fast) do |spec|
22
49
  spec.rspec_opts = ["--color", "--fail-fast"]
23
50
  end
24
51
 
25
- desc "Run RSpecs tests on mutiple versions of Ruby: 1.8.7, 1.9.2, JRuby 1.5.6, and JRuby 1.6.2"
26
- task :xversion do
27
- fail unless system("rvm 1.8.7,1.9.2,jruby-1.5.6,jruby-1.6.2 rake -f #{__FILE__} spec:fast")
52
+ desc "Run RSpec tests and generate a coverage report"
53
+ if RUBY_PLATFORM == "java"
54
+ task :cov do |t|
55
+ fail "#{t} task is not compatible with JRuby. Use Ruby 1.9 instead."
56
+ end
57
+ else
58
+ RSpec::Core::RakeTask.new(:cov) do |spec|
59
+ spec.rspec_opts = ["--color", "-r", "#{File.dirname __FILE__}/spec/spec_coverage.rb"]
60
+ end
28
61
  end
29
62
 
63
+ desc "Profile RSpec tests and report 10 slowest"
64
+ RSpec::Core::RakeTask.new(:prof) do |spec|
65
+ spec.rspec_opts = ["--color", "-p"]
66
+ end
67
+
68
+ desc "Run RSpec tests on all supported versions of Ruby: #{SUPPORTED_RUBIES.join ', '}"
69
+ task :all do
70
+ fail unless system("rvm #{SUPPORTED_RUBIES.join ','} do bundle exec rake -f #{__FILE__} test:fast")
71
+ end
30
72
  end
31
73
 
32
74
 
33
- YARD::Rake::YardocTask.new do |yard|
34
- yard.files = ['lib/**/*.rb', 'spec/**/*.rb']
35
- yard.options = []
36
- if File.exist? '../yard-spec-plugin/lib/yard-rspec.rb'
37
- # prefer my local patched copy which can handle my rspec conventions better...
38
- yard.options.concat ['-e' '../yard-spec-plugin/lib/yard-rspec.rb']
39
- else
40
- # use the gem
41
- yard.options.concat ['-e' 'yard-rspec']
75
+ begin
76
+ require 'yard'
77
+ YARD::Rake::YardocTask.new(:doc) do |yard|
78
+ yard.files = ['lib/**/*.rb']
42
79
  end
80
+ rescue Exception # yard is optional, so don't cause rake to fail if it's missing
43
81
  end