apollo-crawler 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +8 -8
  2. data/bin/apollo-crawler +0 -4
  3. data/bin/apollo-platform +30 -0
  4. data/config/amqp.yml +18 -0
  5. data/config/amqp.yml.default +18 -0
  6. data/config/apollo.yml +13 -0
  7. data/config/apollo.yml.default +10 -0
  8. data/config/memcached.yml +14 -0
  9. data/config/memcached.yml.default +14 -0
  10. data/config/mongo.yml +19 -0
  11. data/config/mongo.yml.default +19 -0
  12. data/config/mongoid.yml +23 -0
  13. data/config/mongoid.yml.default +59 -0
  14. data/lib/apollo_crawler.rb +12 -3
  15. data/lib/apollo_crawler/adapter/adapters.rb +22 -0
  16. data/lib/apollo_crawler/adapter/amqp_adapter.rb +26 -0
  17. data/lib/apollo_crawler/adapter/mongo_adapter.rb +26 -0
  18. data/lib/apollo_crawler/{cli/cli.rb → agent/agents.rb} +2 -0
  19. data/lib/apollo_crawler/agent/base_agent.rb +26 -0
  20. data/lib/apollo_crawler/cache/caches.rb +20 -0
  21. data/lib/apollo_crawler/cache/sqlite_cache.rb +9 -0
  22. data/lib/apollo_crawler/config.rb +82 -72
  23. data/lib/apollo_crawler/crawler/crawlers.rb +20 -0
  24. data/lib/apollo_crawler/crawler/google_crawler.rb +2 -2
  25. data/lib/apollo_crawler/crawler/hacker_news_crawler.rb +2 -2
  26. data/lib/apollo_crawler/crawler/slashdot_crawler.rb +2 -2
  27. data/lib/apollo_crawler/crawler/stackoverflow_crawler.rb +2 -2
  28. data/lib/apollo_crawler/crawler/xkcd_crawler.rb +2 -2
  29. data/lib/apollo_crawler/crawler/youjizz_crawler.rb +2 -2
  30. data/lib/apollo_crawler/env.rb +24 -0
  31. data/lib/apollo_crawler/fetcher/base_fetcher.rb +1 -1
  32. data/lib/apollo_crawler/fetcher/fetchers.rb +20 -0
  33. data/lib/apollo_crawler/fetcher/simple_fetcher.rb +1 -1
  34. data/lib/apollo_crawler/fetcher/smart_fetcher.rb +1 -1
  35. data/lib/apollo_crawler/formatter/formatters.rb +20 -0
  36. data/lib/apollo_crawler/formatter/json_formatter.rb +5 -1
  37. data/lib/apollo_crawler/formatter/plain_formatter.rb +4 -0
  38. data/lib/apollo_crawler/formatter/table_formatter.rb +4 -0
  39. data/lib/apollo_crawler/helper/amqp_helper.rb +26 -0
  40. data/lib/apollo_crawler/helper/core_helper.rb +24 -4
  41. data/lib/apollo_crawler/helper/helpers.rb +23 -1
  42. data/lib/apollo_crawler/helper/mongo_helper.rb +26 -0
  43. data/lib/apollo_crawler/lib.rb +12 -3
  44. data/lib/apollo_crawler/logger/loggers.rb +20 -0
  45. data/lib/apollo_crawler/planner/base_planner.rb +26 -0
  46. data/lib/apollo_crawler/planner/planners.rb +22 -0
  47. data/lib/apollo_crawler/planner/smart_planner.rb +28 -0
  48. data/lib/apollo_crawler/program/base_program.rb +130 -0
  49. data/lib/apollo_crawler/program/console_program.rb +177 -0
  50. data/lib/apollo_crawler/program/crawler_program.rb +130 -183
  51. data/lib/apollo_crawler/program/platform_program.rb +137 -0
  52. data/lib/apollo_crawler/program/programs.rb +23 -1
  53. data/lib/apollo_crawler/store/stores.rb +20 -0
  54. data/lib/apollo_crawler/version.rb +2 -2
  55. metadata +55 -3
