purdie 0.0.12 → 0.0.13

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -13
  3. data/Rakefile +6 -2
  4. data/features/comments.feature +2 -13
  5. data/features/duff-credentials.feature +2 -3
  6. data/features/flickr-album.feature +5 -0
  7. data/features/flickr-different-size.feature +1 -0
  8. data/features/flickr-with-lookups.feature +1 -0
  9. data/features/rfm.feature +5 -0
  10. data/features/select-file.feature +26 -24
  11. data/features/soundcloud-set.feature +2 -2
  12. data/features/support/fixtures/vcr.nope/A_URL_we_don_t_understand/Handle_a_URL_we_don_t_recognise.yml +125 -0
  13. data/features/support/fixtures/vcr.nope/First_contact_with_the_Real_World/Generate_YAML_for_the_Raw_Funk_Maharishi.yml +536 -0
  14. data/features/support/fixtures/vcr.nope/Flickr/Generate_Flickr_YAML.yml +131 -0
  15. data/features/support/fixtures/vcr.nope/Flickr/Generate_Flickr_YAML_with_lookups.yml +129 -0
  16. data/features/support/fixtures/vcr.nope/Flickr_album/Generate_Flickr_YAML_for_an_album.yml +2280 -0
  17. data/features/support/fixtures/vcr.nope/Handle_comments/Handle_comments_in_a_source_file.yml +131 -0
  18. data/features/support/fixtures/vcr.nope/Missing_or_bad_credentials/Bad_credentials_for_multiple_services.yml +156 -0
  19. data/features/support/fixtures/{vcr → vcr.nope}/Purdie/Generate_several_YAML.yml +0 -0
  20. data/features/support/fixtures/vcr.nope/Select_a_file_to_process/Choose_file_to_process.yml +220 -0
  21. data/features/support/fixtures/vcr.nope/Set_Flickr_picturesize/Generate_Flickr_YAML.yml +131 -0
  22. data/features/support/fixtures/{vcr/Select_a_file_to_process/Choose_file_to_process.yml → vcr.nope/Soundcloud/Generate_SoundCloud_YAML.yml} +4 -4
  23. data/features/support/fixtures/vcr.nope/Soundcloud/Generate_SoundCloud_YAML_for_multiple_tracks.yml +181 -0
  24. data/features/support/fixtures/vcr.nope/Soundcloud_set/Generate_YAML_for_a_SoundCloud_set.yml +461 -0
  25. data/features/support/fixtures/vcr.nope/Vimeo/Generate_Vimeo_YAML.yml +53 -0
  26. data/features/support/fixtures/vcr.nope/Vimeo_albums/Generate_YAML_for_a_Vimeo_album.yml +210 -0
  27. data/features/support/fixtures/vcr.nope/YouTube/Generate_YouTube_YAML.yml +970 -0
  28. data/features/support/fixtures/vcr.nope/YouTube_playlists/Generate_YAML_for_a_YouTube_playlist.yml +9688 -0
  29. data/features/support/fixtures/vcr/A_URL_we_don_t_understand/Handle_a_URL_we_don_t_recognise.yml +23 -17
  30. data/features/support/fixtures/vcr/First_contact_with_the_Real_World/Generate_YAML_for_the_Raw_Funk_Maharishi.yml +134 -57
  31. data/features/support/fixtures/vcr/Flickr/Generate_Flickr_YAML.yml +24 -18
  32. data/features/support/fixtures/vcr/Flickr/Generate_Flickr_YAML_with_lookups.yml +25 -19
  33. data/features/support/fixtures/vcr/Flickr_album/Generate_Flickr_YAML_for_an_album.yml +1438 -193
  34. data/features/support/fixtures/vcr/Handle_comments/Handle_comments_in_a_source_file.yml +23 -100
  35. data/features/support/fixtures/vcr/Missing_or_bad_credentials/Bad_credentials_for_multiple_services.yml +15 -15
  36. data/features/support/fixtures/vcr/Set_Flickr_picturesize/Generate_Flickr_YAML.yml +24 -18
  37. data/features/support/fixtures/vcr/Soundcloud/Generate_SoundCloud_YAML.yml +9 -8
  38. data/features/support/fixtures/vcr/Soundcloud/Generate_SoundCloud_YAML_for_multiple_tracks.yml +14 -14
  39. data/features/support/fixtures/vcr/Soundcloud_set/Generate_YAML_for_a_SoundCloud_set.yml +41 -40
  40. data/features/support/fixtures/vcr/Vimeo/Generate_Vimeo_YAML.yml +8 -8
  41. data/features/support/fixtures/vcr/Vimeo_albums/Generate_YAML_for_a_Vimeo_album.yml +38 -38
  42. data/features/support/fixtures/vcr/YouTube/Generate_YouTube_YAML.yml +873 -873
  43. data/features/support/fixtures/vcr/YouTube_playlists/Generate_YAML_for_a_YouTube_playlist.yml +9108 -1923
  44. data/features/support/hooks.rb +8 -0
  45. data/features/youtube-playlist.feature +0 -2
  46. data/lib/purdie.rb +2 -8
  47. data/lib/purdie/bernard.rb +7 -60
  48. data/lib/purdie/cli.rb +1 -1
  49. data/lib/purdie/config.rb +17 -8
  50. data/lib/purdie/helpers.rb +8 -0
  51. data/lib/purdie/ingester.rb +16 -16
  52. data/lib/purdie/item.rb +36 -0
  53. data/lib/purdie/resolver.rb +15 -0
  54. data/lib/purdie/services/soundcloud.rb +1 -1
  55. data/lib/purdie/source_list.rb +54 -16
  56. data/lib/purdie/version.rb +1 -1
  57. data/purdie.gemspec +19 -19
  58. data/spec/bernard_spec.rb +30 -0
  59. data/spec/config_spec.rb +4 -4
  60. data/spec/item_spec.rb +46 -0
  61. data/spec/resolver_spec.rb +40 -0
  62. data/spec/services/youtube_spec.rb +1 -1
  63. data/spec/source_list_spec.rb +59 -34
  64. data/spec/spec_helper.rb +1 -1
  65. data/spec/support/fixtures/output-generator +2 -0
  66. data/spec/support/fixtures/youtube.tubes +1 -0
  67. data/spec/vcr/Purdie_Bernard/deals_with_YouTube.yml +9686 -0
  68. data/spec/vcr/Purdie_Bernard/processes_files.yml +570 -0
  69. data/spec/vcr/Purdie_Item/populates_itself.yml +182 -0
  70. data/spec/vcr/Purdie_Resolver/resolves_a_Flickr_set.yml +772 -0
  71. data/spec/vcr/Purdie_Resolver/resolves_a_SoundCloud_set.yml +103 -0
  72. data/spec/vcr/Purdie_Resolver/resolves_a_YouTube_playlist.yml +970 -0
  73. data/spec/vcr/Purdie_SourceList/constructs_a_list_from_a_set_URL.yml +772 -0
  74. data/spec/vcr/Purdie_SourceList/make_output/actually_makes_output.yml +526 -0
  75. data/spec/vcr/Purdie_SourceList/process_its_items/processes_items.yml +210 -0
  76. data/spec/vcr/Purdie_SourceList/resolve_sets/constructs_a_list_from_a_set_URL.yml +95 -77
  77. metadata +78 -22
  78. data/features/flickr-alternative-outfile.feature +0 -29
  79. data/features/purdie.feature +0 -48
