Class: Cani::Api

Inherits:
Object
  • Object
show all
Defined in:
lib/cani/api.rb,
lib/cani/api/browser.rb,
lib/cani/api/feature.rb,
lib/cani/api/feature/viewer.rb

Defined Under Namespace

Classes: Browser, Feature

Instance Method Summary collapse

Constructor Details

#initializeApi

Returns a new instance of Api.



9
10
11
# File 'lib/cani/api.rb', line 9

def initialize
  @data = load_data
end

Instance Method Details

#browsersObject



83
84
85
86
87
# File 'lib/cani/api.rb', line 83

def browsers
  @browsers ||= @data['agents'].map do |(name, info)|
    Browser.new info.merge(name: name)
  end
end

#featuresObject



89
90
91
# File 'lib/cani/api.rb', line 89

def features
  @features ||= @data['data'].map { |(name, info)| Feature.new info.merge(name: name) }
end

#find_browser(name) ⇒ Object



74
75
76
77
78
79
80
81
# File 'lib/cani/api.rb', line 74

def find_browser(name)
  name = name.to_s.downcase
  idx  = browsers.find_index do |bwsr|
    [bwsr.title, bwsr.name, bwsr.abbr].map(&:downcase).include? name
  end

  browsers[idx] if idx
end

#find_feature(name) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/cani/api.rb', line 56

def find_feature(name)
  name = Regexp.new name.to_s.downcase.gsub(/(\W)/, '.*'), :i
  idx  = features.find_index do |ft|
    ft.title.downcase.match(name) || ft.name.downcase.match(name)
  end

  features[idx] if idx
end

#find_features(name) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/cani/api.rb', line 65

def find_features(name)
  name = Regexp.new name.to_s.downcase.gsub(/(\W)/, '.*'), :i
  features.select do |ft|
    ft.title.downcase.match(name) ||
      ft.name.downcase.match(name) ||
      ft.description.downcase.match(name)
  end
end

#load_data(fetch: false) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/cani/api.rb', line 13

def load_data(fetch: false)
  @upd = false
  data_file       = File.join Cani.config.directory, 'caniuse.json'
  data_exists     = File.exist? data_file
  data_up_to_date = data_exists ? (Time.now.to_i - File.mtime(data_file).to_i < Cani.config.expire.to_i)
                                : false

  if !fetch && data_exists && data_up_to_date
    # data is available and up to date
    JSON.parse File.read(data_file)
  elsif (data = raw)
    @upd = true
    # data either doesn't exist or isn't up to date
    # if we can fetch new data, attempt to update
    FileUtils.mkdir_p File.dirname(data_file)
    File.open(data_file, 'w') { |f| f << data }
    JSON.parse data
  elsif data_exists
    # if we are unable fetch new data, fall back
    # to existing data if it exists
    JSON.parse File.read(data_file)
  else
    # no other option but fail since we have no data
    # and no way of fetching the data to display
    puts 'Cani fatal: no data available for display'
    exit 1
  end
end

#rawObject



93
94
95
96
97
98
99
# File 'lib/cani/api.rb', line 93

def raw
  begin
    Net::HTTP.get URI(Cani.config.source)
  rescue
    nil
  end
end

#remove!Object



42
43
44
45
46
# File 'lib/cani/api.rb', line 42

def remove!
  data_file = File.join Cani.config.directory, 'caniuse.json'

  File.unlink data_file if File.exist? data_file
end

#update!Object



48
49
50
# File 'lib/cani/api.rb', line 48

def update!
  @data = load_data fetch: true
end

#updated?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/cani/api.rb', line 52

def updated?
  @upd
end