npr 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. data/.travis.yml +13 -0
  2. data/{LICENSE → MIT-LICENSE} +1 -1
  3. data/README.md +115 -3
  4. data/Rakefile +6 -0
  5. data/gemfiles/Gemfile.rb-1.8.7 +6 -0
  6. data/lib/npr/api/client.rb +87 -0
  7. data/lib/npr/api/message.rb +38 -0
  8. data/lib/npr/api/query_builder.rb +222 -0
  9. data/lib/npr/api/response.rb +32 -0
  10. data/lib/npr/api.rb +7 -0
  11. data/lib/npr/concern/attr_typecast.rb +59 -0
  12. data/lib/npr/concern/relation.rb +103 -0
  13. data/lib/npr/concern/shallow_attributes.rb +71 -0
  14. data/lib/npr/concern.rb +9 -0
  15. data/lib/npr/configuration.rb +120 -0
  16. data/lib/npr/core_ext/array/wrap.rb +15 -0
  17. data/lib/npr/entity/audio.rb +28 -0
  18. data/lib/npr/entity/author.rb +22 -0
  19. data/lib/npr/entity/base.rb +19 -0
  20. data/lib/npr/entity/book.rb +21 -0
  21. data/lib/npr/entity/book_edition.rb +26 -0
  22. data/lib/npr/entity/byline.rb +18 -0
  23. data/lib/npr/entity/collection.rb +11 -0
  24. data/lib/npr/entity/crop.rb +20 -0
  25. data/lib/npr/entity/enlargement.rb +20 -0
  26. data/lib/npr/entity/formats.rb +19 -0
  27. data/lib/npr/entity/image.rb +33 -0
  28. data/lib/npr/entity/intro_text.rb +21 -0
  29. data/lib/npr/entity/link.rb +23 -0
  30. data/lib/npr/entity/list.rb +28 -0
  31. data/lib/npr/entity/list_text.rb +19 -0
  32. data/lib/npr/entity/member.rb +23 -0
  33. data/lib/npr/entity/member_byline.rb +17 -0
  34. data/lib/npr/entity/member_promo_art.rb +17 -0
  35. data/lib/npr/entity/mp3.rb +23 -0
  36. data/lib/npr/entity/organization.rb +18 -0
  37. data/lib/npr/entity/paragraph.rb +27 -0
  38. data/lib/npr/entity/permissions.rb +18 -0
  39. data/lib/npr/entity/program.rb +24 -0
  40. data/lib/npr/entity/promo_art.rb +17 -0
  41. data/lib/npr/entity/promo_art_book_edition.rb +18 -0
  42. data/lib/npr/entity/provider.rb +23 -0
  43. data/lib/npr/entity/pull_quote.rb +16 -0
  44. data/lib/npr/entity/related_link.rb +21 -0
  45. data/lib/npr/entity/show.rb +19 -0
  46. data/lib/npr/entity/story.rb +179 -0
  47. data/lib/npr/entity/text.rb +22 -0
  48. data/lib/npr/entity/title.rb +21 -0
  49. data/lib/npr/entity/transcript.rb +16 -0
  50. data/lib/npr/entity.rb +7 -0
  51. data/lib/npr/errors.rb +17 -0
  52. data/lib/npr/version.rb +1 -1
  53. data/lib/npr.rb +64 -3
  54. data/npr.gemspec +12 -2
  55. data/spec/fixtures/README.md +30 -0
  56. data/spec/fixtures/atom/01_story_full_media.atom +36 -0
  57. data/spec/fixtures/atom/02_story_multiple_images.atom +32 -0
  58. data/spec/fixtures/atom/03_no_results.atom +10 -0
  59. data/spec/fixtures/atom/04_invalid_id.atom +344 -0
  60. data/spec/fixtures/atom/05_no_api_key.atom +9 -0
  61. data/spec/fixtures/atom/06_story_multiple_ids.atom +59 -0
  62. data/spec/fixtures/fetch_formats.rb +65 -0
  63. data/spec/fixtures/html/01_story_full_media.html +54 -0
  64. data/spec/fixtures/html/02_story_multiple_images.html +55 -0
  65. data/spec/fixtures/html/03_no_results.html +38 -0
  66. data/spec/fixtures/html/04_invalid_id.html +82 -0
  67. data/spec/fixtures/html/05_no_api_key.html +8 -0
  68. data/spec/fixtures/html/06_story_multiple_ids.html +69 -0
  69. data/spec/fixtures/js/01_story_full_media.js +1 -0
  70. data/spec/fixtures/js/02_story_multiple_images.js +1 -0
  71. data/spec/fixtures/js/03_no_results.js +1 -0
  72. data/spec/fixtures/js/04_invalid_id.js +1 -0
  73. data/spec/fixtures/js/05_no_api_key.js +8 -0
  74. data/spec/fixtures/js/06_story_multiple_ids.js +1 -0
  75. data/spec/fixtures/json/01_story_full_media.json +1 -0
  76. data/spec/fixtures/json/02_story_multiple_images.json +1 -0
  77. data/spec/fixtures/json/03_no_results.json +1 -0
  78. data/spec/fixtures/json/04_invalid_id.json +1 -0
  79. data/spec/fixtures/json/05_no_api_key.json +1 -0
  80. data/spec/fixtures/json/06_story_multiple_ids.json +1 -0
  81. data/spec/fixtures/json/list.json +1 -0
  82. data/spec/fixtures/mediarss/01_story_full_media.rss +31 -0
  83. data/spec/fixtures/mediarss/02_story_multiple_images.rss +40 -0
  84. data/spec/fixtures/mediarss/03_no_results.rss +17 -0
  85. data/spec/fixtures/mediarss/04_invalid_id.rss +279 -0
  86. data/spec/fixtures/mediarss/05_no_api_key.rss +31 -0
  87. data/spec/fixtures/mediarss/06_story_multiple_ids.rss +65 -0
  88. data/spec/fixtures/nprml/01_story_full_media.xml +271 -0
  89. data/spec/fixtures/nprml/02_story_multiple_images.xml +165 -0
  90. data/spec/fixtures/nprml/03_no_results.xml +14 -0
  91. data/spec/fixtures/nprml/04_invalid_id.xml +1780 -0
  92. data/spec/fixtures/nprml/05_no_api_key.xml +9 -0
  93. data/spec/fixtures/nprml/06_story_multiple_ids.xml +435 -0
  94. data/spec/fixtures/nprml/list.xml +440 -0
  95. data/spec/fixtures/podcast/01_story_full_media.rss +30 -0
  96. data/spec/fixtures/podcast/02_story_multiple_images.rss +32 -0
  97. data/spec/fixtures/podcast/03_no_results.rss +19 -0
  98. data/spec/fixtures/podcast/04_invalid_id.rss +186 -0
  99. data/spec/fixtures/podcast/05_no_api_key.rss +31 -0
  100. data/spec/fixtures/podcast/06_story_multiple_ids.rss +43 -0
  101. data/spec/fixtures/rss/01_story_full_media.rss +25 -0
  102. data/spec/fixtures/rss/02_story_multiple_images.rss +25 -0
  103. data/spec/fixtures/rss/03_no_results.rss +17 -0
  104. data/spec/fixtures/rss/04_invalid_id.rss +137 -0
  105. data/spec/fixtures/rss/05_no_api_key.rss +31 -0
  106. data/spec/fixtures/rss/06_story_multiple_ids.rss +33 -0
  107. data/spec/spec_helper.rb +23 -0
  108. data/spec/support/config_helper.rb +64 -0
  109. data/spec/support/fake_response.rb +54 -0
  110. data/spec/support/fixture_helper.rb +23 -0
  111. data/spec/unit/api/client_spec.rb +42 -0
  112. data/spec/unit/api/message_spec.rb +68 -0
  113. data/spec/unit/api/query_builder_spec.rb +195 -0
  114. data/spec/unit/api/response_spec.rb +45 -0
  115. data/spec/unit/configuration_spec.rb +63 -0
  116. data/spec/unit/entity/audio_spec.rb +75 -0
  117. data/spec/unit/entity/author_spec.rb +30 -0
  118. data/spec/unit/entity/base_spec.rb +87 -0
  119. data/spec/unit/entity/book_edition_spec.rb +57 -0
  120. data/spec/unit/entity/book_spec.rb +31 -0
  121. data/spec/unit/entity/byline_spec.rb +23 -0
  122. data/spec/unit/entity/collection_spec.rb +39 -0
  123. data/spec/unit/entity/crop_spec.rb +25 -0
  124. data/spec/unit/entity/englargement_spec.rb +21 -0
  125. data/spec/unit/entity/formats_spec.rb +41 -0
  126. data/spec/unit/entity/image_spec.rb +82 -0
  127. data/spec/unit/entity/intro_text_spec.rb +25 -0
  128. data/spec/unit/entity/link_spec.rb +25 -0
  129. data/spec/unit/entity/list_spec.rb +22 -0
  130. data/spec/unit/entity/list_text_spec.rb +31 -0
  131. data/spec/unit/entity/member_byline_spec.rb +21 -0
  132. data/spec/unit/entity/member_promo_art_spec.rb +21 -0
  133. data/spec/unit/entity/member_spec.rb +59 -0
  134. data/spec/unit/entity/mp3_spec.rb +25 -0
  135. data/spec/unit/entity/organization_spec.rb +29 -0
  136. data/spec/unit/entity/paragraph_spec.rb +25 -0
  137. data/spec/unit/entity/permissions_spec.rb +56 -0
  138. data/spec/unit/entity/program_spec.rb +27 -0
  139. data/spec/unit/entity/promo_art_book_edition_spec.rb +21 -0
  140. data/spec/unit/entity/promo_art_spec.rb +42 -0
  141. data/spec/unit/entity/pull_quote_spec.rb +29 -0
  142. data/spec/unit/entity/related_link_spec.rb +55 -0
  143. data/spec/unit/entity/show_spec.rb +41 -0
  144. data/spec/unit/entity/story_spec.rb +154 -0
  145. data/spec/unit/entity/text_spec.rb +54 -0
  146. data/spec/unit/entity/title_spec.rb +25 -0
  147. data/spec/unit/entity/transcript_spec.rb +22 -0
  148. metadata +340 -8
