punchcard 0.2.5 → 0.2.6

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 CHANGED
@@ -16,6 +16,9 @@ tmtags
16
16
  ## VIM
17
17
  *.swp
18
18
 
19
+ ## IDEA/Rubymine
20
+ .idea
21
+
19
22
  ## PROJECT::GENERAL
20
23
  coverage
21
24
  rdoc
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- punchcard (0.2.4)
4
+ punchcard (0.2.5)
5
5
  activerecord (~> 3.0.0)
6
6
  bson_ext
7
7
  gravtastic
@@ -27,13 +27,22 @@ GEM
27
27
  builder (2.1.2)
28
28
  ffi (1.0.1)
29
29
  rake (>= 0.8.7)
30
+ gemcutter (0.6.1)
31
+ git (1.2.5)
30
32
  gravtastic (3.1.0)
31
33
  haml (3.0.24)
32
34
  i18n (0.5.0)
35
+ jeweler (1.4.0)
36
+ gemcutter (>= 0.1.0)
37
+ git (>= 1.2.5)
38
+ rubyforge (>= 2.0.0)
39
+ json_pure (1.4.6)
33
40
  rack (1.2.1)
34
41
  rack-test (0.5.6)
35
42
  rack (>= 1.0)
36
43
  rake (0.8.7)
44
+ rubyforge (2.0.4)
45
+ json_pure (>= 1.1.7)
37
46
  sass (3.1.0.alpha.200)
38
47
  shoulda (2.10.3)
39
48
  sinatra (1.1.0)
@@ -53,6 +62,7 @@ DEPENDENCIES
53
62
  bson_ext
54
63
  gravtastic
55
64
  haml (>= 3.0.24)
65
+ jeweler
56
66
  punchcard!
57
67
  rack-test (>= 0.5.6)
58
68
  sass (>= 3.0.0)
data/Rakefile CHANGED
@@ -20,6 +20,7 @@ begin
20
20
  gem.add_development_dependency "rack-test", ">= 0.5.6"
21
21
  gem.add_development_dependency 'sqlite3', '>= 0'
22
22
  gem.add_development_dependency 'timecop', '>= 0'
23
+ gem.add_development_dependency 'jeweler', '>= 0'
23
24
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
24
25
  end
