reparty 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ .idea
2
+ *.tmproj
3
+ *.tmproject
4
+ *.gem
5
+ *.rbc
6
+ .bundle
7
+ .config
8
+ .yardoc
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ doc/
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ tmp
19
+ test.db
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --tag ~letteropener:true
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@reparty --create
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in reparty.gemspec
4
+ gemspec
data/History.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.1.0
2
+
3
+ - Initial release
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 timdorr
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # Reparty [![Build Status](https://travis-ci.org/timdorr/reparty.png?branch=master)](https://travis-ci.org/timdorr/reparty) [![Dependency Status](https://gemnasium.com/timdorr/reparty.png)](https://gemnasium.com/timdorr/reparty) [![Code Climate](https://codeclimate.com/github/timdorr/reparty.png)](https://codeclimate.com/github/timdorr/reparty)
2
+
3
+ __A business analytics reporting party!__
4
+
5
+ Although initially concentrating on a daily email report, Reparty intends to be an easy
6
+ tool for building dashboards and reports focused on business analytics about your app.
7
+
8
+ Planned reporting modules include:
9
+
10
+ * ActiveRecord, including arbitrary sum/count columns
11
+ * Google Analytics/MixPanel/Gaug.es/etc etc
12
+ * Stripe
13
+ * Twitter
14
+
15
+ ## Configuration
16
+
17
+ Whilst not completely done, this is how you'll configure it for emailing a daily user count in the near future.
18
+
19
+ Reparty.config do |config|
20
+ config.from = "test@test.com"
21
+ config.subject = "SalesLoft JCA Daily Report"
22
+
23
+ config.add_report Reparty::Report::ActiveRecord, "New User Signups", :user
24
+ end
25
+
26
+ ## Usage
27
+
28
+ Generating an email is as simple as a rake task:
29
+
30
+ rake reparty:email[someone@somewhere.com]
31
+
32
+ You can run this in a cron job or other scheduling system.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
Binary file
@@ -0,0 +1,16 @@
1
+ ActionMailer::Base.view_paths = File.expand_path('../../views/', __FILE__)
2
+
3
+ class ReportMailer < ActionMailer::Base
4
+ def daily(to)
5
+
6
+ @reports = Reparty::Email.reports
7
+ @reports.each {|r| r.attach(attachments)}
8
+ attachments.inline['spacer.gif'] = File.read(Reparty.root + 'app/assets/images/spacer.gif')
9
+
10
+ mail(
11
+ from: Reparty::Email.from,
12
+ to: to,
13
+ subject: Reparty::Email.subject
14
+ )
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ <table width="500">
2
+ <tr>
3
+ <td align="left"><h3 style="margin:0"><%= report.title %></h3></td>
4
+ <td align="right">Total <%= report.model.to_s.pluralize %>: <%= number_with_delimiter(report.total) %></td>
5
+ </tr>
6
+ <tr>
7
+ <td colspan="2"><%= image_tag attachments["#{report.hash}.png"].url, align: "center" %></td>
8
+ </tr>
9
+ </table>
@@ -0,0 +1,20 @@
1
+ <html lang="en" xmlns="http://www.w3.org/1999/html" xmlns="http://www.w3.org/1999/html">
2
+ <head>
3
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
4
+ <style type="text/css">
5
+ body { font-family: Helvetica, Arial, sans-serif; }
6
+ </style>
7
+ </head>
8
+ <body>
9
+ <table cellpadding="0" cellspacing="0" border="0" align="center" width="600">
10
+ <tr>
11
+ <td><h1>Your Daily Report:</h1></td>
12
+ </tr>
13
+ <% @reports.each do |report| -%>
14
+ <tr><td>
15
+ <%= render partial: report.class.name.demodulize.underscore, locals:{report:report} %>
16
+ </td></tr>
17
+ <% end -%>
18
+ </table>
19
+ </body>
20
+ </html>
@@ -0,0 +1,16 @@
1
+ require "ostruct"
2
+
3
+ module Reparty
4
+ class Config < ::OpenStruct
5
+ attr_reader :reports
6
+
7
+ def initialize
8
+ @reports = []
9
+ super
10
+ end
11
+
12
+ def add_report(report, *args, &block)
13
+ @reports << report.new(*args, &block)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Reparty
2
+ class Email
3
+ class << self
4
+ def reports
5
+ Reparty.reports
6
+ end
7
+
8
+ def from
9
+ Reparty.configuration.from || 'nobody@nowhere.com'
10
+ end
11
+
12
+ def subject
13
+ Reparty.configuration.subject || "Reparty Report!"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ require 'rails'
2
+
3
+ module Reparty
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace Reparty
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Reparty
2
+ class Railtie < Rails::Railtie
3
+ rake_tasks do
4
+ load "tasks/reparty.rake"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,37 @@
1
+ module Reparty
2
+ class Report
3
+ class ActiveRecord < Report
4
+ attr_reader :model, :operation, :field
5
+
6
+ def initialize(*args, &block)
7
+ super(args.shift)
8
+
9
+ raise "Report::ActiveRecord: model undefined" unless args.first.is_a?(Symbol)
10
+ @model = Kernel.const_get(args.first.to_s.capitalize)
11
+
12
+ @operation = args.fetch(2, :count)
13
+ @field = :created_at
14
+
15
+ if args.last.is_a?(Hash)
16
+ @field = args.last.fetch(:field, @field)
17
+ end
18
+ end
19
+
20
+ def attach(attachments)
21
+ @graph = build_daily_graph
22
+
23
+ @graph.data(@model.to_s.pluralize, daily_dataset)
24
+
25
+ attachments.inline["#{self.hash}.png"] = @graph.to_blob
26
+ end
27
+
28
+ def daily_dataset
29
+ 7.downto(1).map { |x| @model.where("DATE(#{@field.to_s}) = ?", (DateTime.now.at_midnight-x).strftime('%Y-%m-%d')).send(@operation, @field) }
30
+ end
31
+
32
+ def total
33
+ @model.send(@operation, @field)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ require 'gruff'
2
+
3
+ module Reparty
4
+ class Report
5
+ attr_reader :title
6
+
7
+ def initialize(title)
8
+ raise "Report: title must be defined" if title.blank?
9
+ @title = title
10
+ end
11
+
12
+ def attach(attachments)
13
+ # Optional
14
+ end
15
+
16
+ protected
17
+
18
+ def build_daily_graph
19
+ g = Gruff::Line.new(500)
20
+ g.title = @title
21
+ g.labels = Hash[*(1..7).map{|x| [x-1, (DateTime.now - (8-x)).strftime("%-m/%-d")] }.flatten]
22
+ g
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module Reparty
2
+ VERSION = "0.1.0"
3
+ end
data/lib/reparty.rb ADDED
@@ -0,0 +1,28 @@
1
+ require "reparty/version"
2
+
3
+ require "reparty/config"
4
+ require "reparty/report"
5
+ require "reparty/report/active_record"
6
+ require "reparty/email"
7
+
8
+ require "reparty/engine"
9
+ require "reparty/railties"
10
+
11
+ module Reparty
12
+ class << self
13
+ def root
14
+ Pathname.new(File.expand_path('../..', __FILE__))
15
+ end
16
+
17
+ attr_accessor :configuration
18
+ attr_reader :reports
19
+
20
+ def config
21
+ self.configuration = Config.new
22
+
23
+ yield(configuration)
24
+
25
+ @reports = self.configuration.reports
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ namespace :reparty do
2
+ desc 'Generate the email to be sent'
3
+ task :email, [:address] => :environment do |t,args|
4
+ unless args.address
5
+ puts "Error: An address is required."
6
+ next
7
+ end
8
+
9
+ ReportMailer.daily(args.address).deliver
10
+ end
11
+ end
data/reparty.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'reparty/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "reparty"
8
+ spec.version = Reparty::VERSION
9
+ spec.authors = ["Tim Dorr"]
10
+ spec.email = ["reparty@timdorr.com"]
11
+ spec.description = %q{Stupid easy business analytics}
12
+ spec.summary = %q{Stupid easy business analytics}
13
+ spec.homepage = "https://github.com/timdorr/reparty"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "railties", "~> 3.2"
22
+ spec.add_dependency "actionmailer", "~> 3.2"
23
+ spec.add_dependency "activerecord", "~> 3.2"
24
+ spec.add_dependency "rmagick"
25
+ spec.add_dependency "gruff"
26
+ spec.add_dependency "roadie"
27
+
28
+ spec.add_development_dependency "bundler", "~> 1.3"
29
+ spec.add_development_dependency "rake"
30
+ spec.add_development_dependency "rspec"
31
+ spec.add_development_dependency "sqlite3"
32
+ spec.add_development_dependency "letter_opener"
33
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reparty do
4
+ it 'should have a version number' do
5
+ Reparty::VERSION.should_not be_nil
6
+ end
7
+
8
+ it 'configures properly' do
9
+ Reparty.config do |config|
10
+ config.sender = 'test@test.com'
11
+ end
12
+ Reparty.configuration.sender.should == 'test@test.com'
13
+ end
14
+
15
+ it 'adds reports' do
16
+ Reparty.config do |config|
17
+ config.add_report Reparty::Report, "Some Report"
18
+ end
19
+ Reparty.reports.first.should be_kind_of(Reparty::Report)
20
+ Reparty.reports.first.title.should == "Some Report"
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "Reparty::Report::ActiveRecord" do
4
+ before(:each) do
5
+ User.delete_all
6
+ end
7
+
8
+ it 'configures cleanly' do
9
+ Reparty.config do |config|
10
+ config.add_report Reparty::Report::ActiveRecord, "Users", :user, :count, field: :updated_at
11
+ end
12
+ Reparty.reports.last.should be_kind_of(Reparty::Report::ActiveRecord)
13
+ Reparty.reports.last.field.should == :updated_at
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Reparty::Report do
4
+ it "requires a title" do
5
+ expect {
6
+ Reparty::Report.new("title!")
7
+ }.to_not raise_exception
8
+
9
+ expect {
10
+ Reparty::Report.new(nil)
11
+ }.to raise_exception
12
+
13
+ expect {
14
+ Reparty::Report.new("")
15
+ }.to raise_exception
16
+ end
17
+
18
+ it "has an attach method" do
19
+ expect {
20
+ Reparty::Report.new("title!").attach(nil)
21
+ }.to_not raise_exception
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'reparty'
3
+
4
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
5
+
6
+ require 'action_mailer'
7
+ ActionMailer::Base.delivery_method = :test
8
+
9
+ require 'sqlite3'
10
+ require 'active_record'
11
+
12
+ ActiveRecord::Base.default_timezone = :utc
13
+ ActiveRecord::Base.time_zone_aware_attributes = true
14
+
15
+ class User < ActiveRecord::Base
16
+ end
17
+
18
+ ActiveRecord::Base.establish_connection(
19
+ :adapter => 'sqlite3',
20
+ :database => 'test.db'
21
+ )
22
+
23
+ unless ActiveRecord::Base.connection.table_exists? "users"
24
+ ActiveRecord::Migration.create_table :users do |t|
25
+ t.string :name
26
+ t.integer :score
27
+ t.timestamps
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ require "rake"
2
+
3
+ shared_context "rake" do
4
+ let(:rake) { Rake::Application.new }
5
+ let(:task_name) { self.class.top_level_description }
6
+ let(:task_path) { "lib/tasks/#{task_name.split(":").first}" }
7
+ subject { rake[task_name] }
8
+
9
+ def exclude_current_task
10
+ $".reject {|file| file == Reparty.root.join("#{task_path}.rake").to_s }
11
+ end
12
+
13
+ before do
14
+ Rake.application = rake
15
+ Rake.application.rake_require(task_path, [Reparty.root], exclude_current_task)
16
+ Rake::Task.define_task(:environment)
17
+ end
18
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../spec_helper'
2
+ require 'action_mailer'
3
+ require_relative '../../app/mailers/report_mailer'
4
+
5
+ describe "reparty:email" do
6
+ include_context "rake"
7
+
8
+ before(:each) do
9
+ User.delete_all
10
+
11
+ Reparty.config do |config|
12
+ config.add_report Reparty::Report::ActiveRecord, "New User Signups", :user
13
+ end
14
+ end
15
+
16
+ its(:prerequisites) { should include("environment") }
17
+
18
+ it "requires an address" do
19
+ STDOUT.should_receive(:puts)
20
+ subject.invoke
21
+ end
22
+
23
+ it "should generate an email" do
24
+ expect{
25
+ subject.invoke("test@test.com")
26
+ }.to change(ActionMailer::Base, :deliveries)
27
+ end
28
+
29
+ it "should send out via letter_opener", letteropener: true do
30
+ require 'letter_opener'
31
+ ActionMailer::Base.add_delivery_method :letter_opener, LetterOpener::DeliveryMethod, :location => File.expand_path('../../../tmp/letter_opener', __FILE__)
32
+ ActionMailer::Base.delivery_method = :letter_opener
33
+
34
+ [
35
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 2},
36
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 2},
37
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 4},
38
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 5},
39
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 6},
40
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 7},
41
+ {:name => "Someone", :score => 1, :created_at => DateTime.now - 8},
42
+ ].each{|u| User.create!(u) }
43
+
44
+ subject.invoke("test@test.com")
45
+ end
46
+ end
metadata ADDED
@@ -0,0 +1,263 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reparty
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Tim Dorr
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ type: :runtime
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.2'
22
+ none: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '3.2'
28
+ none: false
29
+ prerelease: false
30
+ - !ruby/object:Gem::Dependency
31
+ name: actionmailer
32
+ type: :runtime
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.2'
38
+ none: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '3.2'
44
+ none: false
45
+ prerelease: false
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ type: :runtime
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.2'
54
+ none: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ version: '3.2'
60
+ none: false
61
+ prerelease: false
62
+ - !ruby/object:Gem::Dependency
63
+ name: rmagick
64
+ type: :runtime
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ none: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ none: false
77
+ prerelease: false
78
+ - !ruby/object:Gem::Dependency
79
+ name: gruff
80
+ type: :runtime
81
+ requirement: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ none: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ none: false
93
+ prerelease: false
94
+ - !ruby/object:Gem::Dependency
95
+ name: roadie
96
+ type: :runtime
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ none: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ none: false
109
+ prerelease: false
110
+ - !ruby/object:Gem::Dependency
111
+ name: bundler
112
+ type: :development
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ none: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ version: '1.3'
124
+ none: false
125
+ prerelease: false
126
+ - !ruby/object:Gem::Dependency
127
+ name: rake
128
+ type: :development
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ none: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ! '>='
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ none: false
141
+ prerelease: false
142
+ - !ruby/object:Gem::Dependency
143
+ name: rspec
144
+ type: :development
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ none: false
151
+ version_requirements: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ none: false
157
+ prerelease: false
158
+ - !ruby/object:Gem::Dependency
159
+ name: sqlite3
160
+ type: :development
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ none: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ none: false
173
+ prerelease: false
174
+ - !ruby/object:Gem::Dependency
175
+ name: letter_opener
176
+ type: :development
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ none: false
183
+ version_requirements: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ none: false
189
+ prerelease: false
190
+ description: Stupid easy business analytics
191
+ email:
192
+ - reparty@timdorr.com
193
+ executables: []
194
+ extensions: []
195
+ extra_rdoc_files: []
196
+ files:
197
+ - .gitignore
198
+ - .rspec
199
+ - .rvmrc
200
+ - .travis.yml
201
+ - Gemfile
202
+ - History.md
203
+ - LICENSE.txt
204
+ - README.md
205
+ - Rakefile
206
+ - app/assets/images/spacer.gif
207
+ - app/mailers/report_mailer.rb
208
+ - app/views/report_mailer/_active_record.html.erb
209
+ - app/views/report_mailer/daily.html.erb
210
+ - lib/reparty.rb
211
+ - lib/reparty/config.rb
212
+ - lib/reparty/email.rb
213
+ - lib/reparty/engine.rb
214
+ - lib/reparty/railties.rb
215
+ - lib/reparty/report.rb
216
+ - lib/reparty/report/active_record.rb
217
+ - lib/reparty/version.rb
218
+ - lib/tasks/reparty.rake
219
+ - reparty.gemspec
220
+ - spec/reparty_spec.rb
221
+ - spec/report/active_record_spec.rb
222
+ - spec/report_spec.rb
223
+ - spec/spec_helper.rb
224
+ - spec/support/shared_contexts/rake.rb
225
+ - spec/tasks/reparty_task_spec.rb
226
+ homepage: https://github.com/timdorr/reparty
227
+ licenses:
228
+ - MIT
229
+ post_install_message:
230
+ rdoc_options: []
231
+ require_paths:
232
+ - lib
233
+ required_ruby_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ segments:
238
+ - 0
239
+ hash: 3863277872832140931
240
+ version: '0'
241
+ none: false
242
+ required_rubygems_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ! '>='
245
+ - !ruby/object:Gem::Version
246
+ segments:
247
+ - 0
248
+ hash: 3863277872832140931
249
+ version: '0'
250
+ none: false
251
+ requirements: []
252
+ rubyforge_project:
253
+ rubygems_version: 1.8.25
254
+ signing_key:
255
+ specification_version: 3
256
+ summary: Stupid easy business analytics
257
+ test_files:
258
+ - spec/reparty_spec.rb
259
+ - spec/report/active_record_spec.rb
260
+ - spec/report_spec.rb
261
+ - spec/spec_helper.rb
262
+ - spec/support/shared_contexts/rake.rb
263
+ - spec/tasks/reparty_task_spec.rb