@@ -0,0 +1,17 @@
1
+ ##
2
+ # NPR::Entity::MemberByline
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class MemberByline < Base
7
+ attr_accessor :refId, :num
8
+
9
+ #-------------------
10
+
11
+ def initialize(json)
12
+ @refId = json["refId"].to_i
13
+ @num = json["num"].to_i
14
+ end
15
+ end # MemberByline
16
+ end # Entity
17
+ end # NPR
@@ -0,0 +1,17 @@
1
+ ##
2
+ # NPR::Entity::MemberPromoArt
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class MemberPromoArt < Base
7
+ attr_accessor :refId, :num
8
+
9
+ #-------------------
10
+
11
+ def initialize(json)
12
+ @refId = json["refId"].to_i
13
+ @num = json["num"].to_i
14
+ end
15
+ end # MemberPromoArt
16
+ end # Entity
17
+ end # NPR
@@ -0,0 +1,23 @@
1
+ ##
2
+ # NPR::Entity::MP3
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class MP3 < Base
7
+ attr_accessor :type, :content
8
+
9
+ #-----------------
10
+
11
+ def initialize(json)
12
+ @type = json["type"]
13
+ @content = json["$text"]
14
+ end
15
+
16
+ #-----------------
17
+
18
+ def to_s
19
+ @content
20
+ end
21
+ end # MP3
22
+ end # Entity
23
+ end # NPR
@@ -0,0 +1,18 @@
1
+ ##
2
+ # NPR::Entity::Organization
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Organization < Base
7
+ attr_accessor :orgId, :orgAbbr
8
+ shallow_attribute "name", "website"
9
+
10
+ def initialize(json)
11
+ extract_shallow_attributes(json)
12
+
13
+ @orgId = json["orgId"].to_i
14
+ @orgAbbr = json["orgAbbr"]
15
+ end
16
+ end # Organization
17
+ end # Entity
18
+ end # NPR
@@ -0,0 +1,27 @@
1
+ ##
2
+ # NPR::Entity::Paragraph
3
+ #
4
+ # NPR splits every paragraph into separate
5
+ # database entries. This object will represent
6
+ # a single paragraph for a story.
7
+ #
8
+ module NPR
9
+ module Entity
10
+ class Paragraph < Base
11
+ attr_accessor :num, :content
12
+
13
+ #---------------------
14
+
15
+ def initialize(json)
16
+ @content = json["$text"]
17
+ @num = json["num"].to_i
18
+ end
19
+
20
+ #---------------------
21
+
22
+ def to_s
23
+ @content
24
+ end
25
+ end # Paragraph
26
+ end # Entity
27
+ end # NPR
@@ -0,0 +1,18 @@
1
+ ##
2
+ # NPR::Entity::Permissions
3
+ #
4
+ # Audio permissions
5
+ #
6
+ module NPR
7
+ module Entity
8
+ class Permissions < Base
9
+ attr_accessor :download, :stream, :embed
10
+
11
+ def initialize(json)
12
+ @download = json["download"]["allow"] == "true" if json["download"]
13
+ @stream = json["stream"]["allow"] == "true" if json["stream"]
14
+ @embed = json["embed"]["allow"] == "true" if json["embed"]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ ##
2
+ # NPR::Entity::Program
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Program < Base
7
+ attr_accessor :id, :code, :content
8
+
9
+ #---------------------
10
+
11
+ def initialize(json)
12
+ @id = json["id"].to_i
13
+ @content = json["$text"]
14
+ @code = json["code"]
15
+ end
16
+
17
+ #---------------------
18
+
19
+ def to_s
20
+ @content
21
+ end
22
+ end # Program
23
+ end # Entity
24
+ end # NPR
@@ -0,0 +1,17 @@
1
+ ##
2
+ # NPR::Entity::PromoArt
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class PromoArt < Image
7
+ attr_accessor :bookEditionId
8
+
9
+ #--------------------
10
+
11
+ def initialize(json)
12
+ @bookEditionId = json["bookEditionId"].to_i
13
+ super
14
+ end
15
+ end # PromoArt
16
+ end # Entity
17
+ end # NPR
@@ -0,0 +1,18 @@
1
+ ##
2
+ # NPR::Entity::PromoArtBookEdition
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class PromoArtBookEdition < Base
7
+ attr_accessor :refId, :num
8
+
9
+ #-------------------
10
+
11
+ def initialize(json)
12
+ @refId = json["refId"].to_i
13
+ @num = json["num"].to_i
14
+ end
15
+ end # PromoArtBookEdition
16
+ end # Entity
17
+ end # NPR
18
+
@@ -0,0 +1,23 @@
1
+ ##
2
+ # NPR::Entity::Provider
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Provider < Base
7
+ attr_accessor :content, :url
8
+
9
+ #----------------
10
+
11
+ def initialize(json)
12
+ @content = json["$text"]
13
+ @url = json["url"]
14
+ end
15
+
16
+ #----------------
17
+
18
+ def to_s
19
+ @content
20
+ end
21
+ end # Provider
22
+ end # Entity
23
+ end # NPR
@@ -0,0 +1,16 @@
1
+ ##
2
+ # NPR::Entity::PullQuote
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class PullQuote < Base
7
+ attr_accessor :id
8
+ shallow_attribute "text", "person", "date"
9
+
10
+ def initialize(json)
11
+ extract_shallow_attributes(json)
12
+ @id = json["id"].to_i
13
+ end
14
+ end # PullQuote
15
+ end # Entity
16
+ end # NPR
@@ -0,0 +1,21 @@
1
+ ##
2
+ # NPR::Entity::RelatedLink
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class RelatedLink < Base
7
+ attr_accessor :id, :type
8
+
9
+ has_many "links", :key => "link", :class_name => NPR::Entity::Link
10
+ shallow_attribute "caption"
11
+
12
+ def initialize(json)
13
+ extract_shallow_attributes(json)
14
+ create_relations(json)
15
+
16
+ @id = json["id"].to_i
17
+ @type = json["type"]
18
+ end
19
+ end # RelatedLink
20
+ end # Entity
21
+ end # NPR
@@ -0,0 +1,19 @@
1
+ ##
2
+ # NPR::Entity::Show
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Show < Base
7
+ attr_accessor :program
8
+ shallow_attribute "showDate", "segNum"
9
+
10
+ def initialize(json)
11
+ extract_shallow_attributes(json)
12
+
13
+ if program = json["program"]
14
+ @program = NPR::Entity::Program.new(program)
15
+ end
16
+ end
17
+ end # Show
18
+ end # Entity
19
+ end # NPR
@@ -0,0 +1,179 @@
1
+ ##
2
+ # NPR::Entity::Story
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Story < Base
7
+ #-------------------------
8
+
9
+ class << self
10
+ #-------------------------
11
+ # Find a story based on ID
12
+ #
13
+ # This method is meant to be a quick, easy
14
+ # way to find a story just by its ID.
15
+ #
16
+ # If you need more control over what gets
17
+ # fetched and how, use NPR::Client directly,
18
+ # or the other chainable methods (+where+,
19
+ # +order+, etc.)
20
+ #
21
+ # It is not possible to pass options into this
22
+ # method. Therefore, you *must* globally
23
+ # configure at least the apiKey using
24
+ # +NPR.configure+.
25
+ #
26
+ # Example:
27
+ #
28
+ # NPR::Entity::Story.find(1000)
29
+ #
30
+ def find(id)
31
+ response = query_by_id(id)
32
+
33
+ if !response.messages.empty?
34
+ response.messages
35
+ else
36
+ response.list.stories.first
37
+ end
38
+ end
39
+
40
+ #-------------------------
41
+ # Same as above, but returns +nil+ if a single story isn't
42
+ # returned.
43
+ def find_by_id(id)
44
+ response = query_by_id(id)
45
+
46
+ if !response.messages.empty?
47
+ nil
48
+ else
49
+ response.list.stories.first
50
+ end
51
+ end
52
+
53
+ #-------------------------
54
+ # For each class builder method defined in NPR::API::QueryBuilder,
55
+ # define a method on this class which initializes a new
56
+ # QueryBuilder and proxies to its corresponding method on
57
+ # Query Builder class.
58
+ #
59
+ # We could use ActiveSupport's delegation for this, but
60
+ # this is simple enough.
61
+ NPR::API::QueryBuilder::CLASS_BUILDER_METHODS.each do |method|
62
+ define_method method do |args|
63
+ NPR::API::QueryBuilder.new(self).send(method, args)
64
+ end
65
+ end
66
+
67
+ #-------------------------
68
+
69
+ private
70
+
71
+ def query_by_id(id)
72
+ client = NPR::API::Client.new(
73
+ :apiKey => NPR.config.apiKey,
74
+ :output => "json")
75
+
76
+ client.query(:id => id)
77
+ end
78
+ end
79
+
80
+ #-------------------------
81
+ # Association accessors
82
+
83
+ # Attributes that we are using as-is
84
+ # Use strings so that we don't have to
85
+ # convert between Strings and Symbols.
86
+ ATTR_AS_IS = [
87
+ "thumbnail",
88
+ "parent",
89
+ "container"
90
+ ]
91
+ attr_accessor *ATTR_AS_IS
92
+ attr_accessor :id, :text, :textWithHtml
93
+
94
+ #------------------
95
+
96
+ has_many "images", :key => "image", :class_name => NPR::Entity::Image
97
+ has_many "bylines", :key => "byline", :class_name => NPR::Entity::Byline
98
+ has_many "audio", :key => "audio", :class_name => NPR::Entity::Audio
99
+ has_many "organizations", :key => "organization", :class_name => NPR::Entity::Organization
100
+ has_many "links", :key => "link", :class_name => NPR::Entity::Link
101
+ has_many "related_links", :key => "relatedLink", :class_name => NPR::Entity::RelatedLink
102
+ has_many "pull_quotes", :key => "pullQuote", :class_name => NPR::Entity::PullQuote
103
+ has_many "shows", :key => "show", :class_name => NPR::Entity::Show
104
+ has_many "members", :key => "member", :class_name => NPR::Entity::Member
105
+ has_many "list_texts", :key => "listText", :class_name => NPR::Entity::ListText
106
+ has_many "promo_arts", :key => "promoArt", :class_name => NPR::Entity::PromoArt
107
+ has_many "book_editions", :key => "bookEdition", :class_name => NPR::Entity::BookEdition
108
+
109
+ has_one "transcript", :class_name => NPR::Entity::Transcript
110
+
111
+ #------------------
112
+
113
+ shallow_attribute(
114
+ "title",
115
+ "partnerId",
116
+ "subtitle",
117
+ "shortTitle",
118
+ "teaser",
119
+ "miniTeaser",
120
+ "slug",
121
+ "storyDate",
122
+ "pubDate",
123
+ "lastModifiedDate",
124
+ "keywords",
125
+ "priorityKeywords",
126
+ "fullText"
127
+ )
128
+
129
+ #-------------------------
130
+
131
+ def initialize(json)
132
+ @_json = json
133
+ @id = @_json["id"].to_i
134
+
135
+ build_text
136
+ extract_shallow_attributes(@_json)
137
+ create_relations(@_json)
138
+ end
139
+
140
+ #-------------------------
141
+ # The primary image. Looks at the "type" attribute on
142
+ # an image and finds any with type "primary". If none
143
+ # are found, then return the first image of any type.
144
+ def primary_image
145
+ @primary_image ||= begin
146
+ primary = self.images.find { |i| i["type"] == "primary"}
147
+ primary || self.images.first
148
+ end
149
+ end
150
+
151
+ #-------------------------
152
+
153
+ private
154
+
155
+ #-------------------------
156
+
157
+ def build_text
158
+ if @_json["text"]
159
+ @text = NPR::Entity::Text.new(@_json["text"])
160
+ end
161
+
162
+ if @_json["textWithHtml"]
163
+ @textWithHtml = NPR::Entity::Text.new(@_json["textWithHtml"])
164
+ end
165
+ end
166
+ end # Story
167
+ end # Entity
168
+
169
+ #-------------------------
170
+ # Alias
171
+ # This is a shorthand so that users of this library
172
+ # can work with just NPR::Story, but allowing us to
173
+ # keep everything organized properly.
174
+ #
175
+ # The other classes under Entity aren't part of the
176
+ # library's public API, so they don't need to be
177
+ # aliased.
178
+ Story = NPR::Entity::Story
179
+ end # NPR
@@ -0,0 +1,22 @@
1
+ ##
2
+ # NPR::Entity::Text
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Text < Base
7
+ has_many "paragraphs", :key => "paragraph", :class_name => NPR::Entity::Paragraph
8
+
9
+ #-----------------
10
+
11
+ def initialize(json)
12
+ create_relations(json)
13
+ end
14
+
15
+ #-----------------
16
+
17
+ def to_s
18
+ @paragraphs.map(&:to_s).join("\n")
19
+ end
20
+ end # Text
21
+ end # Entity
22
+ end # NPR
@@ -0,0 +1,21 @@
1
+ ##
2
+ # NPR::Entity::Title
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Title < Base
7
+ attr_accessor :num, :content
8
+
9
+ def initialize(json)
10
+ @num = json["num"].to_i
11
+ @content = json["$text"]
12
+ end
13
+
14
+ #--------------------
15
+
16
+ def to_s
17
+ @content
18
+ end
19
+ end # Title
20
+ end # Entity
21
+ end # NPR
@@ -0,0 +1,16 @@
1
+ ##
2
+ # NPR::Entity::Transcript
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Transcript < Base
7
+ has_one "link", :class_name => NPR::Entity::Link
8
+
9
+ #-------------------
10
+
11
+ def initialize(json)
12
+ create_relations(json)
13
+ end
14
+ end # Transcript
15
+ end # Entity
16
+ end # NPR
data/lib/npr/entity.rb ADDED
@@ -0,0 +1,7 @@
1
+ ##
2
+ # NPR::Entity
3
+ #
4
+ module NPR
5
+ module Entity
6
+ end # Entity
7
+ end # NPR
data/lib/npr/errors.rb ADDED
@@ -0,0 +1,17 @@
1
+ ##
2
+ # Errors
3
+ #
4
+ module NPR
5
+ class ClientError < StandardError
6
+ end
7
+
8
+ #-------------------
9
+
10
+ class ServerError < StandardError
11
+ end
12
+
13
+ #-------------------
14
+
15
+ class NotConfiguredError < ClientError
16
+ end
17
+ end # NPR
data/lib/npr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module NPR
2
- VERSION = "0.0.0"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/npr.rb CHANGED
@@ -1,5 +1,66 @@
1
- require "npr/version"
2
-
1
+ ##
2
+ # NPR
3
+ #
3
4
  module NPR
