summarizer 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,25 @@
1
+ ## NetBeans
2
+ nbproject/
3
+
4
+ ## MAC OS
5
+ .DS_Store
6
+
7
+ ## TEXTMATE
8
+ *.tmproj
9
+ tmtags
10
+
11
+ ## EMACS
12
+ *~
13
+ \#*
14
+ .\#*
15
+
16
+ ## VIM
17
+ *.swp
18
+
19
+ ## PROJECT::GENERAL
20
+ coverage
21
+ rdoc
22
+ pkg
23
+
24
+ ## PROJECT::SPECIFIC
25
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Christoph Petschnig
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,77 @@
1
+ = summarizer
2
+
3
+ == Summary
4
+
5
+ In the model:
6
+
7
+ class Foo < ActiveRecord::Base
8
+ include Summarizer::Base # add Summarizer to your class
9
+ summarize :net, :gross # which columns/methods do you want to sum up?
10
+ end
11
+
12
+
13
+ In the controller:
14
+
15
+ # find_with_sums extends ActiveRecord.find
16
+ @foos = Foo.find_with_sums(:all, :order => 'created_at',
17
+ :split_sections_on => Proc.new {|a,b| a.at.month != b.at.month},
18
+ :section_label => Proc.new{|obj| obj.at.strftime("%B %Y")})
19
+
20
+
21
+ In the view:
22
+
23
+ <table>
24
+ <% @foos.each_with_sums do |foo| %>
25
+ <%= render :partial => 'index_section_header', :locals => { :header => foo.section_label } if foo.new_section? %>
26
+ <tr>
27
+ <td><%=h foo.created_at %></td>
28
+ <td><%=h foo.name %></td>
29
+ <td><%=h foo.gross %></td>
30
+ <td><%=h foo.net %></td>
31
+ </tr>
32
+ <%= render :partial => 'index_sum', :locals => { :sum => foo.section_sum } if foo.end_of_section? %>
33
+ <% end %>
34
+ <%= render :partial => 'index_sum', :locals => { :sum => @foos.total } %>
35
+ </table>
36
+
37
+ The partials _index_section_header.html.erb
38
+
39
+ <tr>
40
+ <td colspan="4"><%= header %></td>
41
+ </tr>
42
+
43
+ and _index_sum.html.erb
44
+
45
+ <tr>
46
+ <td colspan="2">Total</td>
47
+ <td><%= sum.gross %></td>
48
+ <td><%= sum.net %></td>
49
+ </tr>
50
+
51
+
52
+ In the Browser:
53
+
54
+ November 2009
55
+ 2009-11-29 03:32:27 Blah 160.46 91.25
56
+ Total 160.46 91.25
57
+
58
+ December 2009
59
+ 2009-12-04 01:32:45 Blub 130.42 122.24
60
+ 2009-12-05 18:02:33 Bar 77.53 135.57
61
+ 2009-12-15 21:19:25 Blah 175.32 150.42
62
+ 2009-12-31 17:21:49 Baz 192.05 135.04
63
+ Total 575.32 543.27
64
+
65
+ January 2010
66
+ 2010-01-08 18:26:48 Blub 116.14 151.22
67
+ Total 116.14 151.22
68
+ ----------------------------------------------
69
+ Total 851.92 785.74
70
+
71
+ == Usage
72
+
73
+ Soon to come...
74
+
75
+ == Copyright
76
+
77
+ Copyright (c) 2010 Christoph Petschnig. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "summarizer"
8
+ gem.summary = "Make sums and subtotals of your database tables"
9
+ gem.description = "Make sums and subtotals of your database tables"
10
+ gem.email = "info@purevirtual.de"
11
+ gem.homepage = "http://github.com/ChristophPetschnig/summarizer"
12
+ gem.authors = ["Christoph Petschnig"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_development_dependency "yard", ">= 0"
15
+ gem.add_development_dependency "cucumber", ">= 0"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'spec/rake/spectask'
24
+ Spec::Rake::SpecTask.new(:spec) do |spec|
25
+ spec.libs << 'lib' << 'spec'
26
+ spec.spec_files = FileList['spec/**/*_spec.rb']
27
+ end
28
+
29
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
30
+ spec.libs << 'lib' << 'spec'
31
+ spec.pattern = 'spec/**/*_spec.rb'
32
+ spec.rcov = true
33
+ end
34
+
35
+ task :spec => :check_dependencies
36
+
37
+ begin
38
+ require 'cucumber/rake/task'
39
+ Cucumber::Rake::Task.new(:features)
40
+
41
+ task :features => :check_dependencies
42
+ rescue LoadError
43
+ task :features do
44
+ abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
45
+ end
46
+ end
47
+
48
+ task :default => :spec
49
+
50
+ begin
51
+ require 'yard'
52
+ YARD::Rake::YardocTask.new
53
+ rescue LoadError
54
+ task :yardoc do
55
+ abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
56
+ end
57
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
@@ -0,0 +1,91 @@
1
+ Given /^I need sub\-totals for each (.*)$/ do |sum_type|
2
+ # get a symbol key out of string sum_type
3
+ @sum_type = case sum_type
4
+ when 'letter in the alphabet for `name`' then :name_1st_char
5
+ else
6
+ sum_type.gsub(/[- ]/, '_').to_sym
7
+ end
8
+
9
+ case @sum_type
10
+ when :month then
11
+ @order_by = 'at ASC'
12
+ @proc = Proc.new{|obj| obj.at.strftime('%Y-%m')}
13
+ when :name_1st_char then
14
+ @order_by = 'name ASC'
15
+ @proc = Proc.new{|obj| obj.name[0,1].upcase}
16
+ when :different_bar then
17
+ @order_by = 'bar_id ASC'
18
+ @proc = Proc.new{|obj| obj.bar_id}
19
+ else
20
+ raise "Unknown test case `#{sum_type}`"
21
+ end
22
+
23
+ @split_sections_on = Proc.new {|a,b| @proc.call(a) != @proc.call(b)}
24
+
25
+ # create some data
26
+ 100.times { Factory.create :foo }
27
+
28
+ @sum_comp = Hash.new
29
+
30
+ foos = Foo.find(:all, :order => @order_by)
31
+ foos.each do |foo|
32
+ key = @proc.call(foo)
33
+
34
+ #initialize pair
35
+ @sum_comp[key] ||= {:costs => 0.0, :price => 0.0, :diff => 0.0}
36
+
37
+ @sum_comp[key][:costs] += foo.costs
38
+ @sum_comp[key][:price] += foo.price
39
+ @sum_comp[key][:diff] += foo.diff
40
+ end
41
+ #@sum_comp.each{|k,v|puts "#{k}: #{v[:costs]} #{v[:price]} #{v[:diff]}"}
42
+ end
43
+
44
+ When /^I call `Foo::find_with_sums`$/ do
45
+ @foos = Foo.find_with_sums(:all,
46
+ :order => @order_by, :split_sections_on => @split_sections_on,
47
+ :section_label => @proc)
48
+ end
49
+
50
+ Then /^`each_with_sums` should return correct values$/ do
51
+ last_item = nil
52
+ @foos.each_with_sums do |item|
53
+ end_of_section = last_item && @proc.call(item) != @proc.call(last_item)
54
+
55
+ key = @proc.call(last_item) if last_item
56
+
57
+ if end_of_section
58
+ last_item.section_sum.costs.should == @sum_comp[key][:costs]
59
+ last_item.section_sum.price.should == @sum_comp[key][:price]
60
+ last_item.section_sum.diff.should == @sum_comp[key][:diff]
61
+ end
62
+
63
+ last_item = item
64
+ end
65
+ end
66
+
67
+ #When /^I use `each_with_sums`$/ do
68
+ # @foos.each_with_sums do |item|
69
+ #
70
+ #
71
+ # end
72
+ #end
73
+
74
+ Then /^I should see a table with sub\-totals$/ do
75
+ @foos.each_with_sums do |item|
76
+ puts "+--- #{item.section_label} ".ljust(60, '-') + '+' if item.new_section?
77
+ puts "| #{item.at.strftime('%Y-%m-%d')} #{item.name.ljust(8)} " +
78
+ "#{(item.bar ? item.bar.name : '').rjust(8)} #{format('%.2f', item.costs).rjust(8)} " +
79
+ "#{format('%.2f', item.price).rjust(8)} #{format('%.2f', item.diff).rjust(7)} |"
80
+ if item.end_of_section?
81
+ puts "+" + '-' * 59 + '+'
82
+ puts "| Total #{item.section_label} ".ljust(34) + "#{format('%.2f', item.section_sum.costs).rjust(8)} " +
83
+ "#{format('%.2f', item.section_sum.price).rjust(8)} #{format('%.2f', item.section_sum.diff).rjust(7)} |\n"
84
+ puts "+" + '-' * 59 + "+\n\n"
85
+ end
86
+ end
87
+ puts "+" + '-' * 59 + '+'
88
+ puts "| Grand Total".ljust(34) + "#{format('%.2f', @foos.total.costs).rjust(8)} " +
89
+ "#{format('%.2f', @foos.total.price).rjust(8)} #{format('%.2f', @foos.total.diff).rjust(7)} |\n"
90
+ puts "+" + '-' * 59 + "+\n\n"
91
+ end
@@ -0,0 +1,19 @@
1
+ Feature: Summarizer Base
2
+
3
+ Scenario: Table with a section for each month
4
+ Given I need sub-totals for each month
5
+ When I call `Foo::find_with_sums`
6
+ #Then I should see a table with sub-totals
7
+ Then `each_with_sums` should return correct values
8
+
9
+ Scenario: Table with a section for every letter in the alphabet
10
+ Given I need sub-totals for each letter in the alphabet for `name`
11
+ When I call `Foo::find_with_sums`
12
+ #Then I should see a table with sub-totals
13
+ Then `each_with_sums` should return correct values
14
+
15
+ Scenario: Table with a section for each `belongs_to` entity `Bar`
16
+ Given I need sub-totals for each different bar
17
+ When I call `Foo::find_with_sums`
18
+ #Then I should see a table with sub-totals
19
+ Then `each_with_sums` should return correct values
@@ -0,0 +1,57 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'summarizer'
3
+
4
+ require 'spec/expectations'
5
+
6
+ require 'factory_girl'
7
+ require 'active_record'
8
+ require 'database_cleaner'
9
+ require 'database_cleaner/cucumber'
10
+
11
+ require File.dirname(__FILE__) + '/../../spec/models/foo'
12
+ require File.dirname(__FILE__) + '/../../spec/models/bar'
13
+
14
+
15
+ # taken from will_paginate, activerecord_test_connector.rb
16
+ def setup_connection
17
+ db = ENV['DB'].blank?? 'mysql' : ENV['DB']
18
+
19
+ configurations = YAML.load_file(File.join(File.dirname(__FILE__), '..', '..', 'spec', 'database.yml'))
20
+ raise "no configuration for '#{db}'" unless configurations.key? db
21
+ configuration = configurations[db]
22
+
23
+ ActiveRecord::Base.logger = Logger.new(STDOUT) if $0 == 'irb'
24
+ puts "using #{configuration['adapter']} adapter" unless ENV['DB'].blank?
25
+
26
+ gem 'sqlite3-ruby' if 'sqlite3' == db
27
+
28
+ ActiveRecord::Base.establish_connection(configuration)
29
+ ActiveRecord::Base.configurations = { db => configuration }
30
+ #prepare ActiveRecord::Base.connection
31
+
32
+ unless Object.const_defined?(:QUOTED_TYPE)
33
+ Object.send :const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')
34
+ end
35
+ end
36
+
37
+
38
+ setup_connection
39
+
40
+
41
+ DatabaseCleaner.strategy = :truncation
42
+
43
+
44
+ begin
45
+ CreateFoos.migrate(:up) unless Foo.table_exists?
46
+ CreateBars.migrate(:up) unless Bar.table_exists?
47
+ rescue
48
+ end
49
+
50
+
51
+ DatabaseCleaner.clean
52
+
53
+
54
+ require 'active_record/fixtures'
55
+
56
+ Fixtures.create_fixtures(File.join(File.dirname(__FILE__), '..', '..', 'spec', 'fixtures'), 'bars')
57
+
@@ -0,0 +1,49 @@
1
+ # Adds a class to sum up attributes of the class where it's included
2
+ module Summarizer
3
+ module Base
4
+ class AddItUp
5
+
6
+ def initialize(tied_to_class)
7
+ # get options from referring class
8
+ options = tied_to_class.read_inheritable_attribute 'options'
9
+ # initialize attributes
10
+ @attributes = {}
11
+ (tied_to_class.read_inheritable_attribute('attributes') || []).each{|a| @attributes[a] = 0.0}
12
+ @digits = options[:digits] || 2
13
+ @digits_factor = 1.0
14
+ @digits.times{ @digits_factor *= 10 }
15
+ @empty = true
16
+ end
17
+
18
+ # Add attribute values of referring class instance
19
+ def add(obj)
20
+ @attributes.each{|key, value| @attributes[key] = value + (obj.send(key) * @digits_factor).round / @digits_factor}
21
+ @empty = false
22
+ end
23
+
24
+ def reset
25
+ @attributes.each_key{|key| @attributes[key] = 0.0}
26
+ @empty = true
27
+ end
28
+
29
+ def empty?
30
+ @empty
31
+ end
32
+
33
+ def static
34
+ Static.new(@attributes)
35
+ end
36
+
37
+ def method_missing(symbol, *args)
38
+ return @attributes[symbol] if @attributes.has_key? symbol
39
+ super symbol, *args
40
+ end
41
+
42
+ def respond_to?(symbol, include_priv = false)
43
+ return true if @attributes.has_key? symbol
44
+ super symbol, include_priv
45
+ end
46
+
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,132 @@
1
+ # Adds a class to sum up attributes of the class where it's included
2
+ module Summarizer
3
+ module Base
4
+
5
+ def self.included(base)
6
+ # Class enhancements
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ # the methods in this module will become class methods
11
+ module ClassMethods
12
+ # macro: store the option and the attribute to summarize
13
+ def summarize(*args)
14
+ options = args.last.kind_of?(Hash) ? args.pop : {}
15
+
16
+ write_inheritable_attribute 'attributes', args
17
+ write_inheritable_attribute 'options', options
18
+ end
19
+
20
+ def find_with_sums(*args)
21
+
22
+ options = args.extract_options!
23
+
24
+ raise ArgumentError unless args.first.nil? || args.first == :all
25
+
26
+ # extract method specific options before call to +find+
27
+ split_sections_on = options.delete(:split_sections_on)
28
+ section_label = options.delete(:section_label)
29
+
30
+ ar = self.find(:all, options)
31
+
32
+ class << ar
33
+ attr_reader :total
34
+ attr_writer :referring_class, :split_sections_on
35
+ attr_accessor :section_label
36
+
37
+ def each_with_sums(&block)
38
+
39
+ @total = AddItUp.new(@referring_class)
40
+ sub_total = AddItUp.new(@referring_class)
41
+ previous_item = nil
42
+
43
+ self.each_with_index do |item, index|
44
+ class << item
45
+ attr_writer :section_label
46
+ def set_table_info(new_group, end_of_group, sum_group)
47
+ @new_section = new_group
48
+ @end_of_section = end_of_group
49
+ @sum_section = sum_group.static if end_of_group
50
+ end
51
+ # Returns +true+, if this items is the first of a new section
52
+ def new_section?
53
+ @new_section
54
+ end
55
+ # Returns +true+, if this items is the last of a section
56
+ def end_of_section?
57
+ @end_of_section
58
+ end
59
+ # Returns the summarizer object of the given section
60
+ def section_sum
61
+ @sum_section
62
+ end
63
+ def section_label
64
+ if @section_label.kind_of?(Proc)
65
+ @section_label.call(self)
66
+ elsif @section_label.kind_of?(Symbol)
67
+ # if a Symbol is given, call the matching method
68
+ self.send(@section_label)
69
+ else
70
+ raise ArgumentError.new("@section_label has class #{@section_label.class}, but must be either Proc or Symbol.")
71
+ raise ArgumentError.new("Value of :section_label has class #{@section_label.class}, but must be either Proc or Symbol.")
72
+ end
73
+ end
74
+ end
75
+
76
+ # check, if item opens a new section in the array
77
+ new_section = previous_item.nil? || check_for_different_sections(previous_item, item)
78
+
79
+ # peek at the next item to see if item is the last of the section
80
+ next_item = self.at(index + 1)
81
+
82
+ end_of_section = next_item.nil? || check_for_different_sections(item, next_item)
83
+
84
+ # add it up!
85
+ @total.add(item)
86
+ sub_total.add(item)
87
+
88
+ # store information in item
89
+ item.set_table_info(new_section, end_of_section, sub_total)
90
+
91
+ item.section_label = self.section_label
92
+
93
+ # yield the block
94
+ yield item
95
+
96
+ # reset summarizer if neccesary
97
+ sub_total.reset if end_of_section
98
+
99
+ # loop!
100
+ previous_item = item
101
+ end
102
+
103
+ self
104
+ end
105
+
106
+ private
107
+ def check_for_different_sections(a, b)
108
+ if @split_sections_on.kind_of?(Proc)
109
+ # evaluate Proc to check, if item is in a new section
110
+ @split_sections_on.call(a, b)
111
+ elsif @split_sections_on.kind_of?(Symbol)
112
+ # if a Symbol is given, compare the return values of their functions
113
+ a.send(@split_sections_on) != b.send(@split_sections_on)
114
+ else
115
+ raise ArgumentError.new("Value of :split_sections_on has class #{@split_sections_on.class}, but must be either Proc or Symbol.")
116
+ end
117
+ end
118
+ end
119
+
120
+ ar.split_sections_on = split_sections_on
121
+ ar.section_label = section_label
122
+
123
+ # Array just wouldn't know otherwise, with class it belongs to
124
+ ar.referring_class = self
125
+
126
+ ar
127
+ end
128
+
129
+ end
130
+
131
+ end
132
+ end
@@ -0,0 +1,22 @@
1
+ # Serves as a copy of AddItUp with static data
2
+ module Summarizer
3
+ module Base
4
+ class Static
5
+
6
+ def initialize(attributes)
7
+ @attributes = attributes.clone
8
+ end
9
+
10
+ def method_missing(symbol, *args)
11
+ return @attributes[symbol] if @attributes.has_key? symbol
12
+ super symbol, *args
13
+ end
14
+
15
+ def respond_to?(symbol, include_priv = false)
16
+ return true if @attributes.has_key? symbol
17
+ super symbol, include_priv
18
+ end
19
+
20
+ end
21
+ end
22
+ end
data/lib/summarizer.rb ADDED
@@ -0,0 +1,10 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ module Summarizer
5
+ VERSION = '0.0.1'
6
+ end
7
+
8
+ require 'summarizer/base'
9
+ require 'summarizer/add_it_up'
10
+ require 'summarizer/static'
data/spec/database.yml ADDED
@@ -0,0 +1,10 @@
1
+ mysql:
2
+ adapter: mysql
3
+ encoding: utf8
4
+ reconnect: false
5
+ database: rails_summarizer_test
6
+ pool: 5
7
+ username: rails
8
+ password: rails
9
+ socket: /var/run/mysqld/mysqld.sock
10
+
data/spec/factories.rb ADDED
@@ -0,0 +1,12 @@
1
+
2
+ NAMES = %w{ Fred Suzie John Mary Mike Amy Bill Kim Steve Katie Larry Mel Alex Lisa Jack Betty Sam Pam Drew Janet Frank Ruby Willy Rita Andy }
3
+
4
+ Factory.define :foo do |f|
5
+ f.name {NAMES[rand(NAMES.length)] }
6
+ #f.at {rand(365 + 28).days.ago}
7
+ f.at {rand(100).days.ago}
8
+ f.bar_id {1 + rand(4)}
9
+ f.costs {|obj| 100 + obj.bar_id * 30 + 70.0 * rand}
10
+ f.price {|obj| obj.costs + 50 + 50.0 * rand}
11
+ end
12
+
@@ -0,0 +1,15 @@
1
+ Alpha:
2
+ id: 1
3
+ name: Alpha
4
+
5
+ Beta:
6
+ id: 2
7
+ name: Beta
8
+
9
+ Gamma:
10
+ id: 3
11
+ name: Gamma
12
+
13
+ Omega:
14
+ id: 4
15
+ name: Omega
@@ -0,0 +1,18 @@
1
+ class Bar < ActiveRecord::Base
2
+ #data 'Alpha', 'Beta', 'Gamma', 'Omega'
3
+ end
4
+
5
+
6
+
7
+ class CreateBars < ActiveRecord::Migration
8
+ def self.up
9
+ create_table :bars do |t|
10
+ t.string :name
11
+ end
12
+ end
13
+
14
+ def self.down
15
+ drop_table :bars
16
+ end
17
+ end
18
+
@@ -0,0 +1,32 @@
1
+ class Foo < ActiveRecord::Base
2
+
3
+ include Summarizer::Base
4
+
5
+ summarize :price, :costs, :diff
6
+
7
+ belongs_to :bar
8
+
9
+ def diff
10
+ self.price - self.costs
11
+ end
12
+
13
+ end
14
+
15
+
16
+ class CreateFoos < ActiveRecord::Migration
17
+ def self.up
18
+ create_table :foos do |t|
19
+ t.string :name
20
+ t.datetime :at
21
+ t.integer :bar_id
22
+ t.decimal :price, :precision => 12, :scale => 2
23
+ t.decimal :costs, :precision => 12, :scale => 2
24
+ t.timestamps
25
+ end
26
+ end
27
+
28
+ def self.down
29
+ drop_table :foos
30
+ end
31
+ end
32
+
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'summarizer'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
10
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Summarizer" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
@@ -0,0 +1,74 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{summarizer}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Christoph Petschnig"]
12
+ s.date = %q{2010-02-07}
13
+ s.description = %q{Make sums and subtotals of your database tables}
14
+ s.email = %q{info@purevirtual.de}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "features/step_definitions/summarizer_steps.rb",
26
+ "features/summarizer.feature",
27
+ "features/support/env.rb",
28
+ "lib/summarizer.rb",
29
+ "lib/summarizer/add_it_up.rb",
30
+ "lib/summarizer/base.rb",
31
+ "lib/summarizer/static.rb",
32
+ "spec/database.yml",
33
+ "spec/factories.rb",
34
+ "spec/fixtures/bars.yml",
35
+ "spec/models/bar.rb",
36
+ "spec/models/foo.rb",
37
+ "spec/spec.opts",
38
+ "spec/spec_helper.rb",
39
+ "spec/summarizer_spec.rb",
40
+ "summarizer.gemspec"
41
+ ]
42
+ s.homepage = %q{http://github.com/ChristophPetschnig/summarizer}
43
+ s.rdoc_options = ["--charset=UTF-8"]
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = %q{1.3.5}
46
+ s.summary = %q{Make sums and subtotals of your database tables}
47
+ s.test_files = [
48
+ "spec/models/foo.rb",
49
+ "spec/models/bar.rb",
50
+ "spec/spec_helper.rb",
51
+ "spec/summarizer_spec.rb",
52
+ "spec/factories.rb"
53
+ ]
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
61
+ s.add_development_dependency(%q<yard>, [">= 0"])
62
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
63
+ else
64
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
65
+ s.add_dependency(%q<yard>, [">= 0"])
66
+ s.add_dependency(%q<cucumber>, [">= 0"])
67
+ end
68
+ else
69
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
70
+ s.add_dependency(%q<yard>, [">= 0"])
71
+ s.add_dependency(%q<cucumber>, [">= 0"])
72
+ end
73
+ end
74
+
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: summarizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Christoph Petschnig
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-07 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.2.9
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: yard
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: cucumber
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ description: Make sums and subtotals of your database tables
46
+ email: info@purevirtual.de
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - LICENSE
53
+ - README.rdoc
54
+ files:
55
+ - .gitignore
56
+ - LICENSE
57
+ - README.rdoc
58
+ - Rakefile
59
+ - VERSION
60
+ - features/step_definitions/summarizer_steps.rb
61
+ - features/summarizer.feature
62
+ - features/support/env.rb
63
+ - lib/summarizer.rb
64
+ - lib/summarizer/add_it_up.rb
65
+ - lib/summarizer/base.rb
66
+ - lib/summarizer/static.rb
67
+ - spec/database.yml
68
+ - spec/factories.rb
69
+ - spec/fixtures/bars.yml
70
+ - spec/models/bar.rb
71
+ - spec/models/foo.rb
72
+ - spec/spec.opts
73
+ - spec/spec_helper.rb
74
+ - spec/summarizer_spec.rb
75
+ - summarizer.gemspec
76
+ has_rdoc: true
77
+ homepage: http://github.com/ChristophPetschnig/summarizer
78
+ licenses: []
79
+
80
+ post_install_message:
81
+ rdoc_options:
82
+ - --charset=UTF-8
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ version:
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: "0"
96
+ version:
97
+ requirements: []
98
+
99
+ rubyforge_project:
100
+ rubygems_version: 1.3.5
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: Make sums and subtotals of your database tables
104
+ test_files:
105
+ - spec/models/foo.rb
106
+ - spec/models/bar.rb
107
+ - spec/spec_helper.rb
108
+ - spec/summarizer_spec.rb
109
+ - spec/factories.rb