25
26
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.5
1
+ 0.2.6
@@ -0,0 +1,12 @@
1
+ class AddMinutesToPunches < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :punches, :minutes, :integer, :default => 0
4
+ Punch.all.each do |p|
5
+ p.save!
6
+ end
7
+ end
8
+
9
+ def self.down
10
+ remove_column :punches, :minutes, :integer
11
+ end
12
+ end
data/lib/public/js/app.js CHANGED
@@ -2,7 +2,7 @@
2
2
  function update_status() {
3
3
  var in_office = [];
4
4
  $.getJSON('/status.json', function(json) {
5
- $.each(json, function(index, person) {
5
+ $.each(json.people, function(index, person) {
6
6
  update_person(person);
7
7
  });
8
8
  });
@@ -35,7 +35,7 @@ function update_title() {
35
35
  $(document).ready(function() {
36
36
  $( "#personTemplate" ).template( "personTemplate" );
37
37
 
38
- $('#people li').live('dblclick', function() {
38
+ $('#people li').live('click', function() {
39
39
  user_id = $(this).attr('id');
40
40
  $.post('/punch/' + user_id, function(data) {
41
41
  //$('.result').html(data);
@@ -18,7 +18,7 @@ class Person < ActiveRecord::Base
18
18
  if punch = pending?
19
19
  punch.punch_out!
20
20
  else
21
- if recently_finished = punches.finished.first and recently_finished.checked_out_at > 30.minutes.ago
21
+ if recently_finished = punches.finished.first and recently_finished.checked_out_at.utc > 30.minutes.ago.utc
22
22
  recently_finished.reopen!
23
23
  else
24
24
  punches.create!
@@ -7,7 +7,8 @@ class Punch < ActiveRecord::Base
7
7
  scope :finished, where("checked_in_at IS NOT NULL AND checked_out_at IS NOT NULL").order('checked_out_at DESC')
8
8
 
9
9
  before_validation do |p|
10
- p.checked_in_at ||= Time.now
10
+ p.checked_in_at ||= Time.now.utc
11
+ p.minutes = p.difference_in_minutes
11
12
  end
12
13
 
13
14
  validate do |p|
@@ -21,14 +22,25 @@ class Punch < ActiveRecord::Base
21
22
  end
22
23
  end
23
24
 
25
+ # Return database-saved minutes when already checked out, otherwise calculate based upon time now
26
+ def minutes
27
+ checked_out_at.present? ? self["minutes"] : difference_in_minutes
28
+ end
29
+
30
+ # Calculates the difference between checkin and checkout or time now when pending in minutes
31
+ def difference_in_minutes
32
+ base = checked_out_at.present? ? checked_out_at.utc : Time.now.utc
33
+ ((base - checked_in_at.utc) / 60).round
34
+ end
35
+
24
36
  # Punches this punch out when pending
25
37
  def punch_out!
26
38
  return false if checked_out_at.present?
27
39
  # Make sure no one stays the night...
28
- if self.checked_in_at.to_date < Date.today
29
- self.checked_out_at = self.checked_in_at.end_of_day
40
+ if self.checked_in_at.utc < Time.now.utc.beginning_of_day
41
+ self.checked_out_at = self.checked_in_at.utc.end_of_day
30
42
  else
31
- self.checked_out_at = Time.now
43
+ self.checked_out_at = Time.now.utc
32
44
  end
33
45
  save!
34
46
  self
data/lib/punchcard.rb CHANGED
@@ -30,7 +30,7 @@ class Punchcard < Sinatra::Base
30
30
  end
31
31
 
32
32
  get '/status.json' do
33
- Person.order('name ASC').map(&:payload).to_json
33
+ {:people => Person.order('name ASC').map(&:payload)}.to_json
34
34
  end
35
35
 
36
36
  post '/punch/:id' do
data/punchcard.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{punchcard}
8
- s.version = "0.2.5"
8
+ s.version = "0.2.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Christoph Olszowka"]
12
- s.date = %q{2010-12-09}
12
+ s.date = %q{2010-12-10}
13
13
  s.description = %q{Simple sinatra/activerecord based app for tracking time when people have been in the office}
14
14
  s.email = %q{christoph at olszowka de}
15
15
  s.extra_rdoc_files = [
@@ -25,9 +25,9 @@ Gem::Specification.new do |s|
25
25
  "README.rdoc",
26
26
  "Rakefile",
27
27
  "VERSION",
28
- "config.ru",
29
28
  "lib/db/migrate/01_create_people.rb",
30
29
  "lib/db/migrate/02_create_punches.rb",
30
+ "lib/db/migrate/03_add_minutes_to_punches.rb",
31
31
  "lib/public/cardbg.png",
32
32
  "lib/public/css/blueprint.css",
33
33
  "lib/public/js/app.js",
@@ -70,6 +70,7 @@ Gem::Specification.new do |s|
70
70
  s.add_development_dependency(%q<rack-test>, [">= 0.5.6"])
71
71
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
72
72
  s.add_development_dependency(%q<timecop>, [">= 0"])
73
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
73
74
  else
74
75
  s.add_dependency(%q<sinatra>, [">= 1.0.0"])
75
76
  s.add_dependency(%q<bson_ext>, [">= 0"])
@@ -81,6 +82,7 @@ Gem::Specification.new do |s|
81
82
  s.add_dependency(%q<rack-test>, [">= 0.5.6"])
82
83
  s.add_dependency(%q<sqlite3>, [">= 0"])
83
84
  s.add_dependency(%q<timecop>, [">= 0"])
85
+ s.add_dependency(%q<jeweler>, [">= 0"])
84
86
  end
85
87
  else
86
88
  s.add_dependency(%q<sinatra>, [">= 1.0.0"])
@@ -93,6 +95,7 @@ Gem::Specification.new do |s|
93
95
  s.add_dependency(%q<rack-test>, [">= 0.5.6"])
94
96
  s.add_dependency(%q<sqlite3>, [">= 0"])
95
97
  s.add_dependency(%q<timecop>, [">= 0"])
98
+ s.add_dependency(%q<jeweler>, [">= 0"])
96
99
  end
97
100
  end
98
101
 
@@ -25,9 +25,6 @@ class TestDatabase < Test::Unit::TestCase
25
25
  setup do
26
26
  Timecop.freeze(2.hours.ago) do
27
27
  assert @person.punch!.instance_of?(Punch), "Should have been able to get punched and have returned a Punch"
28
- punch = @person.pending?
29
- punch.checked_in_at = 2.hours.ago
30
- punch.save!
31
28
  end
32
29
  end
33
30
 
@@ -43,6 +40,10 @@ class TestDatabase < Test::Unit::TestCase
43
40
  end
44
41
  end
45
42
 
43
+ should "return an appropriate (virtual) amount of minutes while pending" do
44
+ assert_equal 120, @person.punches.first.minutes
45
+ end
46
+
46
47
  context "and checked out 25 minutes ago" do
47
48
  setup do
48
49
  Timecop.freeze(25.minutes.ago) do
@@ -54,6 +55,10 @@ class TestDatabase < Test::Unit::TestCase
54
55
  assert @person.punches.first.checked_out_at < 24.minutes.ago and @person.punches.first.checked_out_at > 26.minutes.ago
55
56
  end
56
57
 
58
+ should "have set the proper amount of minutes" do
59
+ assert_equal 95, @person.punches.first.minutes
60
+ end
61
+
57
62
  should "not be pending" do
58
63
  assert_nil @person.pending?
59
64
  end
@@ -123,10 +128,9 @@ class TestDatabase < Test::Unit::TestCase
123
128
 
124
129
  context "that punched in yesterday" do
125
130
  setup do
126
- @person.punch!
127
- punch = @person.pending?
128
- punch.checked_in_at = 1.day.ago
129
- punch.save!
131
+ Timecop.freeze(1.day.ago) do
132
+ @person.punch!
133
+ end
130
134
  end
131
135
 
132
136
  context "and punches out today" do
@@ -136,7 +140,7 @@ class TestDatabase < Test::Unit::TestCase
136
140
 
137
141
  should "result in the punch out getting moved to the end of yesterday" do
138
142
  checkout_time = @person.punches.finished.first.checked_out_at
139
- assert_equal 1.day.ago.end_of_day.to_date, checkout_time.to_date
143
+ assert_equal 1.day.ago.end_of_day.utc.to_date, checkout_time.utc.to_date
140
144
  assert_equal 23, checkout_time.hour
141
145
  assert_equal 59, checkout_time.min
142
146
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 5
9
- version: 0.2.5
8
+ - 6
9
+ version: 0.2.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Christoph Olszowka
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-09 00:00:00 +01:00
17
+ date: 2010-12-10 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -159,6 +159,19 @@ dependencies:
159
159
  version: "0"
160
160
  type: :development
161
161
  version_requirements: *id010
162
+ - !ruby/object:Gem::Dependency
163
+ name: jeweler
164
+ prerelease: false
165
+ requirement: &id011 !ruby/object:Gem::Requirement
166
+ none: false
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ segments:
171
+ - 0
172
+ version: "0"
173
+ type: :development
174
+ version_requirements: *id011
162
175
  description: Simple sinatra/activerecord based app for tracking time when people have been in the office
163
176
  email: christoph at olszowka de
164
177
  executables: []
@@ -177,9 +190,9 @@ files:
177
190
  - README.rdoc
178
191
  - Rakefile
179
192
  - VERSION
180
- - config.ru
181
193
  - lib/db/migrate/01_create_people.rb
182
194
  - lib/db/migrate/02_create_punches.rb
195
+ - lib/db/migrate/03_add_minutes_to_punches.rb
183
196
  - lib/public/cardbg.png
184
197
  - lib/public/css/blueprint.css
185
198
  - lib/public/js/app.js
data/config.ru DELETED
@@ -1,11 +0,0 @@
1
- # Example config.ru for running from direct git clone
2
- # See README to see how to launch from gem
3
- require './lib/punchcard'
4
-
5
- Punchcard.set :mongo_db, 'punchcard'
6
-
7
- Punchcard.use Rack::Auth::Basic do |username, password|
8
- [username, password] == ['admin', 'admin']
9
- end
10
-
11
- run Punchcard