json-stream 0.2.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 62af90ebe18d5c8a58ca9b75695bf2c403b4c4a0
4
- data.tar.gz: d3176279af8156702e63ffdf4c963ab6f0e25cb3
2
+ SHA256:
3
+ metadata.gz: 1e4c82437a4cdee4f03248b940f8b6cf3d3e9fb4748fd5002edcb2cee2196729
4
+ data.tar.gz: 809ef20496473f94b7dd0038e99aa4c6742320a850367f0d4884e35081ff0f3d
5
5
  SHA512:
6
- metadata.gz: 5d757855dcd79878bb9d5cbdd74c05252bde3286259b88315e95b3302ce60bc24bbf2d6f6e0ab32a5507b55bbdeae3b63ab405368880cfb29b1981f3cb291146
7
- data.tar.gz: 0a90cf028ed263a4dc571c4834e1b033d9c23b17aaaef36a7275d44e804a69c1c7c8090ea119411858608bfb45a8c6ada7b2e4e6c8862294ef54ef091b1030e0
6
+ metadata.gz: e3a75b2ab962f6f4d8feaca106d9fbbe97bafdc4c4e8061c473507746f6ba56db2a2b7b5cb55360a8945339b23df6c360a502356632e9fad9b1e350837a03924
7
+ data.tar.gz: 9cbaa52cd8eef3d0d94b45515f1f900c10b12115825835b65f20fa901bb62db7323e53cf6d5132370d08c14e09a8750c54e65e256edaf9c41fbc48975661f43e
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2014 David Graham
1
+ Copyright (c) 2010-2024 David Graham
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -40,7 +40,7 @@ Again, while JSON::Stream can be used this way, if we just need to stream the
40
40
  document from disk or the network, we're better off using the yajl-ruby gem.
41
41
 
42
42
  Huge documents arriving over the network in small chunks to an EventMachine
43
- receive_data loop is where JSON::Stream is really useful. Inside an
43
+ `receive_data` loop is where JSON::Stream is really useful. Inside an
44
44
  EventMachine::Connection subclass we might have:
45
45
 