@@ -20,11 +20,20 @@
20
20
 
21
21
  require File.join(File.dirname(__FILE__), 'base_cache')
22
22
 
23
+ require 'sqlite3'
24
+
23
25
  module Apollo
24
26
  module Cache
25
27
  class SqliteCache < BaseCache
28
+ DEFAULT_OPTIONS = {
29
+ :db => "apollo-crawler.db",
30
+ :collection => "fetched_docs"
31
+ }
32
+
26
33
  def initilize(options = {})
27
34
  super(options)
35
+
36
+ @options = DEFAULT_OPTIONS.merge(options)
28
37
  end
29
38
 
30
39
  def get(key)
@@ -18,102 +18,112 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require File.join(File.dirname(__FILE__), 'lib')
21
+ # See http://stackoverflow.com/questions/6233124/where-to-place-access-config-file-in-gem
22
+
23
+ require 'yaml'
22
24
 
23
- module RbConfig
24
- ############################################################
25
- # Program - basic settings
26
- ############################################################
27
-
28
- # Directory for storing apollo-crawler data
29
- PROGRAM_DIRECTORY = File.expand_path("~/.apollo-crawler")
25
+ require File.join(File.dirname(__FILE__), 'lib')
30
26
 
31
- PROGRAM_PLUGINS_DIRECTORY = File.join(PROGRAM_DIRECTORY, "plugins")
32
- PROGRAM_TEMP_DIRECTORY = File.join(PROGRAM_DIRECTORY, "tmp")
27
+ module Apollo
28
+ module RbConfig
29
+ ############################################################
30
+ # Program - basic settings
31
+ ############################################################
32
+
33
+ # Directory for storing apollo-crawler data
34
+ PROGRAM_DIRECTORY = File.expand_path("~/.apollo-crawler")
33
35
 
34
- # Basic PROGRAM_DIRECTORY structure, lazy created
35
- PROGRAM_DIRECTORIES = [
36
- PROGRAM_DIRECTORY,
37
- PROGRAM_PLUGINS_DIRECTORY,
38
- PROGRAM_TEMP_DIRECTORY
39
- ]
36
+ PROGRAM_PLUGINS_DIRECTORY = File.join(PROGRAM_DIRECTORY, "plugins")
37
+ PROGRAM_TEMP_DIRECTORY = File.join(PROGRAM_DIRECTORY, "tmp")
40
38
 
39
+ # Basic PROGRAM_DIRECTORY structure, lazy created
40
+ PROGRAM_DIRECTORIES = [
41
+ PROGRAM_DIRECTORY,
42
+ PROGRAM_PLUGINS_DIRECTORY,
43
+ PROGRAM_TEMP_DIRECTORY
44
+ ]
41
45
 
42
46
 
43
- PROGRAM_CONFIG_PATH = File.join(RbConfig::PROGRAM_DIRECTORY, "config.rb")
44
47
 
48
+ PROGRAM_CONFIG_PATH = File.join(RbConfig::PROGRAM_DIRECTORY, "config.rb")
45
49
 
46
50
 
47
- ############################################################
48
- # Caches - caches implementations
49
- ############################################################
50
- CACHES_DIR = File.join(File.dirname(__FILE__), "caches")
51
51
 
52
+ ############################################################
53
+ # Caches - caches implementations
54
+ ############################################################
55
+ CACHES_DIR = File.join(File.dirname(__FILE__), "caches")
52
56
 
53
57
 
54
- ############################################################
55
- # Cache implementation used for chaching pages retreived
56
- ############################################################
57
- #
58
- # Filesystem backend
59
- # CACHE_CLASS = Apollo::Cache::FilesystemCache
60
- #
61
- # Memcached - expects localhost:11211
62
- # CACHE_CLASS = Apollo::Cache::MemcachedCache
63
- #
64
- # Pure naive ruby in-memory implementation
65
- # CACHE_CLASS = Apollo::Cache::MemoryCache
66
- #
67
- # Null caching - no caching at all
68
- # CACHE_CLASS = Apollo::Cache::NullCache
69
58
 
