npr 0.0.0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,103 @@
1
+ ##
2
+ # NPR::Concern::Relation
3
+ #
4
+ module NPR
5
+ module Concern
6
+ module Relation
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ #-----------------
12
+
13
+ module ClassMethods
14
+ #-----------------
15
+ # Define a relationship
16
+ # Similar to ActiveRecord's +has_many+
17
+ #
18
+ # Arguments:
19
+ #
20
+ # * name (String) - the name of the relation
21
+ # * options (Hash)
22
+ # * class_name (Class) - the class for the related objects
23
+ # * key (String) - the JSON key that holds this relation
24
+ #
25
+ # Example:
26
+ #
27
+ # has_many "links", key: "link", class_name: NPR::Entity::Link
28
+ #
29
+ def has_many(name, options)
30
+ relation = build_relation(name, options)
31
+
32
+ # Define getter and setter for this attribute
33
+ # Forces the relation into an empty array when
34
+ # it's first accessed.
35
+ attr_writer name
36
+ define_method name do
37
+ instance_variable_get("@#{name}") || instance_variable_set("@#{name}", [])
38
+ end
39
+
40
+ _has_many_relations.push relation
41
+ end
42
+
43
+ #-----------------
44
+
45
+ def has_one(name, options)
46
+ relation = build_relation(name, options)
47
+ attr_accessor name
48
+ _has_one_relations.push relation
49
+ end
50
+
51
+ #-----------------
52
+
53
+ def _has_many_relations
54
+ @_has_many_relations ||= []
55
+ end
56
+
57
+ def _has_one_relations
58
+ @_has_one_relations ||= []
59
+ end
60
+
61
+ #-----------------
62
+
63
+ private
64
+ attr_writer :_has_many_relations, :_has_one_relations
65
+
66
+ def build_relation(name, options)
67
+ relation = {
68
+ :name => name,
69
+ :class_name => options[:class_name],
70
+ :key => options[:key] || name
71
+ }
72
+ end
73
+ end
74
+
75
+
76
+ #-----------------
77
+
78
+ private
79
+
80
+ #-----------------
81
+ # Populate the relations based on
82
+ def create_relations(json)
83
+ self.class._has_many_relations.each do |relation|
84
+ collection = []
85
+
86
+ if node = json[relation[:key]]
87
+ node.each do |obj|
88
+ collection.push relation[:class_name].new(obj)
89
+ end
90
+ end
91
+
92
+ send "#{relation[:name]}=", collection
93
+ end
94
+
95
+ self.class._has_one_relations.each do |relation|
96
+ if node = json[relation[:key]]
97
+ send "#{relation[:name]}=", relation[:class_name].new(node)
98
+ end
99
+ end
100
+ end
101
+ end # Relation
102
+ end # Concern
103
+ end # NPR
@@ -0,0 +1,71 @@
1
+ ##
2
+ # NPR::Concern::ShallowAttributes
3
+ #
4
+ # A "shallow attribute" is one that only contains the "$text"
5
+ # node. Use this class method to define which attributes those
6
+ # are.
7
+ #
8
+ # Example:
9
+ #
10
+ # { "link": { "$text": "www.google.com" } }
11
+ #
12
+ # shallow_attribute "link"
13
+ #
14
+ module NPR
15
+ module Concern
16
+ module ShallowAttributes
17
+ include AttrTypecast
18
+
19
+ def self.included(base)
20
+ base.extend ClassMethods
21
+ end
22
+
23
+ #-----------------
24
+
25
+ module ClassMethods
26
+ def shallow_attribute(*attrs)
27
+ _shallow_attributes.push *attrs
28
+ attr_accessor *attrs
29
+ end
30
+
31
+ #-----------------
32
+
33
+ def _shallow_attributes
34
+ @shallow_attributes ||= []
35
+ end
36
+
37
+ #-----------------
38
+
39
+ private
40
+ attr_writer :_shallow_attributes
41
+ end
42
+
43
+ #-----------------
44
+
45
+ private
46
+
47
+ #-----------------
48
+ # Extract the defined shallow_attributes from the JSON
49
+ # and set the corresponding attribute.
50
+ #
51
+ # If the JSON doesn't contain a key for an attribute,
52
+ # then attribute will remain at its default state (nil).
53
+ #
54
+ # Arguments: Hash of the JSON for this object
55
+ #
56
+ # Example:
57
+ #
58
+ # def initialize(json)
59
+ # extract_shallow_attributes(json)
60
+ # end
61
+ #
62
+ def extract_shallow_attributes(json)
63
+ self.class._shallow_attributes.each do |key|
64
+ if node = json[key]
65
+ send "#{key}=", attr_typecast(key, node["$text"].to_s)
66
+ end
67
+ end
68
+ end
69
+ end # ShallowAttribute
70
+ end # Concern
71
+ end # NPR
@@ -0,0 +1,9 @@
1
+ ##
2
+ # NPR::Concern
3
+ #
4
+ # A set of modules to mix in to other classes
5
+ #
6
+ module NPR
7
+ module Concern
8
+ end # Concern
9
+ end # NPR
@@ -0,0 +1,120 @@
1
+ ##
2
+ # NPR::Configuration
3
+ #
4
+ module NPR
5
+ #-------------------
6
+ # Pass a block to configure NPR client globally.
7
+ #
8
+ # Options configured globally will be
9
+ # passed in to every API request. They can
10
+ # still be overridden on a per-query or per-client
11
+ # basis.
12
+ #
13
+ # Example:
14
+ #
15
+ # NPR.configure do |config|
16
+ # config.apiKey = "YOUR_API_KEY"
17
+ # config.sort = "date descending"
18
+ # config.output = "NPRML"
19
+ # config.requiredAssets = "text"
20
+ # end
21
+ #
22
+ def self.configure
23
+ yield config
24
+ end
25
+
26
+ #-------------------
27
+
28
+ def self.config
29
+ @config ||= NPR::Configuration.new
30
+ end
31
+
32
+ #-------------------
33
+ # NPR::Configuration
34
+ #
35
+ # Probably doesn't need to be accessed directly.
36
+ # You can get the global configuration for the NPR
37
+ # gem by accessing +NPR.config+
38
+ #
39
+ class Configuration
40
+ API_ROOT = "http://api.npr.org"
41
+
42
+ API_QUERY_PATH = "/query"
43
+ API_LIST_PATH = "/list"
44
+
45
+ # List all the parameters that the NPR API
46
+ # can accept. Some are left out that don't
47
+ # make sense to globally configure (such as
48
+ # +:id+, +:startNum+, and +:callback+)
49
+ API_OPTIONS = [
50
+ # List options
51
+ :storyCountAll,
52
+ :storyCountMonth,
53
+ :storyCountToday,
54
+ :childrenOf,
55
+ :hideChildren,
56
+
57
+ # Story options
58
+ :apiKey,
59
+ :orgId,
60
+ :meta,
61
+ :output,
62
+ :fields,
63
+ :sort,
64
+ :numResults,
65
+ :action,
66
+ :requiredAssets,
67
+ :date,
68
+ :startDate,
69
+ :endDate,
70
+ :dateType,
71
+ :searchTerm,
72
+ :searchType,
73
+ :title
74
+ ]
75
+
76
+ attr_accessor *API_OPTIONS
77
+
78
+ #-------------------
79
+ # You can pass in a hash of options to
80
+ # Configuration.new
81
+ def initialize(options={})
82
+ options.each do |key, value|
83
+ send "#{key}=", value
84
+ end
85
+ end
86
+
87
+ #-------------------
88
+ # Convenience method
89
+ def merge(hash)
90
+ to_hash.merge hash
91
+ end
92
+
93
+ #-------------------
94
+ # Convert this Configuration object into a Hash
95
+ #
96
+ # Why don't we inherit from OrderedOptions?
97
+ #
98
+ # Since the API options are out of our control
99
+ # (without having to map every API option to
100
+ # internal methods), it is possible that one
101
+ # of the config options will conflict with
102
+ # something in Ruby. For example, the "sort"
103
+ # option that the NPR API allows would mean
104
+ # we'd have to overwrite Ruby's Hash#sort
105
+ # method.
106
+ #
107
+ # We *could* just map out config options to
108
+ # the API options, but I think it's more
109
+ # important to keep the gem config options
110
+ # in perfect sync with the API options.
111
+ #
112
+ def to_hash
113
+ hash = {}
114
+ instance_variables.each do |var|
115
+ hash[var[1..-1].to_sym] = instance_variable_get(var)
116
+ end
117
+ hash
118
+ end
119
+ end # Configuration
120
+ end # NPR
@@ -0,0 +1,15 @@
1
+ ##
2
+ # Copied directly from ActiveSupport
3
+ # <https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/array/wrap.rb>
4
+ #
5
+ class Array
6
+ def self.wrap(object)
7
+ if object.nil?
8
+ []
9
+ elsif object.respond_to?(:to_ary)
10
+ object.to_ary || [object]
11
+ else
12
+ [object]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,28 @@
1
+ ##
2
+ # NPR::Entity::Audio
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Audio < Base
7
+ attr_accessor :id, :type, :stream
8
+ shallow_attribute "title", "duration", "description", "rightsHolder"
9
+ has_one "permissions", :class_name => NPR::Entity::Permissions
10
+ has_one "formats", :key => "format", :class_name => NPR::Entity::Formats
11
+
12
+ #-------------------
13
+ # +stream+ returns true if "active" is set to "true"
14
+ #
15
+ def initialize(json)
16
+ @id = json["id"].to_i
17
+ @type = json["type"]
18
+
19
+ if json["stream"]
20
+ @stream = json["stream"]["active"] == "true"
21
+ end
22
+
23
+ create_relations(json)
24
+ extract_shallow_attributes(json)
25
+ end
26
+ end # Audio
27
+ end # Entity
28
+ end # NPR
@@ -0,0 +1,22 @@
1
+ ##
2
+ # NPR::Entity::Author
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Author < Base
7
+ attr_accessor :id, :num
8
+ shallow_attribute "title"
9
+ has_one "link", :class_name => NPR::Entity::Link
10
+
11
+ #-----------------
12
+
13
+ def initialize(json)
14
+ @id = json["id"].to_i
15
+ @num = json["num"].to_i
16
+
17
+ create_relations(json)
18
+ extract_shallow_attributes(json)
19
+ end
20
+ end # Author
21
+ end # Entity
22
+ end # NPR
@@ -0,0 +1,19 @@
1
+ ##
2
+ # NPR::Entity::Base
3
+ #
4
+ # Class for all NPR Objects to inherit from
5
+ #
6
+ module NPR
7
+ module Entity
8
+ class Base
9
+ include NPR::Concern::Relation
10
+ include NPR::Concern::ShallowAttributes
11
+
12
+ #-----------------
13
+ # Override this
14
+ def initialize(json={})
15
+ @_json = json
16
+ end
17
+ end # Base
18
+ end # Entity
19
+ end # NPR
@@ -0,0 +1,21 @@
1
+ ##
2
+ # NPR::Entity::Book
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Book < Base
7
+ attr_accessor :id
8
+ shallow_attribute "title"
9
+ has_one "link", :class_name => NPR::Entity::Link
10
+
11
+ #---------------------
12
+
13
+ def initialize(json)
14
+ @id = json["id"].to_i
15
+
16
+ extract_shallow_attributes(json)
17
+ create_relations(json)
18
+ end
19
+ end # Book
20
+ end # Entity
21
+ end # NPR
@@ -0,0 +1,26 @@
1
+ ##
2
+ # NPR::Entity::BookEdition
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class BookEdition < Base
7
+ attr_accessor :id, :format_num
8
+ shallow_attribute "isbn", "publisher", "pubDate", "pagination", "listPrice"
9
+ has_one "book", :class_name => NPR::Entity::Book
10
+
11
+ #---------------------
12
+ # Note that the "format" property is represented on this
13
+ # object as "format_num", because of Kernel's "format"
14
+ def initialize(json)
15
+ @id = json["id"].to_i
16
+
17
+ if json["format"]
18
+ @format_num = json["format"]["$text"].to_i
19
+ end
20
+
21
+ extract_shallow_attributes(json)
22
+ create_relations(json)
23
+ end
24
+ end # BookEdition
25
+ end # Entity
26
+ end # NPR
@@ -0,0 +1,18 @@
1
+ ##
2
+ # NPR::Entity::Byline
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Byline < Base
7
+ attr_accessor :id
8
+ shallow_attribute "name"
9
+
10
+ #-----------------
11
+
12
+ def initialize(json)
13
+ @id = json["id"].to_i
14
+ extract_shallow_attributes(json)
15
+ end
16
+ end # Byline
17
+ end # Entity
18
+ end # NPR
@@ -0,0 +1,11 @@
1
+ ##
2
+ # NPR::Entity::Collection
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Collection < Base
7
+ def initialize(json)
8
+ end
9
+ end # Collection
10
+ end # Entity
11
+ end # NPR
@@ -0,0 +1,20 @@
1
+ ##
2
+ # NPR::Entity::Crop
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Crop < Base
7
+ attr_accessor :type, :src, :width, :height
8
+
9
+ #---------------
10
+
11
+ def initialize(json)
12
+ @type = json["type"]
13
+ @src = json["src"]
14
+ @width = json["width"].to_i
15
+ @height = json["height"].to_i
16
+ end
17
+ end # Crop
18
+ end # Entity
19
+ end # NPR
20
+
@@ -0,0 +1,20 @@
1
+ ##
2
+ # NPR::Entity::Enlargement
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Enlargement < Base
7
+ attr_accessor :src
8
+ shallow_attribute "caption"
9
+
10
+ #---------------
11
+
12
+ def initialize(json)
13
+ @src = json["src"]
14
+ extract_shallow_attributes(json)
15
+ end
16
+ end # Enlargement
17
+ end # Entity
18
+ end # NPR
19
+
20
+
@@ -0,0 +1,19 @@
1
+ ##
2
+ # NPR::Entity::Formats
3
+ #
4
+ # Audio Formats
5
+ module NPR
6
+ module Entity
7
+ class Formats < Base
8
+ has_many "mp3s", :key => "mp3", :class_name => NPR::Entity::MP3
9
+ shallow_attribute "wm", "rm", "mediastream"
10
+
11
+ #--------------------
12
+
13
+ def initialize(json)
14
+ extract_shallow_attributes(json)
15
+ create_relations(json)
16
+ end
17
+ end # Formats
18
+ end # Entity
19
+ end # NPR
@@ -0,0 +1,33 @@
1
+ ##
2
+ # NPR::Entity::Image
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Image < Base
7
+ attr_accessor :id, :type, :width, :src, :hasBorder, :link
8
+ shallow_attribute "title", "caption", "producer", "copyright"
9
+ has_many "crops", :key => "crop", :class_name => NPR::Entity::Crop
10
+ has_one "enlargement", :class_name => NPR::Entity::Enlargement
11
+ has_one "provider", :class_name => NPR::Entity::Provider
12
+
13
+ #-------------
14
+ # NOTE that the "link" attribute here is not cast into a Link
15
+ # object, and the "url" parameter is ignored. Instead, just
16
+ # calling +image.link+ will return the URL parameter.
17
+ def initialize(json)
18
+ @id = json["id"].to_i
19
+ @type = json["type"]
20
+ @width = json["width"].to_i
21
+ @src = json["src"]
22
+ @hasBorder = json["hasBorder"] == "true"
23
+
24
+ if json["link"]
25
+ @link = json["link"]["url"]
26
+ end
27
+
28
+ extract_shallow_attributes(json)
29
+ create_relations(json)
30
+ end
31
+ end # Image
32
+ end # Entity
33
+ end # NPR
@@ -0,0 +1,21 @@
1
+ ##
2
+ # NPR::Entity::IntroText
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class IntroText < 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 # IntroText
20
+ end # Entity
21
+ end # NPR
@@ -0,0 +1,23 @@
1
+ ##
2
+ # NPR::Entity::Link
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Link < Base
7
+ attr_accessor :type, :content
8
+
9
+ #---------------------
10
+
11
+ def initialize(json)
12
+ @content = json["$text"]
13
+ @type = json["type"]
14
+ end
15
+
16
+ #---------------------
17
+
18
+ def to_s
19
+ @content
20
+ end
21
+ end # Link
22
+ end # Entity
23
+ end # NPR
@@ -0,0 +1,28 @@
1
+ ##
2
+ # NPR::Entity::List
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class List < Base
7
+ #------------------
8
+
9
+ has_many "links", :key => "link", :class_name => NPR::Entity::Link
10
+ has_many "stories", :key => "story", :class_name => NPR::Entity::Story
11
+
12
+ #------------------
13
+
14
+ shallow_attribute(
15
+ "title",
16
+ "teaser",
17
+ "miniTeaser"
18
+ )
19
+
20
+ #------------------
21
+
22
+ def initialize(json)
23
+ extract_shallow_attributes(json)
24
+ create_relations(json)
25
+ end
26
+ end # List
27
+ end # Entity
28
+ end # NPR
@@ -0,0 +1,19 @@
1
+ ##
2
+ # NPR::Entity::ListText
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class ListText < Base
7
+ attr_accessor :id, :tag
8
+ has_many "paragraphs", :key => "paragraph", :class_name => NPR::Entity::Paragraph
9
+
10
+ #-------------------
11
+
12
+ def initialize(json)
13
+ @id = json["id"].to_i
14
+ @tag = json["tag"]
15
+ create_relations(json)
16
+ end
17
+ end # ListText
18
+ end # Entity
19
+ end # NPR
@@ -0,0 +1,23 @@
1
+ ##
2
+ # NPR::Entity::Member
3
+ #
4
+ module NPR
5
+ module Entity
6
+ class Member < Base
7
+ attr_accessor :id
8
+ has_one "promoArt", :class_name => NPR::Entity::MemberPromoArt
9
+ has_one "title", :class_name => NPR::Entity::Title
10
+ has_one "author", :class_name => NPR::Entity::Author
11
+ has_one "bookEdition", :class_name => NPR::Entity::PromoArtBookEdition
12
+ has_one "introText", :class_name => NPR::Entity::IntroText
13
+ has_one "byline", :class_name => NPR::Entity::MemberByline
14
+
15
+ #------------------
16
+
17
+ def initialize(json)
18
+ @id = json["id"].to_i
19
+ create_relations(json)
20
+ end
21
+ end # Member
22
+ end # Entity
23
+ end # NPR