octokit 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/.travis.yml +1 -0
  2. data/CHANGELOG.md +18 -18
  3. data/README.md +5 -3
  4. data/Rakefile +2 -0
  5. data/lib/faraday/response/{raise_error.rb → raise_octokit_error.rb} +11 -2
  6. data/lib/octokit.rb +18 -46
  7. data/lib/octokit/authentication.rb +21 -0
  8. data/lib/octokit/client.rb +13 -6
  9. data/lib/octokit/client/commits.rb +2 -2
  10. data/lib/octokit/client/issues.rb +184 -21
  11. data/lib/octokit/client/milestones.rb +87 -0
  12. data/lib/octokit/client/network.rb +2 -4
  13. data/lib/octokit/client/objects.rb +6 -8
  14. data/lib/octokit/client/organizations.rb +18 -19
  15. data/lib/octokit/client/pub_sub_hubbub.rb +41 -0
  16. data/lib/octokit/client/pub_sub_hubbub/service_hooks.rb +41 -0
  17. data/lib/octokit/client/pulls.rb +12 -3
  18. data/lib/octokit/client/repositories.rb +28 -30
  19. data/lib/octokit/client/timelines.rb +3 -5
  20. data/lib/octokit/client/users.rb +40 -18
  21. data/lib/octokit/connection.rb +42 -0
  22. data/lib/octokit/error.rb +34 -0
  23. data/lib/octokit/request.rb +44 -0
  24. data/lib/octokit/version.rb +1 -1
  25. data/octokit.gemspec +33 -28
  26. data/puppeteer.jpg +0 -0
  27. data/spec/faraday/response_spec.rb +2 -1
  28. data/spec/fixtures/v2/commit.json +1 -1
  29. data/spec/fixtures/v3/comment.json +14 -0
  30. data/spec/fixtures/v3/comments.json +44 -0
  31. data/spec/fixtures/v3/label.json +5 -0
  32. data/spec/fixtures/v3/labels.json +17 -0
  33. data/spec/fixtures/v3/milestone.json +12 -0
  34. data/spec/fixtures/v3/milestones.json +28 -0
  35. data/spec/fixtures/v3/not_found.json +3 -0
  36. data/spec/fixtures/v3/user.json +20 -0
  37. data/spec/helper.rb +14 -11
  38. data/spec/octokit/client/commits_spec.rb +3 -3
  39. data/spec/octokit/client/issues_spec.rb +82 -44
  40. data/spec/octokit/client/milestones_spec.rb +67 -0
  41. data/spec/octokit/client/objects_spec.rb +6 -6
  42. data/spec/octokit/client/organizations_spec.rb +19 -19
  43. data/spec/octokit/client/pub_sub_hubbub/service_hooks_spec.rb +45 -0
  44. data/spec/octokit/client/pub_sub_hubbub_spec.rb +49 -0
  45. data/spec/octokit/client/pulls_spec.rb +15 -3
  46. data/spec/octokit/client/repositories_spec.rb +30 -30
  47. data/spec/octokit/client/users_spec.rb +26 -26
  48. data/spec/octokit/client_spec.rb +2 -2
  49. data/spec/octokit_spec.rb +12 -3
  50. metadata +147 -55
  51. data/lib/octokit/client/authentication.rb +0 -23
  52. data/lib/octokit/client/connection.rb +0 -33
  53. data/lib/octokit/client/request.rb +0 -42
@@ -1,22 +1,20 @@
1
1
  module Octokit
2
2
  class Client
3
3
  module Timelines
4
-
5
4
  def timeline(options={})
6
- path = "timeline.json"
5
+ path = "/timeline.json"
7
6
  get(path, options, 2, false)
8
7
  end
9
8
 
10
9
  def user_timeline(username=login, options={})
11
10
  if token
12
- path = "#{username}.private.json"
11
+ path = "/#{username}.private.json"
13
12
  options[:token] = token
14
13
  else
15
- path = "#{username}.json"
14
+ path = "/#{username}.json"
16
15
  end
17
16
  get(path, options, 2, false)
18
17
  end
19
-
20
18
  end
21
19
  end
22
20
  end
@@ -2,29 +2,51 @@ module Octokit
2
2
  class Client
3
3
  module Users
4
4
  EMAIL_RE = /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/
5
-
6
5
  def search_users(search, options={})
7
6
  if search.match(EMAIL_RE)
8
- get("api/v2/json/user/email/#{search}", options)['user']
7
+ get("/api/v2/json/user/email/#{search}", options)['user']
9
8
  else
10
- get("api/v2/json/user/search/#{search}", options)['users']
9
+ get("/api/v2/json/user/search/#{search}", options)['users']
11
10
  end
12
11
  end
13
12
 
14
- def user(username=nil, options={})
15
- get(["api/v2/json/user/show", username].compact.join('/'), options)['user']
13
+ # Get a single user
14
+ #
15
+ # @param user [String] A GitHub user name.
16
+ # @return [Hashie::Mash]
17
+ # @example
18
+ # Octokit.user("sferik")
19
+ def user(user=nil)
20
+ if user
21
+ get("/users/#{user}", {}, 3)
22
+ else
23
+ get("/user", {}, 3)
24
+ end
16
25
  end
17
26
 
18
- def update_user(values, options={})
19
- post("api/v2/json/user/show/#{login}", options.merge({:values => values}))['user']
27
+ # Update the authenticated user
28
+ #
29
+ # @param options [Hash] A customizable set of options.
30
+ # @option options [String] :name
31
+ # @option options [String] :email Publically visible email address.
32
+ # @option options [String] :blog
33
+ # @option options [String] :company
34
+ # @option options [String] :location
35
+ # @option options [Boolean] :hireable
36
+ # @option options [String] :bio
37
+ # @return [Hashie::Mash]
38
+ # @example
39
+ # Octokit.user(:name => "Erik Michaels-Ober", :email => "sferik@gmail.com", :company => "Code for America", :location => "San Francisco", :hireable => false)
40
+ def update_user(options)
41
+ patch("/user", options, 3)
20
42
  end
21
43
 
22
44
  def followers(user=login, options={})
23
- get("api/v2/json/user/show/#{user}/followers", options)['users']
45
+ get("/api/v2/json/user/show/#{user}/followers", options)['users']
24
46
  end
25
47
 
26
48
  def following(user=login, options={})
27
- get("api/v2/json/user/show/#{user}/following", options)['users']
49
+ get("/api/v2/json/user/show/#{user}/following", options)['users']
28
50
  end
29
51
 
30
52
  def follows?(*args)
@@ -36,39 +58,39 @@ module Octokit
36
58
  end
37
59
 
38
60
  def follow(user, options={})
39
- post("api/v2/json/user/follow/#{user}", options)['users']
61
+ post("/api/v2/json/user/follow/#{user}", options)['users']
40
62
  end
41
63
 
42
64
  def unfollow(user, options={})
43
- post("api/v2/json/user/unfollow/#{user}", options)['users']
65
+ post("/api/v2/json/user/unfollow/#{user}", options)['users']
44
66
  end
45
67
 
46
68
  def watched(user=login, options={})
47
- get("api/v2/json/repos/watched/#{user}", options)['repositories']
69
+ get("/api/v2/json/repos/watched/#{user}", options)['repositories']
48
70
  end
49
71
 
50
72
  def keys(options={})
51
- get("api/v2/json/user/keys", options)['public_keys']
73
+ get("/api/v2/json/user/keys", options)['public_keys']
52
74
  end
53
75
 
54
76
  def add_key(title, key, options={})
55
- post("api/v2/json/user/key/add", options.merge({:title => title, :key => key}))['public_keys']
77
+ post("/api/v2/json/user/key/add", options.merge({:title => title, :key => key}))['public_keys']
56
78
  end
57
79
 
58
80
  def remove_key(id, options={})
59
- post("api/v2/json/user/key/remove", options.merge({:id => id}))['public_keys']
81
+ post("/api/v2/json/user/key/remove", options.merge({:id => id}))['public_keys']
60
82
  end
61
83
 
62
84
  def emails(options={})
63
- get("api/v2/json/user/emails", options)['emails']
85
+ get("/api/v2/json/user/emails", options)['emails']
64
86
  end
65
87
 
66
88
  def add_email(email, options={})
67
- post("api/v2/json/user/email/add", options.merge({:email => email}))['emails']
89
+ post("/api/v2/json/user/email/add", options.merge({:email => email}))['emails']
68
90
  end
69
91
 
70
92
  def remove_email(email, options={})
71
- post("api/v2/json/user/email/remove", options.merge({:email => email}))['emails']
93
+ post("/api/v2/json/user/email/remove", options.merge({:email => email}))['emails']
72
94
  end
73
95
  end
74
96
  end