4
- # Your code goes here...
5
5
  end
6
+
7
+ #------------------
8
+ # Dependencies
9
+ require 'faraday'
10
+ require 'faraday_middleware'
11
+ require "npr/core_ext/array/wrap"
12
+
13
+ #------------------
14
+ # Internal
15
+ require "npr/version"
16
+ require "npr/configuration"
17
+ require "npr/errors"
18
+ require "npr/concern"
19
+ require "npr/concern/attr_typecast"
20
+ require "npr/concern/shallow_attributes"
21
+ require "npr/concern/relation"
22
+
23
+ #------------------
24
+ # API handlers
25
+ require "npr/api"
26
+ require "npr/api/query_builder"
27
+ require "npr/api/client"
28
+ require "npr/api/message"
29
+ require "npr/api/response"
30
+
31
+ #------------------
32
+ # NPR Entities
33
+ require "npr/entity"
34
+ require "npr/entity/base"
35
+ require "npr/entity/link"
36
+ require "npr/entity/paragraph"
37
+ require "npr/entity/organization"
38
+ require "npr/entity/transcript"
39
+ require "npr/entity/pull_quote"
40
+ require "npr/entity/related_link"
41
+ require "npr/entity/list_text"
42
+ require "npr/entity/author"
43
+ require "npr/entity/member_promo_art"
44
+ require "npr/entity/title"
45
+ require "npr/entity/intro_text"
46
+ require "npr/entity/member_byline"
47
+ require "npr/entity/promo_art_book_edition"
48
+ require "npr/entity/member"
49
+ require "npr/entity/collection"
50
+ require "npr/entity/provider"
51
+ require "npr/entity/enlargement"
52
+ require "npr/entity/crop"
53
+ require "npr/entity/image"
54
+ require "npr/entity/promo_art"
55
+ require "npr/entity/mp3"
56
+ require "npr/entity/formats"
57
+ require "npr/entity/permissions"
58
+ require "npr/entity/audio"
59
+ require "npr/entity/book"
60
+ require "npr/entity/book_edition"
61
+ require "npr/entity/byline"
62
+ require "npr/entity/program"
63
+ require "npr/entity/show"
64
+ require "npr/entity/text"
65
+ require "npr/entity/story"
66
+ require "npr/entity/list"
data/npr.gemspec CHANGED
@@ -4,8 +4,8 @@ require File.expand_path('../lib/npr/version', __FILE__)
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Bryan Ricker"]
6
6
  gem.email = ["bricker@scpr.org"]
