linknew 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c04c6b5ad914e84907496cea235c7b947a2cd15e
4
- data.tar.gz: 504c98bc166e1d8e0c8429edcdff8b3817e07715
3
+ metadata.gz: d6c6b7c93b7e8cc4900ddbb1fde23831a900c80f
4
+ data.tar.gz: 48348457b5ce6d09b444093577cae419bd306c60
5
5
  SHA512:
6
- metadata.gz: 1d7a3655abe3e22f6b96e87e81dd9ae8d4f79fb87a413903ee3ce1e90b34e192397c60f1351c176c9c78281f6ead3edaa607b68fdb0320b22b58e85317e6b6f6
7
- data.tar.gz: 068bd4a2c0fefa212c5ce7e1f47d8345906e34736c5f3aed9512ecd8888d42f5ab63174f8144de7d7b9485c43f877dfc48366c391e9caf62034ecb46e2a9e237
6
+ metadata.gz: ca8f77e90a2538af6cc184ec447b52904ef19b0588333198699d4dd5dac8768b7beb8b16e7670c6b776eb828079a2456b755e9660619cf4b19a0f85d9b39cd35
7
+ data.tar.gz: 41ce550e857c0422cd70dfce70832beed638f0df2365e508d146827a38c618a9e3346326600f638856fb85b6c89eceaa4f3c298321e314680afef59ace95b2fe
@@ -0,0 +1,2 @@
1
+ Metrics/LineLength:
2
+ Max: 99
@@ -1,3 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.2
3
+ - 2.2.0-preview2
4
+ - 2.1.5
5
+ - rbx-2.2.7
@@ -0,0 +1,6 @@
1
+ # 1.0.0 / 2014-12-07
2
+ * [FEATURE] Set the mtime of the link on unix systems
3
+ * [ENHANCEMENT] Considered stable now, I have been using it for a few months.
4
+
5
+ # 0.0.1 / 2014-10-12
6
+ * [FEATURE] Basic functionality, links to new files exactly once
data/README.md CHANGED
@@ -1,3 +1,11 @@
1
+ [![Gem Version](https://badge.fury.io/rb/linknew.png)](http://rubygems.org/gems/linknew)
2
+ [![Build Status](https://secure.travis-ci.org/voidus/linknew.png?branch=master)](https://travis-ci.org/voidus/linknew)
3
+ [![Code Climate](https://codeclimate.com/github/voidus/linknew.png)](https://codeclimate.com/github/voidus/linknew)
4
+ [![Coverage Status](https://coveralls.io/repos/voidus/linknew/badge.png?branch=master)](https://coveralls.io/r/voidus/linknew)
5
+ [![Dependencies](https://gemnasium.com/voidus/linknew.png)](https://gemnasium.com/voidus/linknew)
6
+ [![Documentation](http://inch-ci.org/github/voidus/linknew.svg?branch=master)](http://inch-ci.org/github/voidus/linknew)
7
+ [![PullReview stats](https://www.pullreview.com/github/voidus/linknew/badges/master.svg?)](https://www.pullreview.com/github/voidus/linknew/reviews/master)
8
+
1
9
  # Linknew
2
10
 
3
11
  Linknew creates links to all files in another directory once. You can use it to keep track of which files in a shared
data/Rakefile CHANGED
@@ -1,7 +1,10 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
4
+ require 'reek/rake/task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
7
+ RuboCop::RakeTask.new { |config| config.fail_on_error = false }
8
+ Reek::Rake::Task.new { |config| config.fail_on_error = false }
5
9
 
6
- task :default => :spec
7
-
10
+ task default: [:spec, :rubocop, :reek]
@@ -1,21 +1,17 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'linknew'
3
3
 
4
- CONFIG_FILE = ".linknew"
4
+ CONFIG_FILE = '.linknew'
5
5
  HELP_MESSAGE = <<HERE
6
6
 
7
7
  HERE
8
8
 
9
- unless File.exists? CONFIG_FILE
10
- abort "Usage: Put a target location in .linknew and run the script"
9
+ unless File.exist? CONFIG_FILE
10
+ abort 'Usage: Put a target location in .linknew and run the script'
11
11
  end
12
12
 
13
13
  folder = IO.read(CONFIG_FILE).strip
14
- unless File.exists? folder
15
- abort "The folder \"#{folder}\" does not exist"
16
- end
17
- unless File.directory? folder
18
- abort "The folder \"#{folder}\" is not a directory"
19
- end
14
+ abort "The folder \"#{folder}\" does not exist" unless File.exist? folder
15
+ abort "The folder \"#{folder}\" is not a directory" unless File.directory? folder
20
16
 
21
17
  Linknew::Linknew.new(folder).execute
@@ -1,27 +1,49 @@
1
- require "linknew/version"
2
- require "sqlite3"
1
+ require 'linknew/version'
2
+ require 'sqlite3'
3
+ require 'fileutils'
4
+ require 'shellwords'
3
5
 
4
6
  require 'linknew/database'
5
7
 
8
+ # Linknew is an application, and while it's code might be benificial in some situations, the api
9
+ # shouldn't be that important.
6
10
  module Linknew
11
+ # The main linknew class
7
12
  class Linknew
8
- def initialize folder
13
+ def initialize(folder)
9
14
  @folder = folder
10
- abort("Target folder does not exist") unless File.exists? folder
15
+ abort('Target folder does not exist') unless File.exist? folder
11
16
  end
12
17
 
18
+ # Runs the program
13
19
  def execute
14
- db = Database.new
20
+ puts MTIME_WARNING_MESSAGE unless CAN_SET_MTIME
21
+
22
+ Database.new do |db|
23
+ scan_files(db)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ MTIME_WARNING_MESSAGE = 'WARNING: Not running on linux, will not set mtime of symbolic links.'
30
+ CAN_SET_MTIME = RUBY_PLATFORM =~ /linux/ && !$PROGRAM_NAME =~ /\brspec$/
31
+
32
+ def scan_files(db)
15
33
  Dir.foreach(@folder) do |file|
16
- next if file == "." || file == ".."
17
- file = File.join(@folder, file)
34
+ next if file == '.' || file == '..'
18
35
 
19
- unless db.has_file? file
20
- puts "Linking #{File.basename(file)}"
21
- File.symlink(file, File.basename(file))
22
- db.enter_file(file)
23
- end
36
+ file = File.join(@folder, file)
37
+ process_file(file, db) unless db.known? file
24
38
  end
25
39
  end
40
+
41
+ def process_file(file, db)
42
+ linkname = File.basename(file)
43
+ puts "Linking #{linkname}"
44
+ File.symlink(file, linkname)
45
+ `touch -h #{linkname.shellescape} -r #{file.shellescape}` if CAN_SET_MTIME
46
+ db.enter(file)
47
+ end
26
48
  end
27
49
  end
@@ -1,28 +1,50 @@
1
- require 'linknew/errors'
2
1
  require 'digest'
3
2
 
4
3
  module Linknew
4
+ # Encapsules the linknew database
5
5
  class Database
6
- def initialize
7
- @db = SQLite3::Database.new ".linknew.db"
8
- @db.execute "CREATE TABLE IF NOT EXISTS files (md5name char(32))"
9
- @db.execute "CREATE INDEX IF NOT EXISTS files_md5name ON files (md5name)"
6
+ def initialize(&block)
7
+ @db = SQLite3::Database.new '.linknew.db'
8
+ creates_tables_if_not_exist
10
9
 
11
- @has_file_stmt = @db.prepare("SELECT EXISTS(SELECT 1 FROM files WHERE md5name = ? LIMIT 1)")
12
- @enter_file_stmt = @db.prepare("INSERT INTO files VALUES (?)")
10
+ return unless block_given?
11
+
12
+ begin
13
+ block.call(self)
14
+ ensure
15
+ close
16
+ end
17
+ end
18
+
19
+ def close
20
+ @db.close
13
21
  end
14
22
 
15
- def has_file? file
16
- @has_file_stmt.execute(filehash(file)).next[0] == 1
23
+ def known?(file)
24
+ hash = Database.filehash(file)
25
+ p "Querying file #{file} with hash #{hash}"
26
+ ret = @db.execute(HAS_FILE_STMT, hash)[0][0] == 1
27
+ p "Returning #{ret}"
28
+ ret
17
29
  end
18
30
 
19
- def enter_file file
20
- @enter_file_stmt.execute(filehash(file))
31
+ def enter(file)
32
+ hash = Database.filehash(file)
33
+ p "Entering file #{file} with hash #{hash}"
34
+ @db.execute(ENTER_FILE_STMT, hash)
21
35
  end
22
36
 
23
37
  private
24
38
 
25
- def filehash file
39
+ HAS_FILE_STMT = 'SELECT EXISTS(SELECT 1 FROM files WHERE md5name = ? LIMIT 1)'
40
+ ENTER_FILE_STMT = 'INSERT INTO files VALUES (?)'
41
+
42
+ def creates_tables_if_not_exist
43
+ @db.execute 'CREATE TABLE IF NOT EXISTS files (md5name char(32))'
44
+ @db.execute 'CREATE INDEX IF NOT EXISTS files_md5name ON files (md5name)'
45
+ end
46
+
47
+ def self.filehash(file)
26
48
  ::Digest::MD5.hexdigest(File.basename(file))
27
49
  end
28
50
  end
@@ -1,3 +1,3 @@
1
- module Linknew
2
- VERSION = "0.0.2"
1
+ module Linknew # rubocop:disable Documentation
2
+ VERSION = '1.0.0'
3
3
  end
@@ -4,25 +4,28 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'linknew/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "linknew"
7
+ spec.name = 'linknew'
8
8
  spec.version = Linknew::VERSION
9
- spec.authors = ["Simon Kohlmeyer"]
10
- spec.email = ["simon.kohlmeyer@gmail.com"]
11
- spec.summary = %q{Links to files in a directory once}
9
+ spec.authors = ['Simon Kohlmeyer']
10
+ spec.email = ['simon.kohlmeyer@gmail.com']
11
+ spec.summary = 'Links to files in a directory once'
12
12
  spec.description = <<HERE
13
- Linknew creates links to all files in another directory once. You can use it to keep track of which files in a shared
14
- directory you already looked at.
13
+ Linknew creates links to all files in another directory once.
14
+ You can use it to keep track of which files in a shared directory you already
15
+ looked at.
15
16
  HERE
16
- spec.homepage = "http://github.com/voidus/linknew"
17
- spec.license = "MIT"
17
+ spec.homepage = 'http://github.com/voidus/linknew'
18
+ spec.license = 'MIT'
18
19
 
19
20
  spec.files = `git ls-files -z`.split("\x0")
20
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
- spec.require_paths = ["lib"]
21
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
22
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
23
+ spec.require_paths = ['lib']
23
24
 
24
- spec.add_dependency "sqlite3", "~>1.3"
25
- spec.add_development_dependency "bundler", "~> 1.7"
26
- spec.add_development_dependency "rake", "~> 10.0"
27
- spec.add_development_dependency "rspec"
25
+ spec.add_dependency 'sqlite3', '~>1.3'
26
+ spec.add_development_dependency 'bundler'
27
+ spec.add_development_dependency 'rake', '~> 10.0'
28
+ spec.add_development_dependency 'rspec', '~> 3.1'
29
+ spec.add_development_dependency 'rubocop', '~> 0.27.1'
30
+ spec.add_development_dependency 'reek'
28
31
  end
@@ -1,11 +1,60 @@
1
1
  require 'spec_helper'
2
+ require 'tmpdir'
2
3
 
3
4
  describe Linknew do
5
+ before(:all) { @original_wd = Dir.pwd }
6
+ after(:all) { Dir.chdir(@original_wd) }
7
+
8
+ before(:each) do
9
+ @source_dir = Dir.mktmpdir('src_')
10
+ @work_dir = Dir.mktmpdir('dst_')
11
+
12
+ @testfile = 'some_file'
13
+
14
+ @testfile_source = File.join(@source_dir, @testfile)
15
+ @testfile_work = File.join(@work_dir, @testfile)
16
+
17
+ FileUtils.touch(@testfile_source)
18
+ Dir.chdir(@work_dir)
19
+ end
20
+
21
+ after(:each) do
22
+ FileUtils.remove_entry @source_dir
23
+ FileUtils.remove_entry @work_dir
24
+ end
25
+
26
+ def call_linknew
27
+ Linknew::Linknew.new(@source_dir).execute
28
+ end
29
+
4
30
  it 'has a version number' do
5
31
  expect(Linknew::VERSION).not_to be nil
6
32
  end
7
33
 
8
- it 'does something useful' do
9
- expect(false).to eq(true)
34
+ it 'creates a database file' do
35
+ call_linknew
36
+ expect(::File).to exist('.linknew.db')
37
+ end
38
+
39
+ it 'creates a database file' do
40
+ call_linknew
41
+ expect(File.exist?('.linknew.db'))
42
+ end
43
+
44
+ it 'creates a link to a new file' do
45
+ call_linknew
46
+ expect(File).to exist(@testfile_work)
47
+ end
48
+
49
+ it 'also works without to' do
50
+ call_linknew
51
+ expect(File.exist?(@testfile_work))
52
+ end
53
+
54
+ it 'ignores already linked files on the second run when the link has been deleted' do
55
+ call_linknew
56
+ File.delete(@testfile_work)
57
+ call_linknew
58
+ expect(File).not_to exist(@testfile_work)
10
59
  end
11
60
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linknew
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Kohlmeyer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-12 00:00:00.000000000 Z
11
+ date: 2014-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqlite3
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.7'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.7'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -54,6 +54,34 @@ dependencies:
54
54
  version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.27.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.27.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: reek
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
@@ -67,8 +95,9 @@ dependencies:
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
69
97
  description: |
70
- Linknew creates links to all files in another directory once. You can use it to keep track of which files in a shared
71
- directory you already looked at.
98
+ Linknew creates links to all files in another directory once.
99
+ You can use it to keep track of which files in a shared directory you already
100
+ looked at.
72
101
  email:
73
102
  - simon.kohlmeyer@gmail.com
74
103
  executables:
@@ -78,8 +107,10 @@ extra_rdoc_files: []
78
107
  files:
79
108
  - ".gitignore"
80
109
  - ".rspec"
110
+ - ".rubocop.yml"
81
111
  - ".ruby-version"
82
112
  - ".travis.yml"
113
+ - CHANGELOG.md
83
114
  - Gemfile
84
115
  - LICENSE.txt
85
116
  - README.md
@@ -87,7 +118,6 @@ files:
87
118
  - bin/linknew
88
119
  - lib/linknew.rb
89
120
  - lib/linknew/database.rb
90
- - lib/linknew/errors.rb
91
121
  - lib/linknew/version.rb
92
122
  - linknew.gemspec
93
123
  - spec/linknew_spec.rb
@@ -1,4 +0,0 @@
1
- module Linknew
2
- class Error < StandardError; end
3
- class FileNotFoundError < Error; end
4
- end