@@ -0,0 +1,42 @@
1
+ require 'faraday_middleware'
2
+ require 'faraday/response/raise_octokit_error'
3
+
4
+ module Octokit
5
+ # @private
6
+ module Connection
7
+ private
8
+
9
+ def connection(authenticate=true, raw=false, version=2, force_urlencoded=false)
10
+ case version
11
+ when 2
12
+ url = "https://github.com"
13
+ when 3
14
+ url = "https://api.github.com"
15
+ end
16
+
17
+ options = {
18
+ :proxy => proxy,
19
+ :ssl => { :verify => false },
20
+ :url => url,
21
+ }
22
+
23
+ options.merge!(:params => {:access_token => oauth_token}) if oauthed? && !authenticated?
24
+
25
+ connection = Faraday.new(options) do |builder|
26
+ if version >= 3 && !force_urlencoded
27
+ builder.use Faraday::Request::JSON
28
+ else
29
+ builder.use Faraday::Request::UrlEncoded
30
+ end
31
+ builder.use Faraday::Response::RaiseOctokitError
32
+ unless raw
33
+ builder.use Faraday::Response::Mashify
34
+ builder.use Faraday::Response::ParseJson
35
+ end
36
+ builder.adapter(adapter)
37
+ end
38
+ connection.basic_auth authentication[:login], authentication[:password] if authenticate and authenticated?
39
+ connection
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module Octokit
2
+ # Custom error class for rescuing from all GitHub errors
3
+ class Error < StandardError; end
4
+
5
+ # Raised when GitHub returns a 400 HTTP status code
6
+ class BadRequest < Error; end
7
+
8
+ # Raised when GitHub returns a 401 HTTP status code
9
+ class Unauthorized < Error; end
10
+
11
+ # Raised when GitHub returns a 403 HTTP status code
12
+ class Forbidden < Error; end
13
+
14
+ # Raised when GitHub returns a 404 HTTP status code
15
+ class NotFound < Error; end
16
+
17
+ # Raised when GitHub returns a 406 HTTP status code
18
+ class NotAcceptable < Error; end
19
+
20
+ # Raised when GitHub returns a 422 HTTP status code
21
+ class UnprocessableEntity < Error; end
22
+
23
+ # Raised when GitHub returns a 500 HTTP status code
24
+ class InternalServerError < Error; end
25
+
26
+ # Raised when GitHub returns a 501 HTTP status code
27
+ class NotImplemented < Error; end
28
+
29
+ # Raised when GitHub returns a 502 HTTP status code
30
+ class BadGateway < Error; end
31
+
32
+ # Raised when GitHub returns a 503 HTTP status code
33
+ class ServiceUnavailable < Error; end
34
+ end
@@ -0,0 +1,44 @@
1
+ require 'multi_json'
2
+
3
+ module Octokit
4
+ module Request
5
+ def delete(path, options={}, version=api_version, authenticate=true, raw=false, force_urlencoded=false)
6
+ request(:delete, path, options, version, authenticate, raw, force_urlencoded)
7
+ end
8
+
9
+ def get(path, options={}, version=api_version, authenticate=true, raw=false, force_urlencoded=false)
10
+ request(:get, path, options, version, authenticate, raw, force_urlencoded)
11
+ end
12
+
13
+ def patch(path, options={}, version=api_version, authenticate=true, raw=false, force_urlencoded=false)
14
+ request(:patch, path, options, version, authenticate, raw, force_urlencoded)
15
+ end
16
+
17
+ def post(path, options={}, version=api_version, authenticate=true, raw=false, force_urlencoded=false)
18
+ request(:post, path, options, version, authenticate, raw, force_urlencoded)
19
+ end
20
+
21
+ def put(path, options={}, version=api_version, authenticate=true, raw=false, force_urlencoded=false)
22
+ request(:put, path, options, version, authenticate, raw, force_urlencoded)
23
+ end
24
+
25
+ private
26
+
27
+ def request(method, path, options, version, authenticate, raw, force_urlencoded)
28
+ response = connection(authenticate, raw, version, force_urlencoded).send(method) do |request|
29
+ case method
30
+ when :delete, :get
31
+ request.url(path, options)
32
+ when :patch, :post, :put
33
+ request.path = path
34
+ if 3 == version && !force_urlencoded
35
+ request.body = MultiJson.encode(options) unless options.empty?
36
+ else
37
+ request.body = options unless options.empty?
38
+ end
39
+ end
40
+ end
41
+ raw ? response : response.body
42
+ end
43
+ end
44
+ end
@@ -1,3 +1,3 @@
1
1
  module Octokit
2
- VERSION = "0.6.3".freeze unless defined?(Octokit::VERSION)
2
+ VERSION = "0.6.4".freeze unless defined?(Octokit::VERSION)
3
3
  end
@@ -1,32 +1,37 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  require File.expand_path('../lib/octokit/version', __FILE__)
3
3
 
4
- Gem::Specification.new do |s|
5
- s.add_development_dependency 'json_pure', '~> 1.5'
6
- s.add_development_dependency 'nokogiri', '~> 1.4'
7
- s.add_development_dependency 'rake', '~> 0.8'
8
- s.add_development_dependency 'rspec', '~> 2.5'
9
- s.add_development_dependency 'simplecov', '~> 0.4'
10
- s.add_development_dependency 'yard', '~> 0.6'
11
- s.add_development_dependency 'webmock', '~> 1.6'
12
- s.add_development_dependency 'ZenTest', '~> 4.5'
13
- s.add_runtime_dependency 'addressable', '~> 2.2.4'
14
- s.add_runtime_dependency 'hashie', '~> 1.0.0'
15
- s.add_runtime_dependency 'faraday', '~> 0.6.0'
16
- s.add_runtime_dependency 'faraday_middleware', '~> 0.6.0'
17
- s.add_runtime_dependency 'multi_json', '~> 1.0.0'
18
- s.add_runtime_dependency 'rash', '~> 0.3.0'
19
- s.name = 'octokit'
20
- s.authors = ["Wynn Netherland", "Adam Stacoviak", "Erik Michaels-Ober"]
21
- s.description = %q{Simple wrapper for the GitHub API v2}
22
- s.email = ['wynn.netherland@gmail.com']
23
- s.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
24
- s.files = `git ls-files`.split("\n")
25
- s.homepage = 'http://wynnnetherland.com/projects/octokit/'
26
- s.require_paths = ['lib']
27
- s.summary = %q{Wrapper for the GitHub API}
28
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
29
- s.version = Octokit::VERSION.dup
30
- s.platform = Gem::Platform::RUBY
31
- s.required_rubygems_version = Gem::Requirement.new('>= 1.3.6') if s.respond_to? :required_rubygems_version=
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'octokit'
6
+ gem.summary = %q{Wrapper for the GitHub API}
7
+ gem.description = %q{Simple wrapper for the GitHub API v2}
8
+ gem.homepage = 'https://github.com/pengwynn/octokit'
9
+ gem.authors = ["Wynn Netherland", "Adam Stacoviak", "Erik Michaels-Ober"]
10
+ gem.email = ['wynn.netherland@gmail.com', 'adam@stacoviak.com', 'sferik@gmail.com']
11
+
12
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
13
+ gem.files = `git ls-files`.split("\n")
14
+
15
+ gem.platform = Gem::Platform::RUBY
16
+ gem.require_paths = ['lib']
17
+ gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
18
+
19
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+
21
+ gem.version = Octokit::VERSION.dup
22
+
23
+ gem.add_runtime_dependency 'addressable', '~> 2.2.6'
24
+ gem.add_runtime_dependency 'faraday', '~> 0.7.3'
25
+ gem.add_runtime_dependency 'faraday_middleware', '~> 0.7.0.rc1'
26
+ gem.add_runtime_dependency 'hashie', '~> 1.0.0'
27
+ gem.add_runtime_dependency 'multi_json', '~> 1.0.2'
28
+
29
+ gem.add_development_dependency 'ZenTest', '~> 4.5'
30
+ gem.add_development_dependency 'nokogiri', '~> 1.4'
31
+ gem.add_development_dependency 'rake', '~> 0.9'
32
+ gem.add_development_dependency 'rspec', '~> 2.6'
33
+ gem.add_development_dependency 'simplecov', '~> 0.4'
34
+ gem.add_development_dependency 'webmock', '~> 1.6'
35
+ gem.add_development_dependency 'yajl-ruby', '~> 0.8'
36
+ gem.add_development_dependency 'yard', '~> 0.7'
32
37
  end
Binary file
@@ -12,6 +12,7 @@ describe Faraday::Response do
12
12
  403 => Octokit::Forbidden,
13
13
  404 => Octokit::NotFound,
14
14
  406 => Octokit::NotAcceptable,
15
+ 422 => Octokit::UnprocessableEntity,
15
16
  500 => Octokit::InternalServerError,
16
17
  501 => Octokit::NotImplemented,
17
18
  502 => Octokit::BadGateway,
@@ -20,7 +21,7 @@ describe Faraday::Response do
20
21
  context "when HTTP status is #{status}" do
21
22
 
22
23
  before do
23
- stub_get('user/show/sferik').
24
+ stub_get('https://api.github.com/users/sferik').
24
25
  to_return(:status => status)
25
26
  end
26
27
 
