Class: GenerateList

Inherits:
Object
  • Object
show all
Defined in:
lib/wpstools/plugins/list_generator/generate_list.rb

Overview

This tool generates a list to use for plugin and theme enumeration

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (GenerateList) initialize(type, verbose)

type = themes | plugins



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 9

def initialize(type, verbose)
  if type =~ /plugins/i
    @type           = 'plugin'
    @svn_url        = 'http://plugins.svn.wordpress.org/'
    @popular_url    = 'http://wordpress.org/extend/plugins/browse/popular/'
    @popular_regex  = %r{<h3><a href="http://wordpress.org/extend/plugins/(.+)/">.+</a></h3>}i
  elsif type =~ /themes/i
    @type           = 'theme'
    @svn_url        = 'http://themes.svn.wordpress.org/'
    @popular_url    = 'http://wordpress.org/extend/themes/browse/popular/'
    @popular_regex  = %r{<h3><a href="http://wordpress.org/extend/themes/(.+)">.+</a></h3>}i
  else
    raise "Type #{type} not defined"
  end
  @verbose  = verbose
  @browser  = Browser.instance
  @hydra    = @browser.hydra
end

Instance Attribute Details

- (Object) verbose

Returns the value of attribute verbose



6
7
8
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 6

def verbose
  @verbose
end

Instance Method Details

- (Object) generate_full_list



53
54
55
56
57
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 53

def generate_full_list
  set_file_name(:full)
  items = SvnParser.new(@svn_url).parse
  save items
end


59
60
61
62
63
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 59

def generate_popular_list(pages)
  set_file_name(:popular)
  items = get_popular_items(pages)
  save items
end

Send a HTTP request to the WordPress most popular theme or plugin webpage parse the response for the names.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 67

def get_popular_items(pages)
  found_items = []
  page_count = 1
  queue_count = 0

  (1...(pages.to_i + 1)).each do |page|
    # First page has another URL
    url = (page == 1) ? @popular_url : @popular_url + 'page/' + page.to_s + '/'
    request = @browser.forge_request(url)

    queue_count += 1

    request.on_complete do |response|
      puts "[+] Parsing page #{page_count}" if @verbose
      page_count += 1
      response.body.scan(@popular_regex).each do |item|
        puts "[+] Found popular #@type: #{item}" if @verbose
        found_items << item[0]
      end
    end

    @hydra.queue(request)

    if queue_count == @browser.max_threads
      @hydra.run
      queue_count = 0
    end

  end

  @hydra.run

  found_items.sort!
  found_items.uniq
end

- (Object) save(items)

Save the file



104
105
106
107
108
109
110
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 104

def save(items)
  items.sort!
  items.uniq!
  puts "[*] We have parsed #{items.length} #@types"
  File.open(@file_name, 'w') { |f| f.puts(items) }
  puts "New #@file_name file created"
end

- (Object) set_file_name(type)



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/wpstools/plugins/list_generator/generate_list.rb', line 28

def set_file_name(type)
  case @type
  when 'plugin'
    case type
    when :full
      @file_name = PLUGINS_FULL_FILE
    when :popular
      @file_name = PLUGINS_FILE
    else
      raise 'Unknown type'
    end
  when 'theme'
    case type
    when :full
      @file_name = THEMES_FULL_FILE
    when :popular
      @file_name = THEMES_FILE
    else
      raise 'Unknown type'
    end
    else
      raise "Unknown type #@type"
  end
end