70
- # Used caching mechanism by default
71
- CACHE_CLASS = Apollo::Cache::MongoCache
59
+ ############################################################
60
+ # Cache implementation used for chaching pages retreived
61
+ ############################################################
62
+ #
63
+ # Filesystem backend
64
+ # CACHE_CLASS = Apollo::Cache::FilesystemCache
65
+ #
66
+ # Memcached - expects localhost:11211
67
+ # CACHE_CLASS = Apollo::Cache::MemcachedCache
68
+ #
69
+ # Pure naive ruby in-memory implementation
70
+ # CACHE_CLASS = Apollo::Cache::MemoryCache
71
+ #
72
+ # Null caching - no caching at all
73
+ # CACHE_CLASS = Apollo::Cache::NullCache
72
74
 
73
- CACHE_CLASS_OPTIONS = {
74
- :host => 'apollo-crawler.no-ip.org',
75
- :port => 27017,
76
- :pool_size => 5,
77
- :pool_timeout => 5,
78
- :db => 'apollo-crawler',
79
- :collection => 'fetched_docs'
80
- }
75
+ CACHE_CLASS_OPTIONS_MONGO = {
76
+ :host => 'apollo-crawler.no-ip.org',
77
+ :port => 27017,
78
+ :pool_size => 5,
79
+ :pool_timeout => 5,
80
+ :db => 'apollo-crawler',
81
+ :collection => 'fetched_docs'
82
+ }
81
83
 
84
+ CACHE_CLASS_OPTIONS_SQLITE3 = {
85
+ :db => 'apollo-crawler-db',
86
+ :collection => 'fetched_docs'
87
+ }
82
88
 
89
+ # Used caching mechanism by default
90
+ CACHE_CLASS = Apollo::Cache::SqliteCache
91
+ CACHE_CLASS_OPTIONS = CACHE_CLASS_OPTIONS_MONGO
83
92
 
84
- ############################################################
85
- # Crawlers - Built-in out-of box working crawlers
86
- ############################################################
87
- CRAWLERS_DIR = File.join(File.dirname(__FILE__), "crawler")
88
-
89
- # Template used for generated crawlers
90
- CRAWLER_TEMPLATE_NAME = "crawler_template.trb"
93
+ ############################################################
94
+ # Crawlers - Built-in out-of box working crawlers
95
+ ############################################################
96
+ CRAWLERS_DIR = File.join(File.dirname(__FILE__), "crawler")
97
+
98
+ # Template used for generated crawlers
99
+ CRAWLER_TEMPLATE_NAME = "crawler_template.trb"
91
100
 
92
- # Path of template
93
- CRAWLER_TEMPLATE_PATH = File.join(CRAWLERS_DIR, CRAWLER_TEMPLATE_NAME)
101
+ # Path of template
102
+ CRAWLER_TEMPLATE_PATH = File.join(CRAWLERS_DIR, CRAWLER_TEMPLATE_NAME)
94
103
 
95
104
 
96
105
 
97
- ############################################################
98
- # Fetchers - used for fetching documents
99
- ############################################################
100
- FETCHERS_DIR = File.join(File.dirname(__FILE__), "fetcher")
101
-
102
- DEFAULT_FETCHER = Apollo::Fetcher::SmartFetcher
106
+ ############################################################
107
+ # Fetchers - used for fetching documents
108
+ ############################################################
109
+ FETCHERS_DIR = File.join(File.dirname(__FILE__), "fetcher")
110
+
111
+ DEFAULT_FETCHER = Apollo::Fetcher::SmartFetcher
103
112
 
104
113
 
105
- ############################################################
106
- # Formatters - used for formatting crawled documents results
107
- ############################################################
108
- FORMATTERS_DIR = File.join(File.dirname(__FILE__), "formatter")
114
+ ############################################################
115
+ # Formatters - used for formatting crawled documents results
116
+ ############################################################
117
+ FORMATTERS_DIR = File.join(File.dirname(__FILE__), "formatter")
109
118
 