@@ -1 +1 @@
1
- {"commits":[{"parents":[{"id":"a865e72344359f766b3ab03d3075c65798719ddd"},{"id":"a0857d80960ad9ac543e1d2d38f23b04634f0109"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/3cdfabd973bc3caac209cba903cfdb3bf6636bcd","id":"3cdfabd973bc3caac209cba903cfdb3bf6636bcd","committed_date":"2011-01-21T11:23:58-08:00","authored_date":"2011-01-21T11:23:58-08:00","message":"Merge branch '3pp_history'","tree":"53b3d8ade2ae5721e10bcd643a83e6b01c06462c","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}},{"parents":[{"id":"a6785192b44afc7d2e5af0a622e9ed8a592ca392"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/a0857d80960ad9ac543e1d2d38f23b04634f0109","id":"a0857d80960ad9ac543e1d2d38f23b04634f0109","committed_date":"2011-01-21T11:21:17-08:00","authored_date":"2011-01-21T11:21:17-08:00","message":"fix a small bug in object history display: headers didn't match columns\n\nThe code didn't display the object ID header but it did display the\ndata so the headers didn't match the data. Added code to not display\nthe data so now the headers and data match.","tree":"1aa81bc05872d2d1d0d2cfd73ea269d29160d2ef","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}},{"parents":[{"id":"3fe5aeee217934f39112caa9d14483328e6f86c8"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/a6785192b44afc7d2e5af0a622e9ed8a592ca392","id":"a6785192b44afc7d2e5af0a622e9ed8a592ca392","committed_date":"2011-01-21T11:15:11-08:00","authored_date":"2011-01-21T11:15:11-08:00","message":"move abstract history code from the RailsAdmin module to a class\n\nAs suggested by kaapa and seconded by sferik.","tree":"4335484d615f949e635166ff7676b2593c138747","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}},{"parents":[{"id":"4a600e61db3cdc67a471ead5e71cc97c298fbb43"}],"author":{"name":"Lucas Simao","login":"lucassimao","email":"lsimaocosta@gmail.com"},"url":"/sferik/rails_admin/commit/a865e72344359f766b3ab03d3075c65798719ddd","id":"a865e72344359f766b3ab03d3075c65798719ddd","committed_date":"2011-01-21T08:04:03-08:00","authored_date":"2011-01-21T06:51:36-08:00","message":"list.select_action and list.delete_selected fields added in rails_admin.pt-BR.yml file","tree":"ba9125a2c3dbdc7d18f43062d7b416c541e87972","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"611fb66c11218b63990d0fbceb2bd4d9b9a71239"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/4a600e61db3cdc67a471ead5e71cc97c298fbb43","id":"4a600e61db3cdc67a471ead5e71cc97c298fbb43","committed_date":"2011-01-20T19:45:44-08:00","authored_date":"2011-01-20T19:44:30-08:00","message":"Partial fix for object binding with models that have associations to self.","tree":"f2ed7d05efc38e5542366a501b2368bce017ea68","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"42d40ee3ae6ec4b26ff781d089f9bfba909ca6f9"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/611fb66c11218b63990d0fbceb2bd4d9b9a71239","id":"611fb66c11218b63990d0fbceb2bd4d9b9a71239","committed_date":"2011-01-20T19:45:44-08:00","authored_date":"2011-01-20T19:41:57-08:00","message":"Fix belongs_to associations' child_key_lookup to use :foreign_key option if set\nor secondly use the Rails idiom of association_name_id instead of class_name_id","tree":"877e4f53fc9e2951e86307992a8560ff6534fa41","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"433e7114cc7f761db8a08f4ce1bb7f1fb56e2920"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/3fe5aeee217934f39112caa9d14483328e6f86c8","id":"3fe5aeee217934f39112caa9d14483328e6f86c8","committed_date":"2011-01-20T14:23:11-08:00","authored_date":"2011-01-20T14:22:23-08:00","message":"fix the dashboard history slider javascript\n\nIt had drifted away from the code over time so I had never seen it\nwork before. It's pretty nice.","tree":"3f870851f4a57172845915c668c443a2fbc2d13a","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"ec218eb7b5e4cccc1315bed761045571bb5ee2c0"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/433e7114cc7f761db8a08f4ce1bb7f1fb56e2920","id":"433e7114cc7f761db8a08f4ce1bb7f1fb56e2920","committed_date":"2011-01-20T14:23:11-08:00","authored_date":"2011-01-20T14:21:20-08:00","message":"on the dashboard, make empty and non-empty slider boxes the same structure\n\nThey were different enough that it confused the server-side JS.","tree":"8d1034733f39e3e8bd742c1785a9f5306e0a6929","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"fc09f63da396238d529db2bea8ebbebe8f67374e"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/ec218eb7b5e4cccc1315bed761045571bb5ee2c0","id":"ec218eb7b5e4cccc1315bed761045571bb5ee2c0","committed_date":"2011-01-20T14:23:11-08:00","authored_date":"2011-01-20T14:19:29-08:00","message":"make the BlankHistory's JSON form look like History's\n\nThey were different and this confused the client-side javascript.","tree":"80d7db018f28540529687f7c533adf82232a9691","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"24dec08a97d1e5e4d4183d60555371109ee69637"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/fc09f63da396238d529db2bea8ebbebe8f67374e","id":"fc09f63da396238d529db2bea8ebbebe8f67374e","committed_date":"2011-01-20T14:23:10-08:00","authored_date":"2011-01-20T14:17:51-08:00","message":"add a slider method to the history controller\n\nThis is based on code that used to be in the main controller. It's\nused to update the dashboard history slider when the user clicks on\nthe scroll gadgets at either end.","tree":"67c4cc55074b8f01ba7cff70dac831c1a048cd6b","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"1c2f2519318b7429e32cadc42916a0ecc4020a06"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/24dec08a97d1e5e4d4183d60555371109ee69637","id":"24dec08a97d1e5e4d4183d60555371109ee69637","committed_date":"2011-01-20T10:29:44-08:00","authored_date":"2011-01-20T10:29:44-08:00","message":"a little bit of code comments","tree":"2f0becab0a9590d96b4968e23b75d832e7beba7f","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"43607a947cdba3b0d07b427e975cfffe181d57d6"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/42d40ee3ae6ec4b26ff781d089f9bfba909ca6f9","id":"42d40ee3ae6ec4b26ff781d089f9bfba909ca6f9","committed_date":"2011-01-20T08:52:19-08:00","authored_date":"2011-01-20T08:52:19-08:00","message":"Revert \"Attempt to fix failed Postgres build\"\n\nThis reverts commit cd9db5a7d8d9ac4a0c3c9dbe8e95704b3f834dde.","tree":"07cd2771d9689ae919e1f573e1133b86e364b617","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"99431c1f9d263ac4ceb83faf62a4e29468a33a7b"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/1c2f2519318b7429e32cadc42916a0ecc4020a06","id":"1c2f2519318b7429e32cadc42916a0ecc4020a06","committed_date":"2011-01-20T07:51:07-08:00","authored_date":"2011-01-20T07:43:36-08:00","message":"refactor history_for_model to use AR's API methods instead of ad-hoc SQL","tree":"2df0352ff23bfe796334d8fcc7f3e3e76f7e605e","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"34ed37426de4ced6a3f06544d735c10d6ba42cd8"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/99431c1f9d263ac4ceb83faf62a4e29468a33a7b","id":"99431c1f9d263ac4ceb83faf62a4e29468a33a7b","committed_date":"2011-01-19T21:25:55-08:00","authored_date":"2011-01-19T21:25:55-08:00","message":"refactor history_for_object to use AR's API methods instead of ad-hoc SQL","tree":"df68287c5426d61917e5bec19f5086c10a3264dd","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}},{"parents":[{"id":"7f15d0efca07f0c17059240c87fe3d4ec5c0caf5"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/34ed37426de4ced6a3f06544d735c10d6ba42cd8","id":"34ed37426de4ced6a3f06544d735c10d6ba42cd8","committed_date":"2011-01-19T14:04:52-08:00","authored_date":"2011-01-19T14:04:52-08:00","message":"removed History access from the view, added a shim for it in AbstractHistory\n\nWith this commit I believe that no rails_admin code interacts with the\nHistory model directly. This should allow us to use other history\ntracking mechanisms eventually, although I think we want to clean up\nthe AbstractHistory interface first.","tree":"b2e35592ea8270185c73636b2e23a23b233694cc","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"51cba4f3cdfb7e127ff0f827c4ec69670ef06495"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/7f15d0efca07f0c17059240c87fe3d4ec5c0caf5","id":"7f15d0efca07f0c17059240c87fe3d4ec5c0caf5","committed_date":"2011-01-19T13:30:09-08:00","authored_date":"2011-01-19T13:30:09-08:00","message":"interpose AbstractHistory between the controllers and the History model\n\nThis should make it easier to use a third-party audit/tracking gem\nsince we'll have a \"shim\" layer in between rails_admin and the history\nmechanism.","tree":"69184451a4b4032af02b477673c1325495267acd","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"dbf8ef0b36c0235f14f9685b47889b1feec10c55"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/51cba4f3cdfb7e127ff0f827c4ec69670ef06495","id":"51cba4f3cdfb7e127ff0f827c4ec69670ef06495","committed_date":"2011-01-19T12:17:01-08:00","authored_date":"2011-01-19T12:17:01-08:00","message":"move history code from the history controller to the abstract_history lib\n\nI think that much of this code can now be moved into the History model\nbut this checkin gets it out of the controller, at least.","tree":"2f6c47e730f5b730841532766595e0081c1e1d17","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"f847700e6e1bff996162f05d0b17a9692bc0459a"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/dbf8ef0b36c0235f14f9685b47889b1feec10c55","id":"dbf8ef0b36c0235f14f9685b47889b1feec10c55","committed_date":"2011-01-19T09:15:50-08:00","authored_date":"2011-01-19T09:11:39-08:00","message":"move history code from the main controller to the history controller","tree":"63e55788690cdcbc2940c15361ef27a4fbd49764","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"67b3dbf4366aa08aedbd1a4ccf8f9644512fe7e7"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/f847700e6e1bff996162f05d0b17a9692bc0459a","id":"f847700e6e1bff996162f05d0b17a9692bc0459a","committed_date":"2011-01-19T09:15:43-08:00","authored_date":"2011-01-19T08:25:40-08:00","message":"remove some main_controller history code that appears to be unused","tree":"2708b6d564b2b7a12aed364f3034c69073c0d190","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"fb067656036d899ded7791a90f2f64c0d86b6ebd"}],"author":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"},"url":"/sferik/rails_admin/commit/67b3dbf4366aa08aedbd1a4ccf8f9644512fe7e7","id":"67b3dbf4366aa08aedbd1a4ccf8f9644512fe7e7","committed_date":"2011-01-19T08:17:10-08:00","authored_date":"2011-01-19T08:17:10-08:00","message":"move some history-specific code out of main_controller, into a lib\n\nTrying to slim down the main controller and make the interfaces\nbetween it and the history code more explicit.","tree":"9502cb83c928dc576b9e3a04ada8a118626b6ab6","committer":{"name":"toby cabot","login":"ccabot","email":"ccabot@mitre.org"}},{"parents":[{"id":"43607a947cdba3b0d07b427e975cfffe181d57d6"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/fb067656036d899ded7791a90f2f64c0d86b6ebd","id":"fb067656036d899ded7791a90f2f64c0d86b6ebd","committed_date":"2011-01-18T19:30:51-08:00","authored_date":"2011-01-18T19:30:51-08:00","message":"simplify check_history so it only handles updates\n\nThe code path is easier to follow if check_history doesn't need to\nbranch on the action, and since create and delete are trivial cases\nit's easier to just handle them in the actions. Now check_history\n(renamed check_history_update) handles updates only.","tree":"3f02c8bd27a7615c014f2bbc46be6ef5d42b0dab","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}},{"parents":[{"id":"d07ec3f6e9e9f5336c8ef11888f6d437fa53158d"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/43607a947cdba3b0d07b427e975cfffe181d57d6","id":"43607a947cdba3b0d07b427e975cfffe181d57d6","committed_date":"2011-01-18T18:21:49-08:00","authored_date":"2011-01-18T18:21:49-08:00","message":"on list pages, use model name for page title\n\nMr. Fussy here, I like page titles to say where the user is, not what\nthey need to do.","tree":"20dafe662dc9928565edcb4dc38211ad724380f4","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}},{"parents":[{"id":"2e9a7a1552b78178054c2d782f9518936b44dfe8"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/d07ec3f6e9e9f5336c8ef11888f6d437fa53158d","id":"d07ec3f6e9e9f5336c8ef11888f6d437fa53158d","committed_date":"2011-01-18T15:04:01-08:00","authored_date":"2011-01-18T14:57:21-08:00","message":"Object bindings were not always automatically created as for some\nreason model_instance.kind_of?(abstract_model.model) did not always\nevaluate to the expected value of true, fixes #245","tree":"a3366aa97960dc47b684e8c92c908cff3b33b22f","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"cd9db5a7d8d9ac4a0c3c9dbe8e95704b3f834dde"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/2e9a7a1552b78178054c2d782f9518936b44dfe8","id":"2e9a7a1552b78178054c2d782f9518936b44dfe8","committed_date":"2011-01-18T15:04:01-08:00","authored_date":"2011-01-18T14:55:15-08:00","message":"Reapply d0eac6ec which was accidentally reverted by 5b196640","tree":"f69670c9c06c5749f047e273b7b4409155f38de2","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"7cc629366c2035c48b36e8258db1958d70d7bb1d"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/cd9db5a7d8d9ac4a0c3c9dbe8e95704b3f834dde","id":"cd9db5a7d8d9ac4a0c3c9dbe8e95704b3f834dde","committed_date":"2011-01-18T07:53:19-08:00","authored_date":"2011-01-18T07:53:19-08:00","message":"Attempt to fix failed Postgres build","tree":"4628d85ec6f5ba68b5e1472fafbaabe4829fff35","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"572d5f5183d0e9d4289131cad95ac542dea072fc"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/7cc629366c2035c48b36e8258db1958d70d7bb1d","id":"7cc629366c2035c48b36e8258db1958d70d7bb1d","committed_date":"2011-01-18T03:40:45-08:00","authored_date":"2011-01-18T03:40:45-08:00","message":"Remove Devise dependency from RailsAdmin.DEFAULT_CURRENT_USER by using\nWarden instead and allow fallback to current_user which is a strong idiom in\nRails authentication frameworks, fixes #209\n\nKudos to nando and josevalim for guidance with the implementation","tree":"e4857b65b2aea625c969dc5b479bf454ae79d815","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"0bd6b6eb5a7688e1ab95858fde3ebc75aa0a4d08"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/572d5f5183d0e9d4289131cad95ac542dea072fc","id":"572d5f5183d0e9d4289131cad95ac542dea072fc","committed_date":"2011-01-17T17:36:09-08:00","authored_date":"2011-01-17T17:35:17-08:00","message":"Update jdbc-postgres dependency for CI to 9.0","tree":"a8b9b9a56aeb01b18140f78cb4834cedfc008342","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"5b196640fc04a220e57adef17ae9066a541a6b4a"},{"id":"c8aaf29208f8496bd114e383a7e1b06a06fec134"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/0bd6b6eb5a7688e1ab95858fde3ebc75aa0a4d08","id":"0bd6b6eb5a7688e1ab95858fde3ebc75aa0a4d08","committed_date":"2011-01-17T17:34:42-08:00","authored_date":"2011-01-17T17:34:42-08:00","message":"Merge branch 'master' of github.com:sferik/rails_admin","tree":"6fa22fa8b2f31a30986ba14436b917bf3aa477e8","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"865ce70043a665e862681e99601da6c55f04e03a"},{"id":"f2f3bfddb36b20681c4274566779ac376035d3e0"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/5b196640fc04a220e57adef17ae9066a541a6b4a","id":"5b196640fc04a220e57adef17ae9066a541a6b4a","committed_date":"2011-01-17T17:29:52-08:00","authored_date":"2011-01-17T17:29:52-08:00","message":"Merge branch 'config-dsl-cleanup'\n\nConflicts:\n\tlib/rails_admin/config/sections/update.rb","tree":"86cf1a9f3ecac2f7ff354ae9a5d10c7a4dd5ee51","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"865ce70043a665e862681e99601da6c55f04e03a"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/c8aaf29208f8496bd114e383a7e1b06a06fec134","id":"c8aaf29208f8496bd114e383a7e1b06a06fec134","committed_date":"2011-01-17T16:57:19-08:00","authored_date":"2011-01-17T16:57:19-08:00","message":"Fix JS DatePickers' initializers' selectors, fixes #243","tree":"797442d0e611548e83d3fc44fe34bf5b9afedf4d","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"9da54620602edabccabca401bf83462a2e51c795"}],"author":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"},"url":"/sferik/rails_admin/commit/f2f3bfddb36b20681c4274566779ac376035d3e0","id":"f2f3bfddb36b20681c4274566779ac376035d3e0","committed_date":"2011-01-17T16:46:22-08:00","authored_date":"2011-01-17T16:46:22-08:00","message":"Lazy load config tree to avoid race conditions in initialization","tree":"deb90addaa928fd8603ad9c758efdb42ea4d9262","committer":{"name":"Petteri Kääpä","login":"kaapa","email":"petteri.kaapa@gmail.com"}},{"parents":[{"id":"735c6dec263567829057e087f22171cd4dddb3b4"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/865ce70043a665e862681e99601da6c55f04e03a","id":"865ce70043a665e862681e99601da6c55f04e03a","committed_date":"2011-01-17T16:13:27-08:00","authored_date":"2011-01-17T16:13:27-08:00","message":"Fix typo (thanks piotrj)\n\nhttps://github.com/sferik/rails_admin/commit/487d0ec845efe95b10d6336f3e9256ab48300230","tree":"b115b6903f0a7cdbfdb0b36d03439a4b8630bc63","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"2ea32467fe8818be1281e5109879c240925ac959"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/735c6dec263567829057e087f22171cd4dddb3b4","id":"735c6dec263567829057e087f22171cd4dddb3b4","committed_date":"2011-01-17T11:22:08-08:00","authored_date":"2011-01-17T11:22:08-08:00","message":"Revert \"Update activerecord-jdbc-adapter to 1.1.1\"\n\nThis reverts commit 2ea32467fe8818be1281e5109879c240925ac959.","tree":"ef5abcc9d8e774783b974e4a145b756f978f5b30","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"8ad0c79cb7b9b8e573ff61bdf0e812d60d68d6a2"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/2ea32467fe8818be1281e5109879c240925ac959","id":"2ea32467fe8818be1281e5109879c240925ac959","committed_date":"2011-01-17T09:58:18-08:00","authored_date":"2011-01-17T09:58:18-08:00","message":"Update activerecord-jdbc-adapter to 1.1.1","tree":"0eb2f6addea7001a1e17da8162b64a7e39d773c9","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}},{"parents":[{"id":"c2d5a83a4fb0d90285bc58fb25ed35f34039a4b0"}],"author":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"},"url":"/sferik/rails_admin/commit/8ad0c79cb7b9b8e573ff61bdf0e812d60d68d6a2","id":"8ad0c79cb7b9b8e573ff61bdf0e812d60d68d6a2","committed_date":"2011-01-16T13:47:48-08:00","authored_date":"2011-01-16T13:47:48-08:00","message":"Update sqlite3 dependency to 1.3.3","tree":"ef5abcc9d8e774783b974e4a145b756f978f5b30","committer":{"name":"Erik Michaels-Ober","login":"sferik","email":"sferik@gmail.com"}}]}
1
+ {"commit":{"modified":[{"diff":"--- a/app/controllers/rails_admin/application_controller.rb\n+++ b/app/controllers/rails_admin/application_controller.rb\n@@ -8,6 +8,24 @@ module RailsAdmin\n \n helper_method :_current_user\n \n+ def get_model\n+ model_name = to_model_name(params[:model_name])\n+ @abstract_model = RailsAdmin::AbstractModel.new(model_name)\n+ @model_config = RailsAdmin.config(@abstract_model)\n+ not_found if @model_config.excluded?\n+ @properties = @abstract_model.properties\n+ end\n+\n+ def to_model_name(param)\n+ param.split(\"::\").map{|x| x.singularize.camelize}.join(\"::\")\n+ end\n+\n+ def get_object\n+ @object = @abstract_model.get(params[:id])\n+ @model_config.bind(:object, @object)\n+ not_found unless @object\n+ end\n+\n private\n \n def _authenticate!","filename":"app/controllers/rails_admin/application_controller.rb"},{"diff":"--- a/app/controllers/rails_admin/history_controller.rb\n+++ b/app/controllers/rails_admin/history_controller.rb\n@@ -1,12 +1,46 @@\n module RailsAdmin\n class HistoryController < RailsAdmin::ApplicationController\n+ before_filter :get_model, :except => [:list, :slider]\n+ before_filter :get_object, :except => [:list, :slider, :for_model]\n+\n def list\n if params[:ref].nil? or params[:section].nil?\n not_found\n else\n- @history, @current_month = History.get_history_for_month(params[:ref], params[:section])\n+ @history, @current_month = AbstractHistory.history_for_month(params[:ref], params[:section])\n render :template => 'rails_admin/main/history', :layout => false\n end\n end\n+\n+ def slider\n+ ref = params[:ref].to_i\n+\n+ if ref.nil? or ref > 0\n+ not_found\n+ else\n+ render :json => AbstractHistory.history_summaries(ref)\n+ end\n+ end\n+\n+ def for_model\n+ @page_type = @abstract_model.pretty_name.downcase\n+ @page_name = t(\"admin.history.page_name\", :name => @model_config.list.label)\n+ @general = true\n+\n+ @page_count, @history = AbstractHistory.history_for_model @abstract_model, params[:query], params[:sort], params[:sort_reverse], params[:all], params[:page]\n+\n+ render \"show\", :layout => request.xhr? ? false : 'rails_admin/list'\n+ end\n+\n+ def for_object\n+ @page_type = @abstract_model.pretty_name.downcase\n+ @page_name = t(\"admin.history.page_name\", :name => @model_config.bind(:object, @object).list.object_label)\n+ @general = false\n+\n+ @history = AbstractHistory.history_for_object @abstract_model, @object, params[:query], params[:sort], params[:sort_reverse]\n+\n+ render \"show\", :layout => request.xhr? ? false : 'rails_admin/list'\n+ end\n+\n end\n end","filename":"app/controllers/rails_admin/history_controller.rb"},{"diff":"--- a/app/controllers/rails_admin/main_controller.rb\n+++ b/app/controllers/rails_admin/main_controller.rb\n@@ -1,6 +1,6 @@\n module RailsAdmin\n class MainController < RailsAdmin::ApplicationController\n- before_filter :get_model, :except => [:index, :history, :get_history]\n+ before_filter :get_model, :except => [:index]\n before_filter :get_object, :only => [:edit, :update, :delete, :destroy]\n before_filter :get_bulk_objects, :only => [:bulk_delete, :bulk_destroy]\n before_filter :get_attributes, :only => [:create, :update]\n@@ -10,18 +10,20 @@ module RailsAdmin\n @page_name = t(\"admin.dashboard.pagename\")\n @page_type = \"dashboard\"\n \n- @history = History.latest\n+ @history = AbstractHistory.history_latest_summaries\n # history listing with ref = 0 and section = 4\n- @historyListing, @current_month = History.get_history_for_month(0, 4)\n+ @historyListing, @current_month = AbstractHistory.history_for_month(0, 4)\n \n @abstract_models = RailsAdmin::AbstractModel.all\n \n+ @most_recent_changes = {}\n @count = {}\n @max = 0\n @abstract_models.each do |t|\n current_count = t.count\n @max = current_count > @max ? current_count : @max\n @count[t.pretty_name] = current_count\n+ @most_recent_changes[t.pretty_name] = AbstractHistory.most_recent_history(t.pretty_name).last.try(:updated_at)\n end\n \n render :layout => 'rails_admin/dashboard'\n@@ -53,6 +55,7 @@ module RailsAdmin\n @page_type = @abstract_model.pretty_name.downcase\n \n if @object.save && update_all_associations\n+ AbstractHistory.create_history_item(\"Created #{@model_config.bind(:object, @object).list.object_label}\", @object, @abstract_model, _current_user)\n redirect_to_on_success\n else\n render_error\n@@ -76,6 +79,7 @@ module RailsAdmin\n \n @object.send :attributes=, @attributes, false\n if @object.save && update_all_associations\n+ AbstractHistory.create_update_history @abstract_model, @object, @cached_assocations_hash, associations_hash, @modified_assoc, @old_object, _current_user\n redirect_to_on_success\n else\n render_error :edit\n@@ -93,11 +97,11 @@ module RailsAdmin\n @object = @object.destroy\n flash[:notice] = t(\"admin.delete.flash_confirmation\", :name => @model_config.list.label)\n \n- check_history\n+ AbstractHistory.create_history_item(\"Destroyed #{@model_config.bind(:object, @object).list.object_label}\", @object, @abstract_model, _current_user)\n \n redirect_to rails_admin_list_path(:model_name => @abstract_model.to_param)\n end\n- \n+\n def bulk_delete\n @page_name = t(\"admin.actions.delete\").capitalize + \" \" + @model_config.list.label.downcase\n @page_type = @abstract_model.pretty_name.downcase\n@@ -110,82 +114,12 @@ module RailsAdmin\n \n @destroyed_objects.each do |object|\n message = \"Destroyed #{@model_config.bind(:object, object).list.object_label}\"\n- create_history_item(message, object, @abstract_model)\n+ AbstractHistory.create_history_item(message, object, @abstract_model, _current_user)\n end\n \n redirect_to rails_admin_list_path(:model_name => @abstract_model.to_param)\n end\n \n- def history\n- ref = params[:ref].to_i\n-\n- if ref.nil? or ref > 0\n- not_found\n- else\n- current_diff = -5 * ref\n- start_month = (5 + current_diff).month.ago.month\n- start_year = (5 + current_diff).month.ago.year\n- stop_month = (current_diff).month.ago.month\n- stop_year = (current_diff).month.ago.year\n-\n- render :json => History.get_history_for_dates(start_month, stop_month, start_year, stop_year)\n- end\n- end\n-\n- def get_history\n- if params[:ref].nil? or params[:section].nil?\n- not_found\n- else\n- @history, @current_month = History.get_history_for_month(params[:ref], params[:section])\n- render :template => 'rails_admin/main/history'\n- end\n- end\n-\n- def show_history\n- @page_type = @abstract_model.pretty_name.downcase\n- @page_name = t(\"admin.history.page_name\", :name => @model_config.list.label)\n- @general = true\n-\n- options = {}\n- options[:order] = \"created_at DESC\"\n- options[:conditions] = []\n- options[:conditions] << conditions = \"#{History.connection.quote_column_name(:table)} = ?\"\n- options[:conditions] << @abstract_model.pretty_name\n-\n- if params[:id]\n- get_object\n- @page_name = t(\"admin.history.page_name\", :name => @model_config.bind(:object, @object).list.object_label)\n- options[:conditions][0] += \" and #{History.connection.quote_column_name(:item)} = ?\"\n- options[:conditions] << params[:id]\n- @general = false\n- end\n-\n- if params[:query]\n- options[:conditions][0] += \" and (#{History.connection.quote_column_name(:message)} LIKE ? or #{History.connection.quote_column_name(:username)} LIKE ?)\"\n- options[:conditions] << \"%#{params[\"query\"]}%\"\n- options[:conditions] << \"%#{params[\"query\"]}%\"\n- end\n-\n- if params[\"sort\"]\n- options.delete(:order)\n- if params[\"sort_reverse\"] == \"true\"\n- options[:order] = \"#{params[\"sort\"]} desc\"\n- else\n- options[:order] = params[\"sort\"]\n- end\n- end\n-\n- @history = History.find(:all, options)\n-\n- if @general and not params[:all]\n- @current_page = (params[:page] || 1).to_i\n- options.merge!(:page => @current_page, :per_page => 20)\n- @page_count, @history = History.paginated(options)\n- end\n-\n- render :layout => request.xhr? ? false : 'rails_admin/list'\n- end\n-\n def handle_error(e)\n if RailsAdmin::AuthenticationNotConfigured === e\n Rails.logger.error e.message\n@@ -200,20 +134,6 @@ module RailsAdmin\n \n private\n \n- def get_model\n- model_name = to_model_name(params[:model_name])\n- @abstract_model = RailsAdmin::AbstractModel.new(model_name)\n- @model_config = RailsAdmin.config(@abstract_model)\n- not_found if @model_config.excluded?\n- @properties = @abstract_model.properties\n- end\n-\n- def get_object\n- @object = @abstract_model.get(params[:id])\n- @model_config.bind(:object, @object)\n- not_found unless @object\n- end\n- \n def get_bulk_objects\n @bulk_ids = params[:bulk_ids]\n @bulk_objects = @abstract_model.get_bulk(@bulk_ids)\n@@ -317,8 +237,6 @@ module RailsAdmin\n pretty_name = @model_config.update.label\n action = params[:action]\n \n- check_history\n-\n if params[:_add_another]\n flash[:notice] = t(\"admin.flash.successful\", :name => pretty_name, :action => t(\"admin.actions.#{action}d\"))\n redirect_to rails_admin_new_path(:model_name => param)\n@@ -331,82 +249,12 @@ module RailsAdmin\n end\n end\n \n- # TODO: Move this logic to the History class?\n- def check_history\n- action = params[:action]\n- message = []\n-\n- case action\n- when \"create\"\n- message << \"#{action.capitalize}d #{@model_config.bind(:object, @object).list.object_label}\"\n- when \"update\"\n- # determine which fields changed ???\n- changed_property_list = []\n- @properties = @abstract_model.properties.reject{|property| RailsAdmin::History::IGNORED_ATTRS.include?(property[:name])}\n-\n- @properties.each do |property|\n- property_name = property[:name].to_param\n- if @old_object.send(property_name) != @object.send(property_name)\n- changed_property_list << property_name\n- end\n- end\n-\n- @abstract_model.associations.each do |t|\n- assoc = changed_property_list.index(t[:child_key].to_param)\n- if assoc\n- changed_property_list[assoc] = \"associated #{t[:pretty_name]}\"\n- end\n- end\n-\n- # Determine if any associations were added or removed\n- associations_hash.each do |key, current|\n- removed_ids = (@cached_assocations_hash[key] - current).map{|m| '#' + m.to_s}\n- added_ids = (current - @cached_assocations_hash[key]).map{|m| '#' + m.to_s}\n- if removed_ids.any?\n- message << \"Removed #{key.to_s.capitalize} #{removed_ids.join(', ')} associations\"\n- end\n- if added_ids.any?\n- message << \"Added #{key.to_s.capitalize} #{added_ids.join(', ')} associations\"\n- end\n- end\n-\n- @modified_assoc.uniq.each do |t|\n- changed_property_list << \"associated #{t}\"\n- end\n-\n- if not changed_property_list.empty?\n- message << \"Changed #{changed_property_list.join(\", \")}\"\n- end\n- when \"destroy\"\n- message << \"Destroyed #{@model_config.bind(:object, @object).list.object_label}\"\n- end\n-\n- create_history_item(message, @object, @abstract_model) unless message.empty?\n- end\n-\n- def create_history_item(message, object, abstract_model)\n- message = message.join(', ') if message.is_a? Array\n- date = Time.now\n- History.create(\n- :message => message,\n- :item => object.id,\n- :table => abstract_model.pretty_name,\n- :username => _current_user ? _current_user.email : \"\",\n- :month => date.month,\n- :year => date.year\n- )\n- end\n-\n def render_error whereto = :new\n action = params[:action]\n flash.now[:error] = t(\"admin.flash.error\", :name => @model_config.update.label, :action => t(\"admin.actions.#{action}d\"))\n render whereto, :layout => 'rails_admin/form'\n end\n \n- def to_model_name(param)\n- param.split(\"::\").map{|x| x.singularize.camelize}.join(\"::\")\n- end\n-\n def check_for_cancel\n if params[:_continue]\n flash[:notice] = t(\"admin.flash.noaction\")","filename":"app/controllers/rails_admin/main_controller.rb"},{"diff":"--- a/app/helpers/rails_admin/application_helper.rb\n+++ b/app/helpers/rails_admin/application_helper.rb\n@@ -7,5 +7,109 @@ module RailsAdmin\n return t.message.downcase\n end\n end\n+\n+ # Given a page count and the current page, we generate a set of pagination\n+ # links.\n+ #\n+ # * We use an inner and outer window into a list of links. For a set of\n+ # 20 pages with the current page being 10:\n+ # outer_window:\n+ # 1 2 ..... 19 20\n+ # inner_window\n+ # 5 6 7 8 9 10 11 12 13 14\n+ #\n+ # This is totally adjustable, or can be turned off by giving the\n+ # :inner_window setting a value of nil.\n+ #\n+ # * Options\n+ # :left_cut_label => <em>text_for_cut</em>::\n+ # Used when the page numbers need to be cut off to prevent the set of\n+ # pagination links from being too long.\n+ # Defaults to '&hellip;'\n+ # :right_cut_label => <em>text_for_cut</em>::\n+ # Same as :left_cut_label but for the right side of numbers.\n+ # Defaults to '&hellip;'\n+ # :outer_window => <em>number_of_pages</em>::\n+ # Sets the number of pages to include in the outer 'window'\n+ # Defaults to 2\n+ # :inner_window => <em>number_of_pages</em>::\n+ # Sets the number of pags to include in the inner 'window'\n+ # Defaults to 7\n+ # :page_param => <em>name_of_page_paramiter</em>\n+ # Sets the name of the paramiter the paginator uses to return what\n+ # page is being requested.\n+ # Defaults to 'page'\n+ # :url => <em>url_for_links</em>\n+ # Provides the base url to use in the page navigation links.\n+ # Defaults to ''\n+ def paginate(current_page, page_count, options = {})\n+ options[:left_cut_label] ||= '&hellip;'\n+ options[:right_cut_label] ||= '&hellip;'\n+ options[:outer_window] ||= 2\n+ options[:inner_window] ||= 7\n+ options[:page_param] ||= 'page'\n+ options[:url] ||= \"\"\n+\n+ url = options.delete(:url)\n+ url = url.to_a.collect{|x| x.join(\"=\")}.join(\"&\")\n+\n+ url += (url.include?('=') ? '&' : '') + options[:page_param]\n+ url = \"?\"+url\n+\n+ pages = {\n+ :all => (1..page_count).to_a,\n+ :left => [],\n+ :center => [],\n+ :right => []\n+ }\n+\n+ # Only worry about using our 'windows' if the page count is less then\n+ # our windows combined.\n+ if options[:inner_window].nil? || ((options[:outer_window] * 2) + options[:inner_window] + 2) >= page_count\n+ pages[:center] = pages[:all]\n+ else\n+ pages[:left] = pages[:all][0, options[:outer_window]]\n+ pages[:right] = pages[:all][page_count - options[:outer_window], options[:outer_window]]\n+ pages[:center] = case current_page\n+ # allow the inner 'window' to shift to right when close to the left edge\n+ # Ex: 1 2 [3] 4 5 6 7 8 9 ... 20\n+ when -infinity .. (options[:inner_window] / 2) + 3\n+ pages[:all][options[:outer_window], options[:inner_window]] +\n+ [options[:right_cut_label]]\n+ # allow the inner 'window' to shift left when close to the right edge\n+ # Ex: 1 2 ... 12 13 14 15 16 [17] 18 19 20\n+ when (page_count - (options[:inner_window] / 2.0).ceil) - 1 .. infinity\n+ [options[:left_cut_label]] +\n+ pages[:all][page_count - options[:inner_window] - options[:outer_window], options[:inner_window]]\n+ # Display the unshifed window\n+ # ex: 1 2 ... 5 6 7 [8] 9 10 11 ... 19 20\n+ else\n+ [options[:left_cut_label]] +\n+ pages[:all][current_page - (options[:inner_window] / 2) - 1, options[:inner_window]] +\n+ [options[:right_cut_label]]\n+ end\n+ end\n+\n+ b = []\n+\n+ [pages[:left], pages[:center], pages[:right]].each do |p|\n+ p.each do |page_number|\n+\n+ case page_number\n+ when String\n+ b << page_number\n+ when current_page\n+ b << Builder::XmlMarkup.new.span(page_number, :class => \"this-page\")\n+ when page_count\n+ b << Builder::XmlMarkup.new.a(page_number, :class => \"end\", :href => \"#{url}=#{page_number}\")\n+ else\n+ b << Builder::XmlMarkup.new.a(page_number, :href => \"#{url}=#{page_number}\")\n+ end\n+ end\n+ end\n+\n+ b.join(\" \")\n+ end\n+\n end\n end","filename":"app/helpers/rails_admin/application_helper.rb"},{"diff":"--- a/app/helpers/rails_admin/main_helper.rb\n+++ b/app/helpers/rails_admin/main_helper.rb\n@@ -21,109 +21,6 @@ module RailsAdmin\n return style, other, selected_set\n end\n \n- # Given a page count and the current page, we generate a set of pagination\n- # links.\n- #\n- # * We use an inner and outer window into a list of links. For a set of\n- # 20 pages with the current page being 10:\n- # outer_window:\n- # 1 2 ..... 19 20\n- # inner_window\n- # 5 6 7 8 9 10 11 12 13 14\n- #\n- # This is totally adjustable, or can be turned off by giving the\n- # :inner_window setting a value of nil.\n- #\n- # * Options\n- # :left_cut_label => <em>text_for_cut</em>::\n- # Used when the page numbers need to be cut off to prevent the set of\n- # pagination links from being too long.\n- # Defaults to '&hellip;'\n- # :right_cut_label => <em>text_for_cut</em>::\n- # Same as :left_cut_label but for the right side of numbers.\n- # Defaults to '&hellip;'\n- # :outer_window => <em>number_of_pages</em>::\n- # Sets the number of pages to include in the outer 'window'\n- # Defaults to 2\n- # :inner_window => <em>number_of_pages</em>::\n- # Sets the number of pags to include in the inner 'window'\n- # Defaults to 7\n- # :page_param => <em>name_of_page_paramiter</em>\n- # Sets the name of the paramiter the paginator uses to return what\n- # page is being requested.\n- # Defaults to 'page'\n- # :url => <em>url_for_links</em>\n- # Provides the base url to use in the page navigation links.\n- # Defaults to ''\n- def paginate(current_page, page_count, options = {})\n- options[:left_cut_label] ||= '&hellip;'\n- options[:right_cut_label] ||= '&hellip;'\n- options[:outer_window] ||= 2\n- options[:inner_window] ||= 7\n- options[:page_param] ||= 'page'\n- options[:url] ||= \"\"\n-\n- url = options.delete(:url)\n- url = url.to_a.collect{|x| x.join(\"=\")}.join(\"&\")\n-\n- url += (url.include?('=') ? '&' : '') + options[:page_param]\n- url = \"?\"+url\n-\n- pages = {\n- :all => (1..page_count).to_a,\n- :left => [],\n- :center => [],\n- :right => []\n- }\n-\n- # Only worry about using our 'windows' if the page count is less then\n- # our windows combined.\n- if options[:inner_window].nil? || ((options[:outer_window] * 2) + options[:inner_window] + 2) >= page_count\n- pages[:center] = pages[:all]\n- else\n- pages[:left] = pages[:all][0, options[:outer_window]]\n- pages[:right] = pages[:all][page_count - options[:outer_window], options[:outer_window]]\n- pages[:center] = case current_page\n- # allow the inner 'window' to shift to right when close to the left edge\n- # Ex: 1 2 [3] 4 5 6 7 8 9 ... 20\n- when -infinity .. (options[:inner_window] / 2) + 3\n- pages[:all][options[:outer_window], options[:inner_window]] +\n- [options[:right_cut_label]]\n- # allow the inner 'window' to shift left when close to the right edge\n- # Ex: 1 2 ... 12 13 14 15 16 [17] 18 19 20\n- when (page_count - (options[:inner_window] / 2.0).ceil) - 1 .. infinity\n- [options[:left_cut_label]] +\n- pages[:all][page_count - options[:inner_window] - options[:outer_window], options[:inner_window]]\n- # Display the unshifed window\n- # ex: 1 2 ... 5 6 7 [8] 9 10 11 ... 19 20\n- else\n- [options[:left_cut_label]] +\n- pages[:all][current_page - (options[:inner_window] / 2) - 1, options[:inner_window]] +\n- [options[:right_cut_label]]\n- end\n- end\n-\n- b = []\n-\n- [pages[:left], pages[:center], pages[:right]].each do |p|\n- p.each do |page_number|\n-\n- case page_number\n- when String\n- b << page_number\n- when current_page\n- b << Builder::XmlMarkup.new.span(page_number, :class => \"this-page\")\n- when page_count\n- b << Builder::XmlMarkup.new.a(page_number, :class => \"end\", :href => \"#{url}=#{page_number}\")\n- else\n- b << Builder::XmlMarkup.new.a(page_number, :href => \"#{url}=#{page_number}\")\n- end\n- end\n- end\n-\n- b.join(\" \")\n- end\n-\n private\n \n def infinity","filename":"app/helpers/rails_admin/main_helper.rb"},{"diff":"--- a/app/models/rails_admin/blank_history.rb\n+++ b/app/models/rails_admin/blank_history.rb\n@@ -6,5 +6,11 @@ module RailsAdmin\n @month = month\n @year = year\n end\n+\n+ # Make BlankHistory look like History when it gets JSON-serialized.\n+ def to_hash(*a)\n+ {\"history\" => {\"number\" => @number, \"month\" => @month, \"year\" => @year}}\n+ end\n+\n end\n end","filename":"app/models/rails_admin/blank_history.rb"},{"diff":"--- a/app/models/rails_admin/history.rb\n+++ b/app/models/rails_admin/history.rb\n@@ -7,31 +7,6 @@ module RailsAdmin\n where(\"#{retrieve_connection.quote_column_name(:table)} = ?\", table).order(\"updated_at\")\n }\n \n- def self.paginated(options = {})\n- page = options.delete(:page) || 1\n- per_page = options.delete(:per_page) || RailsAdmin[:per_page]\n-\n- page_count = (count(options).to_f / per_page).ceil\n-\n- options.merge!({\n- :limit => per_page,\n- :offset => (page - 1) * per_page\n- })\n-\n- [page_count, all(options)]\n- end\n-\n- def self.latest\n- mstart = 5.month.ago.month\n- mstop = Time.now.month\n-\n- ystop = Time.now.year\n- ystart = 5.month.ago.year\n-\n- self.get_history_for_dates(mstart, mstop, ystart, ystop)\n- end\n-\n-\n def self.get_history_for_dates(mstart, mstop, ystart, ystop)\n sql_in = \"\"\n if mstart > mstop\n@@ -65,14 +40,5 @@ module RailsAdmin\n end\n end\n end\n-\n- def self.get_history_for_month(ref, section)\n- current_ref = -5 * ref.to_i\n- current_diff = current_ref + 5 - (section.to_i + 1)\n-\n- current_month = current_diff.month.ago\n-\n- return History.find(:all, :conditions => [\"month = ? and year = ?\", current_month.month, current_month.year]), current_month\n- end\n end\n end","filename":"app/models/rails_admin/history.rb"},{"diff":"--- a/app/views/rails_admin/main/edit.html.erb\n+++ b/app/views/rails_admin/main/edit.html.erb\n@@ -4,7 +4,7 @@\n <ul id=\"quick\">\n <!--<li><a href=\"#\">Quick add</a></li>-->\n <li>\n- <%= link_to(t(\"admin.history.name\"), rails_admin_show_history_path(:id => params[:id]), :class => \"addlink\") %>\n+ <%= link_to(t(\"admin.history.name\"), rails_admin_history_object_path(:id => params[:id]), :class => \"addlink\") %>\n </li>\n </ul>\n <a href=\"<%= rails_admin_delete_path(:model_name => @abstract_model.to_param, :id => params[:id]) %>\" id=\"deleteItem\"><img src=\"/images/rails_admin/cross.png\" alt=\"Delete\"><%= t(\"admin.list.delete_action\") %></a>","filename":"app/views/rails_admin/main/edit.html.erb"},{"diff":"--- a/app/views/rails_admin/main/index.html.erb\n+++ b/app/views/rails_admin/main/index.html.erb\n@@ -19,7 +19,7 @@\n <%= link_to(RailsAdmin.config(abstract_model).list.label, rails_admin_list_path(:model_name => abstract_model.to_param), :class => \"show\") %>\n </td>\n <td>\n- <% if (last_used = RailsAdmin::History.most_recent(abstract_model.pretty_name).last.try(:updated_at)) %>\n+ <% if (last_used = @most_recent_changes[abstract_model.pretty_name]) %>\n <%= time_ago_in_words last_used %> <%= t \"admin.dashboard.ago\" %>\n <% end %>\n </td>\n@@ -53,11 +53,7 @@\n <% month_names = t(\"date.month_names\", :locale => :en) if (month_names = t(\"date.month_names\")) =~ /translation/ %>\n <span><%= month_names[t.month] %> <%= t.year %></span>\n <span class=\"bars\">\n- <% if t.number == 0 %>\n- <br/><%= t(\"admin.history.no_activity\") %>\n- <% else %>\n <span class=\"indicator <%= indicator_type %>\" style=\"height:<%= percent %>%\"></span>\n- <% end %>\n </span>\n </li>\n <% end %>","filename":"app/views/rails_admin/main/index.html.erb"},{"diff":"--- a/app/views/rails_admin/main/list.html.erb\n+++ b/app/views/rails_admin/main/list.html.erb\n@@ -28,7 +28,7 @@\n <div id=\"quickAccess\">\n <ul id=\"quick\">\n <li>\n- <%= link_to(t(\"admin.history.name\"), rails_admin_show_history_path, :class => \"addlink\") %>\n+ <%= link_to(t(\"admin.history.name\"), rails_admin_history_model_path, :class => \"addlink\") %>\n </li>\n <li>\n <%= link_to(t(\"admin.list.add_new\"), rails_admin_new_path(:model_name => @abstract_model.to_param), :class => \"addlink\") %>","filename":"app/views/rails_admin/main/list.html.erb"},{"diff":"--- a/config/routes.rb\n+++ b/config/routes.rb\n@@ -8,7 +8,6 @@ Rails.application.routes.draw do\n get \"/:model_name\", :to => :list, :as => \"list\"\n get \"/:model_name/new\", :to => :new, :as => \"new\"\n match \"/:model_name/get_pages\", :to => :get_pages, :as => \"get_pages\"\n- match \"/:model_name/history\", :to => :show_history, :as => \"show_history\"\n post \"/:model_name\", :to => :create, :as => \"create\"\n get \"/:model_name/:id/edit\", :to => :edit, :as => \"edit\"\n put \"/:model_name/:id\", :to => :update, :as => \"update\"\n@@ -20,6 +19,9 @@ Rails.application.routes.draw do\n scope \"history\", :as => \"history\" do\n controller \"history\" do\n match \"/list\", :to => :list, :as => \"list\"\n+ match \"/slider\", :to => :slider, :as => \"slider\"\n+ match \"/:model_name\", :to => :for_model, :as => \"model\"\n+ match \"/:model_name/:id\", :to => :for_object, :as => \"object\"\n end\n end\n end","filename":"config/routes.rb"},{"diff":"--- a/lib/rails_admin.rb\n+++ b/lib/rails_admin.rb\n@@ -1,5 +1,6 @@\n require 'rails_admin/engine'\n require 'rails_admin/abstract_model'\n+require 'rails_admin/abstract_history'\n require 'rails_admin/config'\n \n module RailsAdmin","filename":"lib/rails_admin.rb"},{"diff":"--- a/public/javascripts/rails_admin/dashboard.js\n+++ b/public/javascripts/rails_admin/dashboard.js\n@@ -16,7 +16,7 @@ function get_indicator(percent){\n function loadHistory(param){\n var ref = param;\n \n- new Ajax.Request(\"/admin/history/list\", { method: 'post', parameters: { \"ref\": ref },\n+ new Ajax.Request(\"/admin/history/slider\", { method: 'post', parameters: { \"ref\": ref },\n onSuccess: function(transport) {\n \n var response = JSON.parse(transport.responseText)\n@@ -24,12 +24,9 @@ function loadHistory(param){\n var max = response[4].history.number;\n \n response.each(function(e){\n- if(e.fake != 1){\n if(e.history.number > max){\n max = e.history.number;\n }\n- }\n-\n })\n \n var index = 0;\n@@ -39,17 +36,17 @@ function loadHistory(param){\n \n $$(\"#timelineSlider ul li\").each(function(e){\n \n- if(response[index].fake != 1){\n+ var monthName = response[index].history.month;\n+ var yearName = response[index].history.year;\n+ var text = nameForMonths[monthName-1] + \" \" + yearName\n+\n+ if(response[index].history.number > 0){\n var percent = parseInt(response[index].history.number * 100 / max);\n var indicator = e.childElements()[1].childElements()[0];\n var setStyle = \"height: \"+percent+\"%; background:\"+get_indicator(percent);\n- var monthName = response[index].history.month;\n- var yearName = response[index].history.year;\n- var text = nameForMonths[monthName-1] + \" \" + yearName\n }else{\n var indicator = e.childElements()[1].childElements()[0];\n- var setStyle = \"height: 0%; background:\"+get_indicator(percent);\n- var text = \"No data\";\n+ var setStyle = \"height: 0%; background:0\";\n }\n \n var morphEffect = new Effect.Morph(indicator, {","filename":"public/javascripts/rails_admin/dashboard.js"}],"added":["app/views/rails_admin/history/show.html.erb","lib/rails_admin/abstract_history.rb"],"removed":["app/views/rails_admin/main/show_history.html.erb"],"parents":[{"id":"a865e72344359f766b3ab03d3075c65798719ddd"},{"id":"a0857d80960ad9ac543e1d2d38f23b04634f0109"}],"author":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"},"url":"/sferik/rails_admin/commit/3cdfabd973bc3caac209cba903cfdb3bf6636bcd","id":"3cdfabd973bc3caac209cba903cfdb3bf6636bcd","committed_date":"2011-01-21T11:23:58-08:00","authored_date":"2011-01-21T11:23:58-08:00","message":"Merge branch '3pp_history'","tree":"53b3d8ade2ae5721e10bcd643a83e6b01c06462c","committer":{"name":"toby cabot","login":"caboteria","email":"toby@caboteria.org"}}}
@@ -0,0 +1,14 @@
1
+ {
2
+ "body": "I've got the listing and added a comment done on my fork.\nListing all comments on an issue doesn't (yet) return a unique identifier, unless you count the url. This makes updating an existing comment ... a pain.\n\nI tried to put in an issue @ support.github.com, but I can't seem to login and Tender didn't like me trying to post an issue with an email they already had, even though they wouldn't let me login. I'll follow up tomorrow ",
3
+ "url": "https://api.github.com/repos/pengwynn/octokit/issues/comments/1194690",
4
+ "updated_at": "2011-05-18T03:11:51Z",
5
+ "created_at": "2011-05-18T03:11:51Z",
6
+ "body_html": "<p>I've got the listing and added a comment done on my fork.<br>\nListing all comments on an issue doesn't (yet) return a unique identifier, unless you count the url. This makes updating an existing comment ... a pain.</p>\n\n<p>I tried to put in an issue @ support.github.com, but I can't seem to login and Tender didn't like me trying to post an issue with an email they already had, even though they wouldn't let me login. I'll follow up tomorrow </p>",
7
+ "user": {
8
+ "login": "ctshryock",
9
+ "url": "https://api.github.com/users/ctshryock",
10
+ "gravatar_url": "https://secure.gravatar.com/avatar/dfb3948650131e4f0385c3328187cfca?s=30&d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
11
+ "avatar_url": "https://secure.gravatar.com/avatar/dfb3948650131e4f0385c3328187cfca?d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
12
+ "id": 61721
13
+ }
14
+ }
@@ -0,0 +1,44 @@
1
+ [
2
+ {
3
+ "body": "I've started this on my [25-issue-comments-v3 fork][1]\n\n\n[1]: https://github.com/ctshryock/octokit/tree/25-issue-comments-v3",
4
+ "url": "https://api.github.com/repos/pengwynn/octokit/issues/comments/1194549",
5
+ "updated_at": "2011-05-18T02:29:52Z",
6
+ "created_at": "2011-05-18T02:29:52Z",
7
+ "body_html": "<p>I've started this on my <a href=\"https://github.com/ctshryock/octokit/tree/25-issue-comments-v3\">25-issue-comments-v3 fork</a></p>",
8
+ "user": {
9
+ "login": "ctshryock",
10
+ "url": "https://api.github.com/users/ctshryock",
11
+ "gravatar_url": "https://secure.gravatar.com/avatar/dfb3948650131e4f0385c3328187cfca?s=30&d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
12
+ "avatar_url": "https://secure.gravatar.com/avatar/dfb3948650131e4f0385c3328187cfca?d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
13
+ "id": 61721
14
+ }
15
+ },
16
+ {
17
+ "body": "I've got the listing and added a comment done on my fork.\nListing all comments on an issue doesn't (yet) return a unique identifier, unless you count the url. This makes updating an existing comment ... a pain.\n\nI tried to put in an issue @ support.github.com, but I can't seem to login and Tender didn't like me trying to post an issue with an email they already had, even though they wouldn't let me login. I'll follow up tomorrow ",
18
+ "url": "https://api.github.com/repos/pengwynn/octokit/issues/comments/1194690",
19
+ "updated_at": "2011-05-18T03:11:51Z",
20
+ "created_at": "2011-05-18T03:11:51Z",
21
+ "body_html": "<p>I've got the listing and added a comment done on my fork.<br>\nListing all comments on an issue doesn't (yet) return a unique identifier, unless you count the url. This makes updating an existing comment ... a pain.</p>\n\n<p>I tried to put in an issue @ support.github.com, but I can't seem to login and Tender didn't like me trying to post an issue with an email they already had, even though they wouldn't let me login. I'll follow up tomorrow </p>",
22
+ "user": {
23
+ "login": "ctshryock",
24
+ "url": "https://api.github.com/users/ctshryock",
25
+ "gravatar_url": "https://secure.gravatar.com/avatar/dfb3948650131e4f0385c3328187cfca?s=30&d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
26
+ "avatar_url": "https://secure.gravatar.com/avatar/dfb3948650131e4f0385c3328187cfca?d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
27
+ "id": 61721
28
+ }
29
+ },
30
+ {
31
+ "body": "Thanks for digging in on this.",
32
+ "url": "https://api.github.com/repos/pengwynn/octokit/issues/comments/1199663",
33
+ "updated_at": "2011-05-18T20:46:15Z",
34
+ "created_at": "2011-05-18T20:46:15Z",
35
+ "body_html": "<p>Thanks for digging in on this.</p>",
36
+ "user": {
37
+ "login": "sferik",
38
+ "url": "https://api.github.com/users/sferik",
39
+ "gravatar_url": "https://secure.gravatar.com/avatar/1f74b13f1e5c6c69cb5d7fbaabb1e2cb?s=30&d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
40
+ "avatar_url": "https://secure.gravatar.com/avatar/1f74b13f1e5c6c69cb5d7fbaabb1e2cb?d=https://d3nwyuy0nl342s.cloudfront.net%2Fimages%2Fgravatars%2Fgravatar-140.png",
41
+ "id": 10308
42
+ }
43
+ }
44
+ ]
@@ -0,0 +1,5 @@
1
+ {
2
+ "color": "ededed",
3
+ "url": "https://api.github.com/repos/pengwynn/octokit/labels/V3+Addition",
4
+ "name": "V3 Addition"
5
+ }
@@ -0,0 +1,17 @@
1
+ [
2
+ {
3
+ "color": "02d7e1",
4
+ "url": "https://api.github.com/repos/pengwynn/octokit/labels/V3+Transition",
5
+ "name": "V3 Transition"
6
+ },
7
+ {
8
+ "color": "ededed",
9
+ "url": "https://api.github.com/repos/pengwynn/octokit/labels/V3+Addition",
10
+ "name": "V3 Addition"
11
+ },
12
+ {
13
+ "color": "e10c02",
14
+ "url": "https://api.github.com/repos/pengwynn/octokit/labels/Bug",
15
+ "name": "Bug"
16
+ }
17
+ ]
@@ -0,0 +1,12 @@
1
+ {
2
+ "open_issues": 5,
3
+ "url": "https://api.github.com/repos/pengwynn/octokit/milestones/1",
4
+ "due_on": "2011-05-01T07:00:00Z",
5
+ "closed_issues": 1,
6
+ "created_at": "2011-04-29T19:50:34Z",
7
+ "description": "Add support for API v3",
8
+ "state": "open",
9
+ "title": "0.7.0",
10
+ "number": 1
11
+ }
12
+