chekku 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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: