chekku 0.1.0 → 0.5.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.
data/README.md CHANGED
@@ -59,8 +59,12 @@ imagemagick:
59
59
  Example on how to check a software dependency
60
60
 
61
61
  ```
62
+ require 'chekku/definition'
62
63
  definition = Chekku::Definition.new(name: 'mysql', executable: 'mysqld')
64
+ # return true or false
63
65
  definition.chekku('>= 5.0')
66
+ #return true or raise an error
67
+ definition.chekku!('> 5.0')
64
68
  ```
65
69
 
66
70
  ## Future
@@ -51,7 +51,7 @@ module Chekku
51
51
 
52
52
  # Check if version and other params are valid for current Definition instance and return false if errors
53
53
  # @param (see #chekku!)
54
- # @return [Boolean] version and args are valid => true else false
54
+ # @return [Boolean] valid version and args ?
55
55
  def chekku(version = nil, args = {})
56
56
  chekku!(version, args)
57
57
  rescue
@@ -42,7 +42,7 @@ class Chekku::Definitions
42
42
  version = nil
43
43
  end
44
44
  definition = get_definition! name
45
- puts "[\033[32m✓\033[0m] #{name}" if definition.chekku(version, args)
45
+ puts "[\033[32m✓\033[0m] #{name}" if definition.chekku!(version, args)
46
46
  rescue DefinitionsError => e
47
47
  puts "[\033[31m✗\033[0m] #{name}: #{e.message}\n"
48
48
  rescue ChekkuError => e
@@ -16,6 +16,6 @@ class Chekku::DefinitionsService
16
16
  # @param [String] definition_name The needed Definition name
17
17
  # @return [Definition] The needed Definition
18
18
  def definition_for(definition_name)
19
- @definitions.select{ |definition| definition.name == definition_name }.first if @definitions
19
+ @definitions.detect{ |definition| definition.name == definition_name } if @definitions
20
20
  end
21
21
  end
@@ -1,10 +1,14 @@
1
1
  #encoding: utf-8
2
2
  require 'yaml'
3
3
  require_relative 'definition'
4
+ require 'net/http'
4
5
 
5
6
  class Chekku::Fetcher
6
7
 
7
- CHEKKU_PATH = "#{ENV['HOME']}/.chekku"
8
+ CHEKKU_PATH = "#{Dir.home}/.chekku"
9
+ CHEKKU_EXPORT_URL = "http://chekku.co/definitions/export"
10
+ CHEKKU_DEFINITION_FILE = "#{CHEKKU_PATH}/def.yml"
11
+ MAX_DAYS = 7
8
12
 
9
13
  attr_accessor :dependencies
10
14
 
@@ -13,13 +17,64 @@ class Chekku::Fetcher
13
17
  # @param [String] file_path Path to Chekkufile
14
18
  # @return [Array] a list of Definition instances
15
19
  def self.fetch_for_chekkufile(file_path)
16
- # TODO: Implements server side of the file checker
17
- # STUB: Load local file
18
20
  fetcher = new
19
21
  fetcher.dependencies_from_file
20
22
  end
21
23
 
22
24
  def dependencies_from_file
23
- @dependencies = Chekku::Definition.load(YAML.load_file("#{CHEKKU_PATH}/def.yml") || {})
25
+ @dependencies = Chekku::Definition.load(definitions_hash)
26
+ end
27
+
28
+ def definitions_hash
29
+ begin
30
+ definitions_yaml = load_definitions_file
31
+ rescue
32
+ ensure
33
+ definitions_yaml ||= {}
34
+ end
35
+ ensure_definitions_are_up_to_date(definitions_yaml)
36
+ end
37
+
38
+ private
39
+
40
+ def load_definitions_file
41
+ YAML.load_file(CHEKKU_DEFINITION_FILE)
42
+ end
43
+
44
+ def ensure_definitions_are_up_to_date(definitions_yaml)
45
+ last_updated = definitions_yaml.delete('updated_at')
46
+ definitions_yaml.tap do |definitions_yaml|
47
+ if too_long_ago?(last_updated)
48
+ defintions_yaml = fetch_new_distant_definitions
49
+ end
50
+ end
51
+ end
52
+
53
+ def fetch_new_distant_definitions
54
+ ensure_presence_of_chekku_dir
55
+ renew_chekku_definitions_file
56
+ load_definitions_file.tap { |definitions_yaml| definitions_yaml.delete('updated_at') }
57
+ end
58
+
59
+ def ensure_presence_of_chekku_dir
60
+ Dir.mkdir(CHEKKU_PATH) unless File.directory?(CHEKKU_PATH)
61
+ end
62
+
63
+ def renew_chekku_definitions_file
64
+ File.open(CHEKKU_DEFINITION_FILE, "wb") do |chekku_file|
65
+ chekku_file.write(distant_definitions_file)
66
+ end
67
+ end
68
+
69
+ def distant_definitions_file
70
+ uri = URI.parse(CHEKKU_EXPORT_URL)
71
+ http = Net::HTTP.new(uri.host, uri.port)
72
+ request = Net::HTTP::Post.new(uri.request_uri)
73
+ request["accept"] = "text/yaml"
74
+ http.request(request).body
75
+ end
76
+
77
+ def too_long_ago?(date)
78
+ date.nil? || date > (Date.today - MAX_DAYS)
24
79
  end
25
80
  end
@@ -1,3 +1,3 @@
1
1
  module Chekku
