ludy 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,12 +1,22 @@
1
1
  = ludy changes history
2
2
 
3
+ == ludy 0.1.10, 2008.02.07
4
+
5
+ * fixed an offset bug in paginator. if the offset was equal to the count,
6
+ there should be no page existed.
7
+ * fixed and updated rdoc presentation
8
+ * fixed a warning of shadowing variables in ruby 1.9
9
+
10
+ * added the offset test in test_paginator
11
+ * make some Kernel method private
12
+
3
13
  == ludy 0.1.9, 2008.02.07
4
14
 
5
15
  * fixed a bug in RailsPaginator, which ignored opts for count.
6
16
  * fixed a possible bug in puzzle_generator... (not happened before?)
7
17
  * fixed a stupid timeout message bug...
8
18
 
9
- * added multiruby test (from ZenTest) with ruby 1.8.6-p111, 1.9.0-0, svn
19
+ * added multiruby test (from ZenTest) with ruby 1.8.6-p111, 1.9.0-0, svn trunk
10
20
  * added Array#head, Array#choice!, Array#count
11
21
  * added Array#product, which came from ruby 1.9 (implemented by combos in ruby 1.8)
12
22
  * added Kernel#deep_copy, by Marshal idiom
data/README CHANGED
@@ -1,9 +1,8 @@
1
- = ludy 0.1.9
2
- by Lin Jen-Shin (a.k.a. godfat 真常)
3
- strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org
4
- http://ludy.rubyforge.org
5
- http://rubyforge.org/projects/ludy
6
- http://godfat.org
1
+ = ludy 0.1.10
2
+ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
3
+ strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org
4
+ * rdoc[http://ludy.rubyforge.org]
5
+ * rubyforge-project[http://rubyforge.org/projects/ludy]
7
6
 
8
7
  == DESCRIPTION:
9
8
 
data/lib/ludy.rb CHANGED
@@ -9,7 +9,7 @@ end
9
9
  module Ludy
10
10
 
11
11
  # :stopdoc:
12
- VERSION = '0.1.9'
12
+ VERSION = '0.1.10'
13
13
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
14
14
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
15
15
  $LOAD_PATH << LIBPATH
@@ -1,8 +1,8 @@
1
1
 
2
2
  class Array
3
3
  # strip the last element
4
- # [1,2,3].body
5
- # => [1,2]
4
+ # [1,2,3].body
5
+ # => [1,2]
6
6
  def body
7
7
  self[0..-2]
8
8
  end
@@ -2,15 +2,16 @@
2
2
  require 'ludy/symbol/to_proc' if RUBY_VERSION < '1.9.0'
3
3
 
4
4
  class Array
5
- # [1,2,3].combine [2,4,6]
6
- # => [3,6,9]
5
+ # example:
6
+ # [1,2,3].combine [2,4,6]
7
+ # => [3,6,9]
7
8
  #
8
- # [1,2].combine [1,2], [1,2]
9
- # => [3,6]
9
+ # [1,2].combine [1,2], [1,2]
10
+ # => [3,6]
10
11
  #
11
- # ['a','b'].combine ['b','a']
12
- # => ['ab','ba']
12
+ # ['a','b'].combine ['b','a']
13
+ # => ['ab','ba']
13
14
  def combine *target; zip(*target).map{|i|i.inject(&:+)}; end
14
- # in-place version of combine
15
+ # inplace version of combine
15
16
  def combine! *target; replace combine(*target); end
16
17
  end
@@ -4,8 +4,8 @@ class Array
4
4
  require 'ludy/array/foldr'
5
5
  require 'ludy/symbol/to_proc' if RUBY_VERSION < '1.9.0'
6
6
  # for each combos
7
- # [[0,1],[2,3]].combos
8
- # => [[0,2],[0,3],[1,2],[1,3]]
7
+ # [[0,1],[2,3]].combos
8
+ # => [[0,2],[0,3],[1,2],[1,3]]
9
9
  def combos
10
10
  result = []
11
11
  radixs = reverse.map(&:size)
@@ -22,9 +22,10 @@ class Array
22
22
  else
23
23
  require 'ludy/array/tail'
24
24
  # for each combos
25
- # [[0,1],[2,3]].combos
26
- # => [[0,2],[0,3],[1,2],[1,3]]
27
- # simply: array.first.product *array.tail
25
+ # [[0,1],[2,3]].combos
26
+ # => [[0,2],[0,3],[1,2],[1,3]]
27
+ # simply:
28
+ # array.first.product *array.tail
28
29
  def combos
29
30
  first.product(*tail)
30
31
  end
@@ -1,5 +1,6 @@
1
1
 
2
2
  class Array
3
+ # just like each_with_index
3
4
  def map_with_index
4
5
  i = -1
5
6
  map{ |e| i+=1; yield e, i; }
@@ -14,7 +14,7 @@ class Array
14
14
  return self if empty? or n == 0
15
15
  self[-n..-1] + self[0...-n]
16
16
  end
17
- # in-place version of rotate
17
+ # inplace version of rotate
18
18
  def rotate!
19
19
  replace rotate
20
20
  end
@@ -1,6 +1,7 @@
1
1
 
2
2
  class Array
3
- # simply array[1..-1]
3
+ # simply call
4
+ # array[1..-1]
4
5
  def tail
5
6
  self[1..-1]
6
7
  end
data/lib/ludy/dices.rb CHANGED
@@ -3,6 +3,7 @@ module Ludy
3
3
 
4
4
  # dices, e.g., 4d6, 2d20, etc.
5
5
  class Dices
6
+ # dices amounts of this dices; faces of this kind of dice
6
7
  attr_reader :amounts, :faces
7
8
  # the default dice is 1d20
8
9
  def initialize amounts = 1, faces = 20
@@ -21,6 +22,7 @@ module Ludy
21
22
 
22
23
  # a dice set could contain 4d6 + 2d20 and more dices.
23
24
  class DiceSet
25
+ # the min and max possible value of this dice set.
24
26
  attr_reader :min, :max
25
27
  def initialize *args
26
28
  @diceset = args
@@ -1,5 +1,7 @@
1
1
 
2
2
  module Kernel
3
+ # common idiom for:
4
+ # Marshal::load(Marshal::dump(self))
3
5
  def deep_copy
4
6
  Marshal::load(Marshal::dump(self))
5
7
  end
@@ -1,5 +1,8 @@
1
1
 
2
2
  module Kernel
3
+ private
4
+ # return true or false
5
+ # simply call rand(2) == 0
3
6
  def maybe
4
7
  rand(2) == 0
5
8
  end
@@ -10,6 +10,7 @@ module Ludy
10
10
  # call Page#fetch
11
11
  class Page
12
12
  undef_method :to_a if RUBY_VERSION < '1.9.0'
13
+ # pager to get the original pager; page to get the number of this page
13
14
  attr_reader :pager, :page
14
15
  # don't create a page instance yourself unless you have to
15
16
  def initialize pager, page; @pager, @page = pager, page; end
@@ -72,7 +73,7 @@ module Ludy
72
73
  # nil would be returned. note, page start at 1, not zero.
73
74
  def page page
74
75
  offset = (page-1)*@per_page
75
- return nil unless page > 0 and offset <= count
76
+ return nil unless page > 0 and offset < count
76
77
  Page.new self, page
77
78
  end
78
79
  # return the amount of pages
@@ -93,8 +94,8 @@ module Ludy
93
94
  # they would be used in find options. e.g.,
94
95
  # RailsPaginator.new Model, :order => 'created_at DESC'
95
96
  # would invoke Model.find :all, :offset => ?, :limit => ?, order => 'created_at DESC'
96
- # TODO: conditions/options invoker...
97
97
  class RailsPaginator < Paginator
98
+ # the model class that you passed in this paginator
98
99
  attr_reader :model_class
99
100
  def initialize model_class, opts = {}
100
101
  @model_class = model_class
@@ -112,6 +113,7 @@ module Ludy
112
113
  # and create pages simply for your_data[offset, per_page]
113
114
  # if your data is much more complex, use Paginator instead of this
114
115
  class ArrayPaginator < Paginator
116
+ # data that you passed in this paginator
115
117
  attr_reader :data
116
118
  def initialize data
117
119
  @data = data
@@ -12,7 +12,7 @@ class Proc
12
12
  def curry
13
13
  class << self
14
14
  alias_method :__call__, :call
15
- def call *args, &block
15
+ def call *args, &block # :nodoc:
16
16
  if self.arity == -1
17
17
  begin # let's try if arguments are ready
18
18
  # is there any better way to determine this?
@@ -53,8 +53,10 @@ namespace :preprocess do
53
53
 
54
54
  erubis_inputs.zip(erubis_outputs).each{ |input, output|
55
55
  file output => input do
56
- class ErboutEruby < Erubis::Eruby; include Erubis::ErboutEnhancer; end
57
- preprocess lambda{|input| ErboutEruby.new input, :trim => false}, input, output
56
+ class ErboutEruby < Erubis::Eruby #:nodoc:
57
+ include Erubis::ErboutEnhancer
58
+ end
59
+ preprocess lambda{|in_str| ErboutEruby.new in_str, :trim => false}, input, output
58
60
  end
59
61
  }
60
62
  rescue LoadError; end # no erubis
@@ -2,11 +2,27 @@
2
2
  require 'ludy/tasks/common'
3
3
 
4
4
  module Kernel
5
+ # it simply output:
6
+ # #ifndef NDEBUG
7
+ # #include <iostream>
8
+ # #endif
5
9
  def debug_include
6
10
  '#ifndef NDEBUG
7
11
  #include <iostream>
8
12
  #endif'
9
13
  end
14
+ # example usage:
15
+ # void <% debug_hook 'C::f' do %>(){
16
+ # <% end %>
17
+ # std::cout << "hello" << std::endl;
18
+ # }
19
+ # became:
20
+ # void C::f(){
21
+ # #ifndef NDEBUG
22
+ # std::cerr << "method C::f called, for " << this << " at c.cpp: 12\n"
23
+ # #endif
24
+ # std::cout << "hello" << std::endl;
25
+ # }
10
26
  def debug_hook name, &block
11
27
  Ludy::erbout name, block.binding
12
28
  block.call
data/lib/ludy/timer.rb CHANGED
@@ -4,6 +4,7 @@ module Ludy
4
4
  class Timeout < Exception; end
5
5
  # simple and stupid timer for puzzle_generator...
6
6
  class Timer
7
+ # create a timer for timeout seconds.
7
8
  def initialize timeout
8
9
  @timeout = timeout
9
10
  end
@@ -9,15 +9,31 @@ require 'ludy/hash/reverse_merge'
9
9
  # require 'facets/timer'
10
10
  require 'ludy/timer' # simple and stupid timer....
11
11
 
12
+ # puzzle generator for shooting-cubes[http://shooting-cubes.googlecodes.com],
13
+ # example usage:
14
+ # PuzzleGenerator.debug = true
15
+ # pg = PuzzleGenerator::Puzzle.new :level => 4, :timeout => 2, :invoke_max => 5
16
+ # begin
17
+ # pg.generate
18
+ # pg.display_map
19
+ # rescue Ludy::Timeout => e
20
+ # puts e
21
+ # ensure
22
+ # p pg.tried_times
23
+ # p pg.tried_duration
24
+ # end
12
25
  module PuzzleGenerator
13
26
 
14
- def self.generate_chained_map option = {}; generate_klass ChainedMap, option; end
15
- def self.generate_klass klass, option = {}
27
+ def self.generate_chained_map option = {} #:nodoc:
28
+ generate_klass ChainedMap, option
29
+ end
30
+ def self.generate_klass klass, option = {} #:nodoc:
16
31
  option.reverse_merge! :timeout => 5
17
32
  generate(option[:timeout]){ klass.new option }
18
33
  end
19
34
 
20
- LastTriedInfo = {}
35
+ LastTriedInfo = {} # :nodoc:
36
+ # generate someing with generator with timeout, used in Puzzle#generate
21
37
  def self.generate timeout = 5, &generator
22
38
  timer = Ludy::Timer.new(timeout).start
23
39
  tried_times = 1
@@ -6,10 +6,6 @@ require 'ludy/kernel/maybe'
6
6
  require 'ludy/array/count' if RUBY_VERSION < '1.9.0'
7
7
  require 'ludy/array/product' if RUBY_VERSION < '1.9.0'
8
8
 
9
- # a = [[1,2],[3,4],[5,6]]
10
- # [a, [1,2,3]].combos
11
- # => [[[1, 2], 1], [[1, 2], 2], [[1, 2], 3], [[3, 4], 1], [[3, 4], 2], [[3, 4], 3], [[5, 6], 1], [[5, 6], 2], [[5, 6], 3]]
12
-
13
9
  module PuzzleGenerator
14
10
 
15
11
  class Map # :nodoc:
@@ -3,13 +3,15 @@ require 'ludy/kernel/deep_copy'
3
3
  require 'ludy/array/pad'
4
4
 
5
5
  module PuzzleGenerator
6
- Up, Right, Left = (0..2).to_a
6
+ Up, Right, Left = (0..2).to_a # :nodoc:
7
7
  DefaultOption = {:width => 6, :height => 10, :level => 4, :colors => 4,
8
8
  :invoke => 3, :invoke_max => 5, :timeout => 5}
9
9
  # whenever the generation is falied, this exception would raise
10
10
  class GenerationFailed < RuntimeError; end
11
11
  class << self
12
+ # specify whether to show the answer in the puzzle
12
13
  attr_writer :debug
14
+ # specify whether to show the answer in the puzzle
13
15
  def debug; @debug || false; end
14
16
  end
15
17
 
@@ -10,10 +10,13 @@ module PuzzleGenerator
10
10
  class Puzzle
11
11
  include DisplayMap
12
12
  attr_reader :tried_times, :tried_duration
13
+ # create a puzzle with option. this won't start generating,
14
+ # call Puzzle::generate to start generating.
13
15
  def initialize option = {}
14
16
  @option = DefaultOption.merge option
15
17
  @tried_times, @tried_duration = [0, 0], [0, 0]
16
18
  end
19
+ # start generate a puzzle with options that created this puzzle instance.
17
20
  def generate
18
21
  raw_colors = (1..@option[:colors]).to_a
19
22
  step_colors = raw_colors.rotate
@@ -35,7 +38,7 @@ module PuzzleGenerator
35
38
  end
36
39
 
37
40
  private
38
- Chain, Color = 0, 1
41
+ Chain, Color = 0, 1 # :nodoc:
39
42
  def make_chain
40
43
  begin
41
44
  @result_chain =
@@ -47,6 +47,14 @@ class TestPaginator < Test::Unit::TestCase
47
47
  })
48
48
  for_pager pager
49
49
  end
50
+ def test_offset_bug
51
+ a = (0..9).to_a
52
+ pager = ArrayPaginator.new a
53
+ pager.per_page = 5
54
+ assert_equal 5, pager[1].size
55
+ assert_equal 5, pager[2].size
56
+ assert_nil pager[3]
57
+ end
50
58
  class Topic
51
59
  class << self
52
60
  def count opts = {}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ludy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Lin Jen-Shin (a.k.a. godfat \xE7\x9C\x9F\xE5\xB8\xB8)"