46
46
  ```ruby
@@ -52,8 +52,8 @@ def post_init
52
52
  end_object { puts "end object" }
53
53
  start_array { puts "start array" }
54
54
  end_array { puts "end array" }
55
- key {|k| puts "key: #{k}" }
56
- value {|v| puts "value: #{v}" }
55
+ key { |k| puts "key: #{k}" }
56
+ value { |v| puts "value: #{v}" }
57
57
  end
58
58
  end
59
59
 
@@ -77,16 +77,19 @@ imagine the callbacks looking for an array named `rows` and processing sets
77
77
  of these row objects in small batches. Millions of rows, streaming over the
78
78
  network, can be processed in constant memory space this way.
79
79
 
80
- ## Dependencies
81
-
82
- * ruby >= 1.9.2
83
- * jruby >= 1.7
84
-
85
80
  ## Alternatives
86
81
 
87
82
  * [json](https://github.com/flori/json)
88
83
  * [yajl-ruby](https://github.com/brianmario/yajl-ruby)
89
84
  * [yajl-ffi](https://github.com/dgraham/yajl-ffi)
85
+ * [application/json-seq](http://www.rfc-editor.org/rfc/rfc7464.txt)
86
+
87
+ ## Development
88
+
89
+ ```
90
+ $ bin/setup
91
+ $ bin/rake test
92
+ ```
90
93
 
91
94
  ## License
92
95
 
data/json-stream.gemspec CHANGED
@@ -11,10 +11,12 @@ Gem::Specification.new do |s|
11
11
  s.homepage = 'http://dgraham.github.io/json-stream/'
12
12
  s.license = 'MIT'
13
13
 
14
- s.files = Dir['[A-Z]*', 'json-stream.gemspec', '{lib}/**/*']
15
- s.test_files = Dir['spec/**/*']
14
+ s.files = Dir['[A-Z]*', 'json-stream.gemspec', '{lib}/**/*'] - ['Gemfile.lock']
16
15
  s.require_path = 'lib'
17
16
 
18
- s.add_development_dependency 'rake', '~> 10.3'
19
- s.required_ruby_version = '>= 1.9.2'
17
+ s.add_development_dependency 'bundler', '~> 2.2'
18
+ s.add_development_dependency 'minitest', '~> 5.22'
19
+ s.add_development_dependency 'rake', '~> 13.2'
20
+
21
+ s.required_ruby_version = '>= 2.6.0'
20
22
  end
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  module JSON
4
2
  module Stream
5
3
  # A character buffer that expects a UTF-8 encoded stream of bytes.
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  module JSON
4
2
  module Stream
5
3
  # A parser listener that builds a full, in memory, object from a JSON
@@ -1,5 +1,3 @@
1
- # encoding: UTF-8
2
-
3
1
  module JSON
4
2
  module Stream
5
3
  # Raised on any invalid JSON text.
@@ -12,8 +10,8 @@ module JSON
12
10
  # Examples
13
11
  #
14
12
  # parser = JSON::Stream::Parser.new
15
- # parser.key {|key| puts key }
16
- # parser.value {|value| puts value }
13
+ # parser.key { |key| puts key }
14
+ # parser.value { |value| puts value }
17
15
  # parser << '{"answer":'
18
16
  # parser << ' 42}'
19
17
  class Parser
@@ -85,8 +83,8 @@ module JSON
85
83
  # end_object { puts "end object" }
86
84
  # start_array { puts "start array" }
87
85
  # end_array { puts "end array" }
88
- # key {|k| puts "key: #{k}" }
89
- # value {|v| puts "value: #{v}" }
86
+ # key { |k| puts "key: #{k}" }
87
+ # value { |v| puts "value: #{v}" }
90
88
  # end
91
89
  def initialize(&block)
92
90
  @state = :start_document
@@ -220,12 +218,12 @@ module JSON
220
218
  if @unicode.size == 4
221
219
  codepoint = @unicode.slice!(0, 4).hex
222
220
  if codepoint >= 0xD800 && codepoint <= 0xDBFF
223
- error('Expected low surrogate pair half') if @stack[-1].is_a?(Fixnum)
221
+ error('Expected low surrogate pair half') if @stack[-1].is_a?(Integer)
224
222
  @state = :start_surrogate_pair
225
223
  @stack.push(codepoint)
226
224
  elsif codepoint >= 0xDC00 && codepoint <= 0xDFFF
227
225
  high = @stack.pop
228
- error('Expected high surrogate pair half') unless high.is_a?(Fixnum)
226
+ error('Expected high surrogate pair half') unless high.is_a?(Integer)
229
227
  pair = ((high - 0xD800) * 0x400) + (codepoint - 0xDC00) + 0x10000
230
228
  @buf << pair
231
229
  @state = :start_string
@@ -1,7 +1,5 @@
1
- # encoding: UTF-8
2
-
3
1
  module JSON
4
2
  module Stream
5
- VERSION = '0.2.1'
3
+ VERSION = '1.0.0'
6
4
  end
7
5
  end
metadata CHANGED
@@ -1,29 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-stream
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Graham
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-08 00:00:00.000000000 Z
11
+ date: 2024-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.22'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.22'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: rake
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - "~>"
18
46
  - !ruby/object:Gem::Version
19
- version: '10.3'
47
+ version: '13.2'
20
48
  type: :development
21
49
  prerelease: false
22
50
  version_requirements: !ruby/object:Gem::Requirement
23
51
  requirements:
24
52
  - - "~>"
25
53
  - !ruby/object:Gem::Version
26
- version: '10.3'
54
+ version: '13.2'
27
55
  description: A parser best suited for huge JSON documents that don't fit in memory.
28
56
  email:
29
57
  - david.malcom.graham@gmail.com
@@ -31,6 +59,7 @@ executables: []
31
59
  extensions: []
32
60
  extra_rdoc_files: []
33
61
  files:
62
+ - Gemfile
34
63
  - LICENSE
35
64
  - README.md
36
65
  - Rakefile
@@ -40,15 +69,11 @@ files:
40
69
  - lib/json/stream/builder.rb
41
70
  - lib/json/stream/parser.rb
42
71
  - lib/json/stream/version.rb
43
- - spec/buffer_spec.rb
44
- - spec/builder_spec.rb
45
- - spec/fixtures/repository.json
46
- - spec/parser_spec.rb
47
72
  homepage: http://dgraham.github.io/json-stream/
48
73
  licenses:
49
74
  - MIT
50
75
  metadata: {}
51
- post_install_message:
76
+ post_install_message:
52
77
  rdoc_options: []
53
78
  require_paths:
54
79
  - lib
@@ -56,20 +81,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
81
  requirements:
57
82
  - - ">="
58
83
  - !ruby/object:Gem::Version
59
- version: 1.9.2
84
+ version: 2.6.0
60
85
  required_rubygems_version: !ruby/object:Gem::Requirement
61
86
  requirements:
62
87
  - - ">="
63
88
  - !ruby/object:Gem::Version
64
89
  version: '0'
65
90
  requirements: []
66
- rubyforge_project:
67
- rubygems_version: 2.2.2
68
- signing_key:
91
+ rubygems_version: 3.5.4
92
+ signing_key:
69
93
  specification_version: 4
70
94
  summary: A streaming JSON parser that generates SAX-like events.
71
- test_files:
72
- - spec/buffer_spec.rb
73
- - spec/builder_spec.rb
74
- - spec/fixtures/repository.json
75
- - spec/parser_spec.rb
95
+ test_files: []
data/spec/buffer_spec.rb DELETED
@@ -1,110 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'json/stream'
4
- require 'minitest/autorun'
5
-
6
- describe JSON::Stream::Buffer do
7
- subject { JSON::Stream::Buffer.new }
8
-
9
- it 'accepts single byte characters' do
10
- assert_equal "", subject << ""
11
- assert_equal "abc", subject << "abc"
12
- assert_equal "\u0000abc", subject << "\u0000abc"
13
- end
14
-
15
- # The é character can be a single codepoint \u00e9 or two codepoints
16
- # \u0065\u0301. The first is encoded in 2 bytes, the second in 3 bytes.
17
- # The json and yajl-ruby gems and CouchDB do not normalize unicode text
18
- # so neither will we. Although, a good way to normalize is by calling
19
- # ActiveSupport::Multibyte::Chars.new("é").normalize(:c).
20
- it 'accepts combined characters' do
21
- assert_equal "\u0065\u0301", subject << "\u0065\u0301"
22
- assert_equal 3, (subject << "\u0065\u0301").bytesize
23
- assert_equal 2, (subject << "\u0065\u0301").size
24
-
25
- assert_equal "\u00e9", subject << "\u00e9"
26
- assert_equal 2, (subject << "\u00e9").bytesize
27
- assert_equal 1, (subject << "\u00e9").size
28
- end
29
-
30
- it 'accepts valid two byte characters' do
31
- assert_equal "abcé", subject << "abcé"
32
- assert_equal "a", subject << "a\xC3"
33
- assert_equal "é", subject << "\xA9"
34
- assert_equal "", subject << "\xC3"
35
- assert_equal "é", subject << "\xA9"
36
- assert_equal "é", subject << "\xC3\xA9"
37
- end
38
-
39
- it 'accepts valid three byte characters' do
40
- assert_equal "abcé\u2603", subject << "abcé\u2603"
41
- assert_equal "a", subject << "a\xE2"
42
- assert_equal "", subject << "\x98"
43
- assert_equal "\u2603", subject << "\x83"
44
- end
45
-
46
- it 'accepts valid four byte characters' do
47
- assert_equal "abcé\u2603\u{10102}é", subject << "abcé\u2603\u{10102}é"
48
- assert_equal "a", subject << "a\xF0"
49
- assert_equal "", subject << "\x90"
50
- assert_equal "", subject << "\x84"
51
- assert_equal "\u{10102}", subject << "\x82"
52
- end
53
-
54
- it 'rejects valid utf-8 followed by partial two byte sequence' do
55
- assert_equal '[', subject << '['
56
- assert_equal '"', subject << '"'
57
- assert_equal '', subject << "\xC3"
58
- -> { subject << '"' }.must_raise JSON::Stream::ParserError
59
- end
60
-
61
- it 'rejects invalid two byte start characters' do
62
- -> { subject << "\xC3\xC3" }.must_raise JSON::Stream::ParserError
63
- end
64
-
65
- it 'rejects invalid three byte start characters' do
66
- -> { subject << "\xE2\xE2" }.must_raise JSON::Stream::ParserError
67
- end
68
-
69
- it 'rejects invalid four byte start characters' do
70
- -> { subject << "\xF0\xF0" }.must_raise JSON::Stream::ParserError
71
- end
72
-
73
- it 'rejects a two byte start with single byte continuation character' do
74
- -> { subject << "\xC3\u0000" }.must_raise JSON::Stream::ParserError
75
- end
76
-
77
- it 'rejects a three byte start with single byte continuation character' do
78
- -> { subject << "\xE2\u0010" }.must_raise JSON::Stream::ParserError
79
- end
80
-
81
- it 'rejects a four byte start with single byte continuation character' do
82
- -> { subject << "\xF0a" }.must_raise JSON::Stream::ParserError
83
- end
84
-
85
- it 'rejects an invalid continuation character' do
86
- -> { subject << "\xA9" }.must_raise JSON::Stream::ParserError
87
- end
88
-
89
- it 'rejects an overlong form' do
90
- -> { subject << "\xC0\x80" }.must_raise JSON::Stream::ParserError
91
- end
92
-
93
- describe 'checking for empty buffers' do
94
- it 'is initially empty' do
95
- assert subject.empty?
96
- end
97
-
98
- it 'is empty after processing complete characters' do
99
- subject << 'test'
100
- assert subject.empty?
101
- end
102
-
103
- it 'is not empty after processing partial multi-byte characters' do
104
- subject << "\xC3"
105
- refute subject.empty?
106
- subject << "\xA9"
107
- assert subject.empty?
108
- end
109
- end
110
- end
data/spec/builder_spec.rb DELETED
@@ -1,157 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- require 'json/stream'
4
- require 'minitest/autorun'
5
-
6
- describe JSON::Stream::Builder do
7
- let(:parser) { JSON::Stream::Parser.new }
8
- subject { JSON::Stream::Builder.new(parser) }
9
-
10
- it 'builds a false value' do
11
- assert_nil subject.result
12
- subject.start_document
13
- subject.value(false)
14
- assert_nil subject.result
15
- subject.end_document
16
- assert_equal false, subject.result
17
- end
18
-
19
- it 'builds a string value' do
20
- assert_nil subject.result
21
- subject.start_document
22
- subject.value("test")
23
- assert_nil subject.result
24
- subject.end_document
25
- assert_equal "test", subject.result
26
- end
27
-
28
- it 'builds an empty array' do
29
- assert_nil subject.result
30
- subject.start_document
31
- subject.start_array
32
- subject.end_array
33
- assert_nil subject.result
34
- subject.end_document
35
- assert_equal [], subject.result
36
- end
37
-
38
- it 'builds an array of numbers' do
39
- subject.start_document
40
- subject.start_array
41
- subject.value(1)
42
- subject.value(2)
43
- subject.value(3)
44
- subject.end_array
45
- subject.end_document
46
- assert_equal [1, 2, 3], subject.result
47
- end
48
-
49
- it 'builds nested empty arrays' do
50
- subject.start_document
51
- subject.start_array
52
- subject.start_array
53
- subject.end_array
54
- subject.end_array
55
- subject.end_document
56
- assert_equal [[]], subject.result
57
- end
58
-
59
- it 'builds nested arrays of numbers' do
60
- subject.start_document
61
- subject.start_array
62
- subject.value(1)
63
- subject.start_array
64
- subject.value(2)
65
- subject.end_array
66
- subject.value(3)
67
- subject.end_array
68
- subject.end_document
69
- assert_equal [1, [2], 3], subject.result
70
- end
71
-
72
- it 'builds an empty object' do
73
- subject.start_document
74
- subject.start_object
75
- subject.end_object
76
- subject.end_document
77
- assert_equal({}, subject.result)
78
- end
79
-
80
- it 'builds a complex object' do
81
- subject.start_document
82
- subject.start_object
83
- subject.key("k1")
84
- subject.value(1)
85
- subject.key("k2")
86
- subject.value(nil)
87
- subject.key("k3")
88
- subject.value(true)
89
- subject.key("k4")
90
- subject.value(false)
91
- subject.key("k5")
92
- subject.value("string value")
93
- subject.end_object
94
- subject.end_document
95
- expected = {
96
- "k1" => 1,
97
- "k2" => nil,
98
- "k3" => true,
99
- "k4" => false,
100
- "k5" => "string value"
101
- }
102
- assert_equal expected, subject.result
103
- end
104
-
105
- it 'builds a nested object' do
106
- subject.start_document
107
- subject.start_object
108
- subject.key("k1")
109
- subject.value(1)
110
-
111
- subject.key("k2")
112
- subject.start_object
113
- subject.end_object
114
-
115
- subject.key("k3")
116
- subject.start_object
117
- subject.key("sub1")
118
- subject.start_array
119
- subject.value(12)
120
- subject.end_array
121
- subject.end_object
122
-
123
- subject.key("k4")
124
- subject.start_array
125
- subject.value(1)
126
- subject.start_object
127
- subject.key("sub2")
128
- subject.start_array
129
- subject.value(nil)
130
- subject.end_array
131
- subject.end_object
132
- subject.end_array
133
-
134
- subject.key("k5")
135
- subject.value("string value")
136
- subject.end_object
137
- subject.end_document
138
- expected = {
139
- "k1" => 1,
140
- "k2" => {},
141
- "k3" => {"sub1" => [12]},
142
- "k4" => [1, {"sub2" => [nil]}],
143
- "k5" => "string value"
144
- }
145
- assert_equal expected, subject.result
146
- end
147
-
148
- it 'builds a real document' do
149
- refute_nil subject
150
- parser << File.read('spec/fixtures/repository.json')
151
- refute_nil subject.result
152
- assert_equal 'rails', subject.result['name']
153
- assert_equal 4223, subject.result['owner']['id']
154
- assert_equal false, subject.result['fork']
155
- assert_equal nil, subject.result['mirror_url']
156
- end
157
- end
@@ -1,107 +0,0 @@
1
- {
2
- "id": 8514,
3
- "name": "rails",
4
- "full_name": "rails/rails",
5
- "owner": {
6
- "login": "rails",
7
- "id": 4223,
8
- "avatar_url": "https://avatars.githubusercontent.com/u/4223?",
9
- "gravatar_id": "30f39a09e233e8369dddf6feb4be0308",
10
- "url": "https://api.github.com/users/rails",
11
- "html_url": "https://github.com/rails",
12
- "followers_url": "https://api.github.com/users/rails/followers",
13
- "following_url": "https://api.github.com/users/rails/following{/other_user}",
14
- "gists_url": "https://api.github.com/users/rails/gists{/gist_id}",
15
- "starred_url": "https://api.github.com/users/rails/starred{/owner}{/repo}",
16
- "subscriptions_url": "https://api.github.com/users/rails/subscriptions",
17
- "organizations_url": "https://api.github.com/users/rails/orgs",
18
- "repos_url": "https://api.github.com/users/rails/repos",
19
- "events_url": "https://api.github.com/users/rails/events{/privacy}",
20
- "received_events_url": "https://api.github.com/users/rails/received_events",
21
- "type": "Organization",
22
- "site_admin": false
23
- },
24
- "private": false,
25
- "html_url": "https://github.com/rails/rails",
26
- "description": "Ruby on Rails",
27
- "fork": false,
28
- "url": "https://api.github.com/repos/rails/rails",
29
- "forks_url": "https://api.github.com/repos/rails/rails/forks",
30
- "keys_url": "https://api.github.com/repos/rails/rails/keys{/key_id}",
31
- "collaborators_url": "https://api.github.com/repos/rails/rails/collaborators{/collaborator}",
32
- "teams_url": "https://api.github.com/repos/rails/rails/teams",
33
- "hooks_url": "https://api.github.com/repos/rails/rails/hooks",
34
- "issue_events_url": "https://api.github.com/repos/rails/rails/issues/events{/number}",
35
- "events_url": "https://api.github.com/repos/rails/rails/events",
36
- "assignees_url": "https://api.github.com/repos/rails/rails/assignees{/user}",
37
- "branches_url": "https://api.github.com/repos/rails/rails/branches{/branch}",
38
- "tags_url": "https://api.github.com/repos/rails/rails/tags",
39
- "blobs_url": "https://api.github.com/repos/rails/rails/git/blobs{/sha}",
40
- "git_tags_url": "https://api.github.com/repos/rails/rails/git/tags{/sha}",
41
- "git_refs_url": "https://api.github.com/repos/rails/rails/git/refs{/sha}",
42
- "trees_url": "https://api.github.com/repos/rails/rails/git/trees{/sha}",
43
- "statuses_url": "https://api.github.com/repos/rails/rails/statuses/{sha}",
44
- "languages_url": "https://api.github.com/repos/rails/rails/languages",
45
- "stargazers_url": "https://api.github.com/repos/rails/rails/stargazers",
46
- "contributors_url": "https://api.github.com/repos/rails/rails/contributors",
47
- "subscribers_url": "https://api.github.com/repos/rails/rails/subscribers",
48
- "subscription_url": "https://api.github.com/repos/rails/rails/subscription",
49
- "commits_url": "https://api.github.com/repos/rails/rails/commits{/sha}",
50
- "git_commits_url": "https://api.github.com/repos/rails/rails/git/commits{/sha}",
51
- "comments_url": "https://api.github.com/repos/rails/rails/comments{/number}",
52
- "issue_comment_url": "https://api.github.com/repos/rails/rails/issues/comments/{number}",
53
- "contents_url": "https://api.github.com/repos/rails/rails/contents/{+path}",
54
- "compare_url": "https://api.github.com/repos/rails/rails/compare/{base}...{head}",
55
- "merges_url": "https://api.github.com/repos/rails/rails/merges",
56
- "archive_url": "https://api.github.com/repos/rails/rails/{archive_format}{/ref}",
57
- "downloads_url": "https://api.github.com/repos/rails/rails/downloads",
58
- "issues_url": "https://api.github.com/repos/rails/rails/issues{/number}",
59
- "pulls_url": "https://api.github.com/repos/rails/rails/pulls{/number}",
60
- "milestones_url": "https://api.github.com/repos/rails/rails/milestones{/number}",
61
- "notifications_url": "https://api.github.com/repos/rails/rails/notifications{?since,all,participating}",
62
- "labels_url": "https://api.github.com/repos/rails/rails/labels{/name}",
63
- "releases_url": "https://api.github.com/repos/rails/rails/releases{/id}",
64
- "created_at": "2008-04-11T02:19:47Z",
65
- "updated_at": "2014-06-25T21:08:45Z",
66
- "pushed_at": "2014-06-25T17:47:52Z",
67
- "git_url": "git://github.com/rails/rails.git",
68
- "ssh_url": "git@github.com:rails/rails.git",
69
- "clone_url": "https://github.com/rails/rails.git",
70
- "svn_url": "https://github.com/rails/rails",
71
- "homepage": "http://rubyonrails.org",
72
- "size": 331047,
73
- "stargazers_count": 22248,
74
- "watchers_count": 22248,
75
- "language": "Ruby",
76
- "has_issues": true,
77
- "has_downloads": true,
78
- "has_wiki": false,
79
- "forks_count": 8278,
80
- "mirror_url": null,
81
- "open_issues_count": 625,
82
- "forks": 8278,
83
- "open_issues": 625,
84
- "watchers": 22248,
85
- "default_branch": "master",
86
- "organization": {
87
- "login": "rails",
88
- "id": 4223,
89
- "avatar_url": "https://avatars.githubusercontent.com/u/4223?",
90
- "gravatar_id": "30f39a09e233e8369dddf6feb4be0308",
91
- "url": "https://api.github.com/users/rails",
92
- "html_url": "https://github.com/rails",
93
- "followers_url": "https://api.github.com/users/rails/followers",
94
- "following_url": "https://api.github.com/users/rails/following{/other_user}",
95
- "gists_url": "https://api.github.com/users/rails/gists{/gist_id}",
96
- "starred_url": "https://api.github.com/users/rails/starred{/owner}{/repo}",
97
- "subscriptions_url": "https://api.github.com/users/rails/subscriptions",
98
- "organizations_url": "https://api.github.com/users/rails/orgs",
99
- "repos_url": "https://api.github.com/users/rails/repos",
100
- "events_url": "https://api.github.com/users/rails/events{/privacy}",
101
- "received_events_url": "https://api.github.com/users/rails/received_events",
102
- "type": "Organization",
103
- "site_admin": false
104
- },
105
- "network_count": 8278,
106
- "subscribers_count": 1521
107
- }