7
- gem.description = %q{A Ruby client for the NPR API}
8
- gem.summary = %q{A simple Ruby client for the NPR API}
7
+ gem.description = %q{[NPR](http://npr.org) is a news organization. This gem helps you pull its content with a nice Ruby DSL. <http://www.npr.org/api/index>}
8
+ gem.summary = %q{A Ruby client for the NPR API}
9
9
  gem.homepage = "http://github.com/bricker88/npr"
10
10
 
11
11
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
@@ -14,4 +14,14 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "npr"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = NPR::VERSION
17
+
18
+ gem.licenses = ['MIT']
19
+
20
+ gem.add_dependency 'faraday', ['>= 0.8.0']
21
+ gem.add_dependency 'faraday_middleware', ['>= 0.9.0']
22
+
23
+ gem.add_development_dependency 'bundler', ['>= 1.0.0']
24
+ gem.add_development_dependency 'rake', ['>= 0']
25
+ gem.add_development_dependency 'rspec', ['>= 0']
26
+ gem.add_development_dependency 'fakeweb', ['>= 0']
17
27
  end
@@ -0,0 +1,30 @@
1
+ ## Fixture Index
2
+
3
+ * list - 3002 - All Topics
4
+ * 01 - 167019577 - Story with 1 Audio, 1 Image, 1 Byline
5
+ * 02 - 166884441 - Multiple Images
6
+ * 03 - 167016221 - No Results (404-ish)
7
+ * 04 - 00 - Invalid ID
8
+ * 05 - Missing API Key
9
+ * 06 - 167055503,166956822 - More than one ID returned (on purpose)
10
+
11
+ (awesome story: 166480907)
12
+
13
+ ## Adding more fixtures
14
+
15
+ `fetch_fixtures.rb` provides an easy way to pull a story
16
+ from the NPR API in all of the possible formats. This
17
+ allows us to more easily test edge cases. To use, run
18
+ from this directory (`spec/fixtures`):
19
+
20
+ ruby fetch_formats.rb --key "YOUR_API_KEY" --id 166946294 --filename 04_story_multiple_bylines
21
+
22
+ The arguments are:
23
+
24
+ ```
25
+ --key : Your API Key.
26
+ --id : The ID of the story that you want to pull
27
+ --filename : The filename that the responses will be
28
+ written to (in their respective format).
29
+ (No extension)
30
+ ```