110
- # Default formatter if no other specified
111
- DEFAULT_FORMATTER = Apollo::Formatter::JsonFormatter
119
+ # Default formatter if no other specified
120
+ DEFAULT_FORMATTER = Apollo::Formatter::JsonFormatter
112
121
 
113
122
 
114
123
 
115
- ############################################################
116
- # Loggers - used for formatting output messages
117
- ############################################################
118
- DEFAULT_LOGGER = Apollo::Logger::ConsoleLogger
119
- end # Config
124
+ ############################################################
125
+ # Loggers - used for formatting output messages
126
+ ############################################################
127
+ DEFAULT_LOGGER = Apollo::Logger::ConsoleLogger
128
+ end # Config
129
+ end
@@ -1,3 +1,23 @@
1
+ # Copyright, 2013, by Tomas Korcak. <korczis@gmail.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
1
21
  require File.join(File.dirname(__FILE__), 'base_crawler')
2
22
  require File.join(File.dirname(__FILE__), 'google_crawler')
3
23
  require File.join(File.dirname(__FILE__), 'hacker_news_crawler')
@@ -35,7 +35,7 @@ module Apollo
35
35
 
36
36
  def extract_data(doc)
37
37
  res = doc.xpath(@@MATCHER_ITEM).map { | node |
38
- url = BaseCrawler.try_get_url(self.url, node['href'])
38
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
39
39
  next if url.nil?
40
40
 
41
41
  {
@@ -47,7 +47,7 @@ module Apollo
47
47
 
48
48
  def extract_links(doc)
49
49
  res = doc.xpath("(//td[@class = 'b']/a)[last()]").map { | node |
50
- res_doc = BaseCrawler.try_get_url(self.url, node['href'])
50
+ res_doc = BaseCrawler.try_get_url(self.url, node['href']).to_s
51
51
  next if url.nil?
52
52
 
53
53
  {
@@ -35,7 +35,7 @@ module Apollo
35
35
 
36
36
  def extract_data(doc)
37
37
  res = doc.xpath(@@MATCHER_ITEM).map { |node|
38
- url = BaseCrawler.try_get_url(self.url, node['href'])
38
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
39
39
  next if url.nil?
40
40
 
41
41
  {
@@ -49,7 +49,7 @@ module Apollo
49
49
 
50
50
  def extract_links(doc)
51
51
  res = doc.xpath("(//td[@class = 'title']/a)[last()]").map { |node|
52
- url = BaseCrawler.try_get_url(self.url, node['href'])
52
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
53
53
  next if url.nil?
54
54
 
55
55
  {
@@ -35,7 +35,7 @@ module Apollo
35
35
 
36
36
  def extract_data(doc)
37
37
  res = doc.xpath(@@MATCHER_ITEM).map { | node |
38
- url = BaseCrawler.try_get_url(self.url, node['href'])
38
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
39
39
  next if url.nil?
40
40
 
41
41
  {
@@ -47,7 +47,7 @@ module Apollo
47
47
 
48
48
  def extract_links(doc)
49
49
  res = doc.xpath(@@MATCHER_ITEM).map { | node |
50
- url = BaseCrawler.try_get_url(self.url, node['href'])
50
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
51
51
  next if url.nil?
52
52
 
53
53
  {
@@ -35,7 +35,7 @@ module Apollo
35
35
 
36
36
  def extract_data(doc)
37
37
  res = doc.xpath(@@MATCHER_ITEM).map { |node|
38
- url = BaseCrawler.try_get_url(self.url, node['href'])
38
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
39
39
  next if url.nil?
40
40
 
41
41
  {
@@ -49,7 +49,7 @@ module Apollo
49
49
 
50
50
  def extract_links(doc)
51
51
  res = doc.xpath("(//div[@class = 'pager fl']/a)[last()]").map { |node|
52
- url = BaseCrawler.try_get_url(self.url, node['href'])
52
+ url = BaseCrawler.try_get_url(self.url, node['href']).to_s
53
53
  next if url.nil?
54
54
 
55
55
  {
@@ -37,7 +37,7 @@ module Apollo
37
37
  res = doc.xpath(@@MATCHER_ITEM).map { |node|
38
38
  {
39
39
  :text => node['title'],
40
- :link => URI.join(self.url, node['src']),
40
+ :link => URI.join(self.url, node['src']).to_s
41
41
  }
42
42
  }
43
43
  end
@@ -45,7 +45,7 @@ module Apollo
45
45
  def extract_links(doc)
46
46
  res = doc.xpath("//ul[@class = 'comicNav']/li/a[@accesskey = 'p']").map { |node|
47
47
  {
48
- :link => URI.join(self.url, node['href']),
48
+ :link => URI.join(self.url, node['href']).to_s
49
49
  }
50
50
  }
51
51
  res.uniq
@@ -33,7 +33,7 @@ module Apollo
33
33
 
34
34
  def extract_data(doc)
35
35
  res = doc.xpath(@@MATCHER_ITEM).map { | node |
36
- link = BaseCrawler.try_get_url(self.url, node['href'])
36
+ link = BaseCrawler.try_get_url(self.url, node['href']).to_s
37
37
  next if link.nil?
38
38
 
39
39
  {
@@ -45,7 +45,7 @@ module Apollo
45
45
 
46
46
  def extract_links(doc)
47
47
  res = doc.xpath("//div[@id = 'pagination']/a").map { | node |
48
- link = BaseCrawler.try_get_url(self.url, node['href'])
48
+ link = BaseCrawler.try_get_url(self.url, node['href']).to_s
49
49
  next if link.nil?
50
50
 
51
51
  {
@@ -0,0 +1,24 @@
1
+ # Copyright, 2013, by Tomas Korcak. <korczis@gmail.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ module Apollo
22
+ ENV = "development"
23
+ BASE_DIR = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
24
+ end
@@ -35,7 +35,7 @@ module Apollo
35
35
  }
36
36
  end
37
37
 
38
- def self.fetch(url)
38
+ def self.fetch(url, options = {})
39
39
  uri = URI.parse(url.to_s)
40
40
 
41
41
  # See https://github.com/lostisland/faraday
@@ -1,3 +1,23 @@
1
+ # Copyright, 2013, by Tomas Korcak. <korczis@gmail.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
1
21
  require File.join(File.dirname(__FILE__), 'base_fetcher')
2
22
  require File.join(File.dirname(__FILE__), 'simple_fetcher')
3
23
  require File.join(File.dirname(__FILE__), 'smart_fetcher')
@@ -26,7 +26,7 @@ require File.join(File.dirname(__FILE__), 'base_fetcher')
26
26
  module Apollo
27
27
  module Fetcher
28
28
  class SimpleFetcher < BaseFetcher
29
- def self.fetch(url)
29
+ def self.fetch(url, options = {})
30
30
  # TODO: Throw exception ???
31
31
  return BaseFetcher::fetch(url)
32
32
  end
@@ -29,7 +29,7 @@ module Apollo
29
29
  @@DEFAULT_SLEEP = 0.1
30
30
  @@LAST_FETCH = nil
31
31
 
32
- def self.fetch(url)
32
+ def self.fetch(url, options = {})
33
33
  # TODO: Throw exception ???
34
34
  if(@@LAST_FETCH != nil)
35
35
  now = DateTime.now
@@ -1,3 +1,23 @@
1
+ # Copyright, 2013, by Tomas Korcak. <korczis@gmail.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
1
21
  require File.join(File.dirname(__FILE__), 'base_formatter')
2
22
  require File.join(File.dirname(__FILE__), 'json_formatter')
3
23
  require File.join(File.dirname(__FILE__), 'plain_formatter')
@@ -25,8 +25,12 @@ require File.join(File.dirname(__FILE__), 'base_formatter')
25
25
  module Apollo
26
26
  module Formatter
27
27
  class JsonFormatter < BaseFormatter
28
+ def name()
29
+ return "JSON"
30
+ end
31
+
28
32
  def format(obj)
29
- return Json.format(obj)
33
+ return JsonFormatter.format(obj)
30
34
  end
31
35
 
32
36
  def self.format(obj)