@@ -2,3 +2,11 @@ Before do
2
2
  FileUtils.mkdir_p "tmp/aruba/_config/"
3
3
  FileUtils.cp "#{$fixtures}/_config/purdie.yaml", "tmp/aruba/_config/"
4
4
  end
5
+
6
+ Before "@clearconf" do
7
+ FileUtils.rm "tmp/aruba/_config/purdie.yaml"
8
+ end
9
+
10
+ After do
11
+ FileUtils.rm "tmp/aruba/_config/purdie.yaml"
12
+ end
@@ -1,8 +1,6 @@
1
1
  @vcr
2
2
  Feature: YouTube playlists
3
3
 
4
- @announce-stdout
5
- @announce-stderr
6
4
  Scenario: Generate YAML for a YouTube playlist
7
5
  Given a file named "_sources/youtube" with:
8
6
  """
@@ -10,10 +10,12 @@ require 'purdie/version'
10
10
  require 'purdie/helpers'
11
11
  require 'purdie/bernard'
12
12
  require 'purdie/config'
13
+ require 'purdie/item'
13
14
  require 'purdie/ingester'
14
15
  require 'purdie/source_list'
15
16
  require 'purdie/license_manager'
16
17
  require 'purdie/exceptions'
18
+ require 'purdie/resolver'
17
19
 
18
20
  require 'purdie/services/soundcloud'
19
21
  require 'purdie/services/flickr'
@@ -21,11 +23,3 @@ require 'purdie/services/vimeo'
21
23
  require 'purdie/services/youtube'
22
24
 
23
25
  Dotenv.load
24
-
25
- class Hash
26
- def attach_license service, license
27
- l = Purdie::LicenseManager.get service, license
28
- self['license'] = l['full_name']
29
- self['license_url'] = l['url']
30
- end
31
- end
@@ -5,7 +5,7 @@ module Purdie
5
5
  attr_reader :config
6
6
 
7
7
  def initialize
8
- @config = Config.new
8
+ @config = Config.instance.config
9
9
  begin
10
10
  @sources = Dir.entries(@config['source_dir']).select { |e|
11
11
  e !~ /^\./
@@ -15,71 +15,18 @@ module Purdie
15
15
  rescue Errno::ENOENT
16
16
  @sources = nil
17
17
  end
18
-
19
- Purdie.debug @config.inspect
20
- end
21
-
22
- def source_file= path
23
- @sources = [path]
24
- end
25
-
26
- def services
27
- @services ||= Ingester.ingesters.map { |i| i.new @config }
28
18
  end
29
19
 
30
- def process list
31
- bad_creds = []
32
- bad_licenses = {}
33
-
34
- list.each do |line|
35
- next if line[0] == '#'
36
- next if line == ''
37
-
38
- begin
39
- print "Processing #{line.strip}... "
40
- grab line
41
- rescue NoMethodError => nme
42
- puts "unrecognised URL [#{line}]" if nme.status == "undefined method `ingest' for nil:NilClass"
43
- rescue Purdie::LicenseException => le
44
- bad_licenses[Purdie.basename le.service].push le.name rescue bad_licenses[Purdie.basename le.service] = [le.name]
45
- puts 'fail'
46
- rescue Purdie::CredentialsException => ce
47
- bad_creds.push Purdie.basename(ce.service)
48
- puts 'fail'
49
- else
50
- puts 'done'
51
- end
52
- end
53
-
54
- if bad_creds.any?
55
- raise Purdie::CredentialsException.new self, "Missing or duff credentials for: #{bad_creds.uniq.join ', '}"
56
- end
57
-
58
- if bad_licenses.any?
59
- bad = bad_licenses.map { |k,v| "#{k}: #{v.uniq.join ', '}" }.join '; '
60
- message = "Unknown licenses: #{bad}"
61
- message += "\n"
62
- message += 'Please consider adding the details for these licenses at https://github.com/rawfunkmaharishi/purdie/blob/master/_config/licenses.yaml'
63
- raise Purdie::PurdieException.new message
64
- end
65
- end
20
+ # def source_file= path
21
+ # @sources = path
22
+ # end
66
23
 
67
24
  def fetch
68
- raise Exception.new 'No data sources specified' unless @sources
25
+ raise PurdieException.new 'No data sources specified' unless @sources
69
26
 
70
- @sources.each do |source|
71
- process SourceList.from_file source
27
+ @sources.map { |s| SourceList.from_file s }.each do |source|
28
+ source.write
72
29
  end
73
-
74
- dump
75
- end
76
-
77
- def grab url
78
- services.select{ |s| url =~ /#{s.class.matcher}/ }[0].ingest url
79
- end
80
-
81
- def dump
82
- services.map { |service| service.write }
83
30
  end
84
31
  end
85
32
  end
@@ -14,7 +14,7 @@ module Purdie
14
14
  :desc => 'Specify source file to process'
15
15
  def fetch
16
16
  b = Bernard.new
17
- b.source_file = options[:source_file] if options[:source_file]
17
+ # b.source_file = options[:source_file] if options[:source_file]
18
18
 
19
19
  begin
20
20
  b.fetch
@@ -1,22 +1,31 @@
1
- require 'purdie'
1
+ require 'singleton'
2
2
 
3
3
  module Purdie
4
4
  class Config
5
+ include Singleton
6
+
5
7
  def initialize
6
- @conf = YAML.load File.read File.join(File.dirname(__FILE__), '..', '..', '_config/defaults.yaml')
8
+ reset!
9
+ end
10
+
11
+ def reset! # testing a singleton is hard
12
+ @config = OpenStruct.new fetch_yaml 'defaults'
7
13
 
8
14
  if File.exists? '_config/purdie.yaml'
9
- y = YAML.load File.read '_config/purdie.yaml'
10
- @conf.deep_merge! y
15
+ @local = OpenStruct.new YAML.load File.read '_config/purdie.yaml'
16
+
17
+ @config = OpenStruct.new (@config.to_h.deep_merge @local)
11
18
  end
12
19
  end
13
20
 
14
- def [] key
15
- @conf[key]
21
+ def config
22
+ @config
16
23
  end
17
24
 
18
- def []= key, value
19
- @conf[key] = value
25
+ private
26
+
27
+ def fetch_yaml file
28
+ YAML.load(File.open(File.join(File.dirname(__FILE__), '..', '..', '_config/%s.yaml' % file)))
20
29
  end
21
30
  end
22
31
  end
@@ -37,3 +37,11 @@ module Purdie
37
37
  end
38
38
  end
39
39
  end
40
+
41
+ class Hash
42
+ def attach_license service, license
43
+ l = Purdie::LicenseManager.get service, license
44
+ self['license'] = l['full_name']
45
+ self['license_url'] = l['url']
46
+ end
47
+ end
@@ -4,20 +4,22 @@ module Purdie
4
4
  module Ingester
5
5
  attr_reader :config, :subconfig, :matcher
6
6
 
7
- INGESTERS = []
7
+ include Enumerable
8
+
9
+ class << self
10
+ attr_reader :ingesters
11
+ end
12
+
13
+ @ingesters = []
8
14
 
9
15
  def self.included base
10
16
  # Voodoo: http://stackoverflow.com/questions/10692961/inheriting-class-methods-from-mixins
11
17
  base.extend ClassMethods
12
- INGESTERS.push base
13
- end
14
-
15
- def self.ingesters
16
- INGESTERS
18
+ @ingesters.push base
17
19
  end
18
20
 
19
21
  def initialize config = nil
20
- config = Config.new unless config
22
+ config = Config.instance.config unless config
21
23
  @config = config
22
24
  @items = []
23
25
 
@@ -39,16 +41,14 @@ module Purdie
39
41
  @items.push distill url
40
42
  end
41
43
 
42
- def [] key
43
- @items[key]
44
- end
45
-
46
- def count
47
- @items.count
44
+ def each
45
+ @items.each do |item|
46
+ yield item
47
+ end
48
48
  end
49
49
 
50
- def has_items?
51
- @items.count > 0
50
+ def [] key
51
+ @items[key]
52
52
  end
53
53
 
54
54
  def to_yaml
@@ -56,7 +56,7 @@ module Purdie
56
56
  end
57
57
 
58
58
  def write
59
- if self.has_items?
59
+ if self.any?
60
60
  FileUtils.mkdir_p File.dirname @output_file
61
61
  File.open @output_file, 'w' do |f|
62
62
  f.write self.to_yaml
@@ -0,0 +1,36 @@
1
+ module Purdie
2
+ class Item
3
+ attr_reader :url, :parent_file, :datas
4
+
5
+ def initialize url
6
+ @url = url
7
+ @datas = {}
8
+ end
9
+
10
+ def distill
11
+ @datas = service.distill @url
12
+ end
13
+
14
+ def []= key, value
15
+ @datas[key] = value
16
+ end
17
+
18
+ def [] key
19
+ @datas[key]
20
+ end
21
+
22
+ def service
23
+ c = Ingester.ingesters.select { |s| url =~ /#{s.matcher}/ }.first
24
+ c.new
25
+ end
26
+
27
+ def to_yaml
28
+ Purdie.debug 'wtf'
29
+ @datas.to_yaml
30
+ end
31
+
32
+ def source_list= source_list
33
+ @parent_file = source_list.parent_file
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ module Purdie
2
+ class Resolver
3
+ def self.resolve urls
4
+ urls = [urls].flatten
5
+ resolved = []
6
+
7
+ urls.each do |url|
8
+ service_class = Ingester.ingesters.select { |service| url =~ /#{service.matcher}/ }[0]
9
+ resolved += service_class.resolve(url) if service_class
10
+ end
11
+
12
+ resolved.uniq { |url| Purdie.strip_scheme url }
13
+ end
14
+ end
15
+ end
@@ -19,7 +19,7 @@ module Purdie
19
19
  raise CredentialsException.new self, 'duff'
20
20
  end
21
21
 
22
- results = {}
22
+ results = {}
23
23
  results['title'] = track['title']
24
24
  results['id'] = track['id']
25
25
  results['location'] = track['description']
@@ -4,13 +4,11 @@ module Purdie
4
4
  class SourceList
5
5
  include Enumerable
6
6
 
7
+ attr_reader :items
8
+ attr_accessor :parent_file
9
+
7
10
  def initialize sources
8
- @sources = [sources].
9
- flatten.
10
- select { |i| i !~ /^#/ }.
11
- map { |source| SourceList.resolve source }.
12
- flatten.
13
- uniq { |item| Purdie.strip_scheme item }
11
+ @sources = Resolver.resolve(sources).map { |item| Item.new item }
14
12
  end
15
13
 
16
14
  def [] key
@@ -19,22 +17,62 @@ module Purdie
19
17
 
20
18
  def each &block
21
19
  @sources.each do |source|
22
- if block_given?
23
- block.call source
24
- else
25
- yield source
20
+ yield source
21
+ end
22
+ end
23
+
24
+ def process
25
+ bad_creds = []
26
+ bad_licenses = {}
27
+ @items = []
28
+ @sources.each do |source|
29
+ begin
30
+ print "Processing #{source.url}..."
31
+ source.distill
32
+ puts 'done'
33
+ rescue Purdie::CredentialsException => ce
34
+ bad_creds.push Purdie.basename(ce.service)
35
+ puts 'fail'
36
+ end
37
+ @items.push source
38
+
39
+ if bad_creds.any?
40
+ raise Purdie::CredentialsException.new self, "Missing or duff credentials for: #{bad_creds.uniq.join ', '}"
41
+ end
42
+
43
+ if bad_licenses.any?
44
+ bad = bad_licenses.map { |k,v| "#{k}: #{v.uniq.join ', '}" }.join '; '
45
+ message = "Unknown licenses: #{bad}"
46
+ message += "\n"
47
+ message += 'Please consider adding the details for these licenses at https://github.com/rawfunkmaharishi/purdie/blob/master/_config/licenses.yaml'
48
+ raise Purdie::PurdieException.new message
26
49
  end
27
50
  end
28
51
  end
29
52
 
30
- def self.from_file source_file
31
- SourceList.new File.readlines(source_file).map { |l| l.strip }
53
+ def write
54
+ process
55
+
56
+ FileUtils.mkdir_p File.dirname output_file
57
+ File.open output_file, 'w' do |f|
58
+ dump = @items.map { |item| item.datas }
59
+ f.write dump.to_yaml
60
+ end
61
+ end
62
+
63
+ def output_file
64
+ base = File.basename(parent_file).split '.'
65
+ base.push nil if base.count == 1
66
+ base[-1] = 'yaml'
67
+
68
+ File.join ['_data', base.join('.')]
32
69
  end
33
70
 
34
- def self.resolve source
35
- service_class = Ingester.ingesters.select { |service| source =~ /#{service.matcher}/ }[0]
36
- return [] unless service_class
37
- service_class.resolve source
71
+ def self.from_file source_file
72
+ sl = SourceList.new File.readlines(source_file).map { |l| l.strip }.select { |i| i !~ /^#/ }
73
+ sl.parent_file = source_file
74
+
75
+ sl
38
76
  end
39
77
  end
40
78
  end
@@ -1,3 +1,3 @@
1
1
  module Purdie
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
@@ -18,25 +18,25 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'thor', '~> 0.19'
22
- spec.add_dependency 'httparty', '~> 0.13'
23
- spec.add_dependency 'deep_merge', '~> 1.0'
24
- spec.add_dependency 'dotenv', '~> 2.0'
25
- spec.add_dependency 'flickraw-cached', '= 20120701'
26
- spec.add_dependency 'soundcloud'
27
- spec.add_dependency 'activesupport'
28
- spec.add_dependency 'google-api-client'
21
+ spec.add_dependency 'thor', '~> 0.19'
22
+ spec.add_dependency 'httparty', '~> 0.13'
23
+ spec.add_dependency 'deep_merge', '~> 1.0'
24
+ spec.add_dependency 'dotenv', '~> 2.0'
25
+ spec.add_dependency 'flickraw-cached', '= 20120701'
26
+ spec.add_dependency 'soundcloud', '~> 0.3'
27
+ spec.add_dependency 'activesupport', '~> 4.2'
28
+ spec.add_dependency 'google-api-client', '~> 0.8'
29
29
 
30
- spec.add_development_dependency 'bundler', '~> 1.7'
31
- spec.add_development_dependency 'rake', '~> 10.0'
32
- spec.add_development_dependency 'rspec', '~> 3.2'
33
- spec.add_development_dependency 'aruba', '~> 0.5'
34
- spec.add_development_dependency 'guard', '~> 2.12'
35
- spec.add_development_dependency 'guard-rspec', '~> 4.5'
36
- spec.add_development_dependency 'guard-cucumber', '~> 1.5'
30
+ spec.add_development_dependency 'bundler', '~> 1.7'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'rspec', '~> 3.2'
33
+ spec.add_development_dependency 'aruba', '~> 0.5'
34
+ spec.add_development_dependency 'guard', '~> 2.12'
35
+ spec.add_development_dependency 'guard-rspec', '~> 4.5'
36
+ spec.add_development_dependency 'guard-cucumber', '~> 1.5'
37
37
  spec.add_development_dependency 'terminal-notifier-guard', '~> 1.6'
38
- spec.add_development_dependency 'coveralls', '~> 0.7'
39
- spec.add_development_dependency 'webmock', '~> 1.20'
40
- spec.add_development_dependency 'vcr', '~> 2.9'
41
- spec.add_development_dependency 'timecop', '~> 0.7'
38
+ spec.add_development_dependency 'coveralls', '~> 0.7'
39
+ spec.add_development_dependency 'webmock', '~> 1.20'
40
+ spec.add_development_dependency 'vcr', '~> 2.9'
41
+ spec.add_development_dependency 'timecop', '~> 0.7'
42
42
  end