2
- VERSION = '0.1.0'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -2,17 +2,17 @@ require 'spec_helper'
2
2
  require 'chekku/fetcher'
3
3
 
4
4
  describe Chekku::Fetcher do
5
+ let(:fetcher) { Chekku::Fetcher.new() }
5
6
 
6
7
  describe ".dependencies_for_file" do
7
- let(:fetcher) { Chekku::Fetcher.new() }
8
- it 'should call YAML.load_file' do
9
- YAML.should_receive(:load_file).with("#{ENV['HOME']}/.chekku/def.yml")
8
+ it 'returns a hash of definitions' do
9
+ fetcher.should_receive(:ensure_definitions_are_up_to_date).and_return({})
10
10
  fetcher.dependencies_from_file
11
11
  end
12
12
 
13
13
  it 'should return an array of definitions of dependencies' do
14
14
  dependencies_hash = { 'mysql' => { 'executable' => 'mysqld' }}
15
- YAML.stub(:load_file).and_return(dependencies_hash)
15
+ fetcher.stub(:ensure_definitions_are_up_to_date).and_return(dependencies_hash)
16
16
  fetcher.dependencies_from_file.first.name.should == 'mysql'
17
17
  end
18
18
  end
@@ -22,6 +22,18 @@ describe Chekku::Fetcher do
22
22
  end
23
23
  end
24
24
 
25
+ describe '#fetch_new_distant_definitions' do
26
+ it 'creates chekku directory if not present' do
27
+ Chekku::Fetcher.const_set 'CHEKKU_PATH', '/tmp/chekku'
28
+ fetcher.should_receive(:renew_chekku_definitions_file)
29
+ fetcher.should_receive(:load_definitions_file).and_return({})
30
+ Dir.should_receive(:mkdir).with('/tmp/chekku')
31
+ File.should_receive(:directory?).and_return(false)
32
+ fetcher.send(:fetch_new_distant_definitions)
33
+ end
34
+
35
+ end
36
+
25
37
  end
26
38
 
27
39
 
metadata CHANGED
@@ -1,80 +1,80 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chekku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
4
  prerelease:
5
+ version: 0.5.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Yannick Schutz
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-24 00:00:00.000000000 Z
12
+ date: 2012-12-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rspec
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
15
+ version_requirements: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '2.0'
20
+ none: false
21
+ name: rspec
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
24
+ requirement: !ruby/object:Gem::Requirement
26
25
  requirements:
27
26
  - - ! '>='
28
27
  - !ruby/object:Gem::Version
29
28
  version: '2.0'
30
- - !ruby/object:Gem::Dependency
31
- name: simplecov
32
- requirement: !ruby/object:Gem::Requirement
33
29
  none: false
30
+ - !ruby/object:Gem::Dependency
31
+ version_requirements: !ruby/object:Gem::Requirement
34
32
  requirements:
35
33
  - - ! '>='
36
34
  - !ruby/object:Gem::Version
37
35
  version: '0'
36
+ none: false
37
+ name: simplecov
38
38
  type: :development
39
39
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
40
+ requirement: !ruby/object:Gem::Requirement
42
41
  requirements:
43
42
  - - ! '>='
44
43
  - !ruby/object:Gem::Version
45
44
  version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: thor
48
- requirement: !ruby/object:Gem::Requirement
49
45
  none: false
46
+ - !ruby/object:Gem::Dependency
47
+ version_requirements: !ruby/object:Gem::Requirement
50
48
  requirements:
51
49
  - - ! '>='
52
50
  - !ruby/object:Gem::Version
53
51
  version: '0'
52
+ none: false
53
+ name: thor
54
54
  type: :runtime
55
55
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
56
+ requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
58
  - - ! '>='
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0'
62
- - !ruby/object:Gem::Dependency
63
- name: rake
64
- requirement: !ruby/object:Gem::Requirement
65
61
  none: false
62
+ - !ruby/object:Gem::Dependency
63
+ version_requirements: !ruby/object:Gem::Requirement
66
64
  requirements:
67
65
  - - ! '>='
68
66
  - !ruby/object:Gem::Version
69
67
  version: '0'
68
+ none: false
69
+ name: rake
70
70
  type: :runtime
71
71
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
72
+ requirement: !ruby/object:Gem::Requirement
74
73
  requirements:
75
74
  - - ! '>='
76
75
  - !ruby/object:Gem::Version
77
76
  version: '0'
77
+ none: false
78
78
  description: Chekku checks all your software dependencies from development to production.
79
79
  email:
80
80
  - yannick.schutz@gmail.com
@@ -114,17 +114,17 @@ rdoc_options: []
114
114
  require_paths:
115
115
  - lib
116
116
  required_ruby_version: !ruby/object:Gem::Requirement
117
- none: false
118
117
  requirements:
119
118
  - - ! '>='
120
119
  - !ruby/object:Gem::Version
121
120
  version: '1.9'
122
- required_rubygems_version: !ruby/object:Gem::Requirement
123
121
  none: false
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
123
  requirements:
125
124
  - - ! '>='
126
125
  - !ruby/object:Gem::Version
127
126
  version: 1.3.6
127
+ none: false
128
128
  requirements: []
129
129
  rubyforge_project:
130
130
  rubygems_version: 1.8.23
@@ -137,4 +137,3 @@ test_files:
137
137
  - spec/lib/definitions_spec.rb
138
138
  - spec/lib/fetcher_spec.rb
139
139
  - spec/spec_helper.rb
140
- has_rdoc: