synt 0.1.0 → 0.1.1

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: 1d7b75a92d1cd6cc21cfc17b54babed054b65fa1
4
- data.tar.gz: 942b65488bf1e539c4c9c70c433e7a53faa4c7ef
3
+ metadata.gz: db6a29021a6d20069699409309b0d876e895cfe6
4
+ data.tar.gz: 2917519bf768b6f16d51eab71811716f7aef5297
5
5
  SHA512:
6
- metadata.gz: aa07f696d7888077c36bbfbc398385a8a50b7065db536419742fa8d44249a594654660a8d2910403b6fa39c65d092573a3395f47d57d1c3a0454b8ac8dbd910d
7
- data.tar.gz: 852a28d465c22c2dadcb06a289011000109ff3c118d936efe8e3a9ff0b1b65b74394ff3a3279f9c0d5fef3063f5e9b865186bfd51d90fd146fd6f48de48bb582
6
+ metadata.gz: 616a83ae7baf88e13f25c1fd11677e3cad5781808029e560a2e3d0808bb570cd4aaf531908331d8a0b50a1bf2b47a4cfc6b57854685aafb928facef93b37a8e0
7
+ data.tar.gz: e7d885f8d603edbb1e93def360a851537ff6ebd9075a1bd0ff5eed613890340401b2ece433119acdda8a52bdbbc79a585ebbd9cd8fc04e8327094d6681d14297
@@ -2,3 +2,23 @@ Style/Documentation:
2
2
  Enabled: false
3
3
  Style/Encoding:
4
4
  Enabled: false
5
+ Style/MethodDefParentheses:
6
+ Enabled: false
7
+ Style/ModuleFunction:
8
+ Enabled: false
9
+ Style/StringLiterals:
10
+ Enabled: false
11
+ Style/GuardClause:
12
+ Enabled: false
13
+ Style/ClassAndModuleChildren:
14
+ Enabled: false
15
+ Style/Blocks:
16
+ Enabled: false
17
+ Metrics/MethodLength:
18
+ Max: 18
19
+ Metrics/CyclomaticComplexity:
20
+ Max: 7
21
+ Style/FileName:
22
+ Enabled: false
23
+ Style/WordArray:
24
+ MinSize: 2
data/Gemfile CHANGED
@@ -2,6 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'slop', '3.6.0'
4
4
  gem 'manowar', '0.0.1'
5
- gem 'rubocop', '0.25.0', require: false
6
- gem 'simplecov', '0.9.0', require: false
7
- gem 'simplecov-lcov', require: false
5
+ gem 'rspec', '3.0.0', require: false, group: :development
6
+ gem 'rubocop', '0.25.0', require: false, group: :development
7
+ gem 'simplecov', '0.9.0', require: false, group: :development
8
+ gem 'simplecov-lcov', require: false, group: :development
@@ -2,6 +2,7 @@ GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
4
  ast (2.0.0)
5
+ diff-lcs (1.2.5)
5
6
  docile (1.1.5)
6
7
  manowar (0.0.1)
7
8
  multi_json (1.10.1)
@@ -10,6 +11,18 @@ GEM
10
11
  slop (~> 3.4, >= 3.4.5)
11
12
  powerpack (0.0.9)
12
13
  rainbow (2.0.0)
14
+ rspec (3.0.0)
15
+ rspec-core (~> 3.0.0)
16
+ rspec-expectations (~> 3.0.0)
17
+ rspec-mocks (~> 3.0.0)
18
+ rspec-core (3.0.3)
19
+ rspec-support (~> 3.0.0)
20
+ rspec-expectations (3.0.3)
21
+ diff-lcs (>= 1.2.0, < 2.0)
22
+ rspec-support (~> 3.0.0)
23
+ rspec-mocks (3.0.3)
24
+ rspec-support (~> 3.0.0)
25
+ rspec-support (3.0.3)
13
26
  rubocop (0.25.0)
14
27
  parser (>= 2.2.0.pre.4, < 3.0)
15
28
  powerpack (~> 0.0.6)
@@ -29,6 +42,7 @@ PLATFORMS
29
42
 
30
43
  DEPENDENCIES
31
44
  manowar (= 0.0.1)
45
+ rspec (= 3.0.0)
32
46
  rubocop (= 0.25.0)
33
47
  simplecov (= 0.9.0)
34
48
  simplecov-lcov
data/bin/lint CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env sh
2
- bundle exec rubocop . -f e
2
+ bundle exec rubocop lib spec -f e
data/bin/synt CHANGED
@@ -1,14 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- if ENV.has_key? 'TEST_COV'
4
- require 'simplecov'
5
- require 'simplecov-lcov'
6
- SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
7
- SimpleCov.start do
8
- add_filter "/fixtures/"
9
- end
10
- end
11
-
12
2
  require_relative '../lib/synt'
13
-
14
3
  Synt.new
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env sh
2
+ bundle exec rspec -f p -c
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env sh
2
+ rm -rf coverage/
3
+ TEST_COV=true bin/test
@@ -8,27 +8,26 @@ module Synt::CLI
8
8
  extend self
9
9
 
10
10
  def parse
11
- Slop.parse help: true, &options
11
+ Slop.parse help: true, &API
12
12
  end
13
13
 
14
14
  private
15
15
 
16
- def options
17
- Proc.new {
18
- banner 'Usage: synt.rb [options]'
16
+ API = proc {
17
+ banner 'Usage: synt.rb [options]'
19
18
 
20
- on 't=', 'tokenize=', 'file or string to tokenize'
21
- on 'c=', 'compare=', 'File or String to compare to something.'
22
- on 't=', 'to=', 'File or String to compare against.'
23
- on 'a=', 'algorithm=', 'Similarity algorithm [default=jaccard,tanimoto].'
24
- on 'n=', 'ngram=', 'Specify what ngrams are generated and used for
25
- comparing token sequences. [default=1,2,4..5,10,...,all]'
26
- on 'd=', 'threshold=', 'Similarity threshold and exit with error.'
19
+ on 't=', 'tokenize=', 'file or string to tokenize'
20
+ on 'c=', 'compare=', 'File or String to compare to something.'
21
+ on 't=', 'to=', 'File or String to compare against.'
22
+ on 'a=', 'algorithm=', 'Similarity algorithm [default=jaccard,tanimoto].'
23
+ on 'n=', 'ngram=', 'Specify what ngrams are generated and used for
24
+ comparing token sequences.
25
+ [default=1,2,4..5,10,...,all]'
26
+ on 'd=', 'threshold=', 'Similarity threshold and exit with error.'
27
27
 
28
- on '-v', 'version', 'Print the version.' do
29
- puts Synt::VERSION
30
- exit 0
31
- end
32
- }
33
- end
28
+ on '-v', 'version', 'Print the version.' do
29
+ puts Synt::VERSION
30
+ exit 0
31
+ end
32
+ }
34
33
  end
@@ -9,15 +9,13 @@ module Synt::Similar
9
9
  extend self
10
10
 
11
11
  def compare opts
12
- error 'no compare propery provided' if !opts[:compare]
13
- error 'no to propery provided' if !opts[:to]
12
+ error 'no compare propery provided' unless opts[:compare]
13
+ error 'no to propery provided' unless opts[:to]
14
14
 
15
15
  src = opts[:compare] || ''
16
16
  cmp = opts[:to] || ''
17
- algorithm = algorithms[opts[:algorithm] || 'jaccard']
18
- src_t = cmp_t = nil
17
+ algorithm = algorithms[(opts[:algorithm] || 'jaccard').to_sym]
19
18
  n_start, n_end = ngram_range opts[:ngram]
20
-
21
19
  src_t = normalize_ripper_tokens Synt::Parser.parse(src)
22
20
  cmp_t = normalize_ripper_tokens Synt::Parser.parse(cmp)
23
21
 
@@ -32,29 +30,26 @@ module Synt::Similar
32
30
  private
33
31
 
34
32
  def algorithms
35
- { 'jaccard' => Jaccard, 'tanimoto' => Tanimoto }
33
+ { jaccard: Jaccard, tanimoto: Tanimoto }
36
34
  end
37
35
 
38
36
  def generate_ngrams arr, start, nend
39
- nend = arr.length if nend.nil?
40
- start = 1 if start.nil?
37
+ nend = arr.length unless nend
38
+ start = 1 unless start
41
39
 
42
40
  if nend > arr.length
43
- puts 'ngram end value exceeds length- setting start/end to: 1.'
41
+ start = nend = 1
42
+ puts 'ngram end value exceeds max length- setting start/end to: 1'
44
43
  end
45
44
 
46
- if start == nend && start == 1 # short circuit
47
- return arr
48
- end
45
+ return arr if start == nend && start == 1 # short circuit
49
46
 
50
47
  sets = []
51
48
 
52
49
  (start..nend).to_a.each_index do |n_len|
53
- arr.each_with_index do |token, index|
50
+ arr.each_index do |index|
54
51
  s_len = index + n_len
55
- if s_len <= arr.length
56
- sets.push arr[index, s_len].join('')
57
- end
52
+ sets.push arr[index, s_len].join('') if s_len <= arr.length
58
53
  end
59
54
  end
60
55
 
@@ -1,3 +1,3 @@
1
1
  module Synt
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/readme.md CHANGED
@@ -10,8 +10,16 @@ This is the Ruby implementation of Synt.
10
10
 
11
11
  For more languages, see the top level [Synt](http://github.com/brentlintner/synt) project.
12
12
 
13
- ### Requirements
13
+ ### Installation
14
14
 
15
- * Ruby
16
- * RubyGems
17
- * Bundler
15
+ gem install synt
16
+
17
+ ### Usage
18
+
19
+ synt -h
20
+
21
+ ### Using In Code
22
+
23
+ This is a TODO. :-)
24
+
25
+ In the meantime, please figure out at your own risk, or use the top level project.
@@ -0,0 +1,7 @@
1
+ def bar
2
+ a = lambda {
3
+ print 'hey!'
4
+ }
5
+
6
+ a.call
7
+ end
@@ -0,0 +1,11 @@
1
+ def foo
2
+ a = [1, 2, 3]
3
+
4
+ puts a.sum
5
+
6
+ if a.length > 3
7
+ puts 'narf'
8
+ else
9
+ puts 'mer'
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ def foo(a, b)
2
+ a * b + (a / b)
3
+ end
@@ -0,0 +1,10 @@
1
+ def foo
2
+ a = 'one'
3
+ b = 'two'
4
+
5
+ [1, 2].each do |i|
6
+ puts i
7
+ end
8
+
9
+ a + b
10
+ end
@@ -0,0 +1,10 @@
1
+ def foo
2
+ one = 'one'
3
+ two = 'two'
4
+
5
+ [1, 2].each do |num|
6
+ puts num
7
+ end
8
+
9
+ one + two
10
+ end
@@ -0,0 +1,19 @@
1
+ if ENV.key? 'TEST_COV'
2
+ require 'simplecov'
3
+ require 'simplecov-lcov'
4
+
5
+ SimpleCov::Formatter::LcovFormatter.report_with_single_file = true
6
+
7
+ SimpleCov.formatters = [
8
+ SimpleCov::Formatter::LcovFormatter,
9
+ SimpleCov::Formatter::HTMLFormatter
10
+ ]
11
+
12
+ SimpleCov.start do
13
+ add_filter "/fixtures/"
14
+ end
15
+ end
16
+
17
+ def file_to_s path
18
+ IO.readlines(path).join
19
+ end
@@ -0,0 +1,63 @@
1
+ require_relative './spec_helper'
2
+ require_relative './../lib/synt/similar'
3
+
4
+ describe Synt::Similar do
5
+ subject { Synt::Similar }
6
+
7
+ algorithms = ['jaccard', 'tanimoto']
8
+ ngram_types = [1, '1..3', 'all']
9
+
10
+ let(:duplicate_path) { 'spec/fixtures/compare-rb-duplicate.rb' }
11
+ let(:similar_a_path) { 'spec/fixtures/compare-rb-similar-a.rb' }
12
+ let(:similar_b_path) { 'spec/fixtures/compare-rb-similar-b.rb' }
13
+ let(:dissimilar_a_path) { 'spec/fixtures/compare-rb-dissimilar-a.rb' }
14
+ let(:dissimilar_b_path) { 'spec/fixtures/compare-rb-dissimilar-b.rb' }
15
+
16
+ context 'duplicate code comparison' do
17
+ let(:dupe) { file_to_s duplicate_path }
18
+
19
+ algorithms.each do |algorithm|
20
+ context "using the #{algorithm} algorithm" do
21
+ ngram_types.each do |ngram|
22
+ context "with an ngram of #{ngram}" do
23
+ it 'is 100%' do
24
+ sim = subject.compare compare: dupe, to: dupe,
25
+ ngram: ngram, algorithm: algorithm
26
+ expect(sim).to eq 100
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ context 'similar code comparison' do
35
+ let(:sim_a) { file_to_s similar_a_path }
36
+ let(:sim_b) { file_to_s similar_b_path }
37
+
38
+ algorithms.each do |algorithm|
39
+ context "using the #{algorithm} algorithm" do
40
+ it 'is ~81%' do
41
+ sim = subject.compare compare: sim_a, to: sim_b,
42
+ algorithm: algorithm
43
+ expect(80..82).to cover(sim)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ context 'dissimilar code comparison' do
50
+ let(:dissim_a) { file_to_s dissimilar_a_path }
51
+ let(:dissim_b) { file_to_s dissimilar_b_path }
52
+
53
+ algorithms.each do |algorithm|
54
+ context "using the #{algorithm} algorithm" do
55
+ it 'is ~22%' do
56
+ sim = subject.compare compare: dissim_a, to: dissim_b,
57
+ algorithm: algorithm
58
+ expect(21..23).to cover(sim)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -10,14 +10,15 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["brent.lintner@gmail.com"]
11
11
  spec.summary = "Similar code analysis."
12
12
  spec.description = "Calculate the percentage of difference between code."
13
- spec.homepage = "https://github.com/brentlintner/synt/tree/ruby"
13
+ spec.homepage = "https://github.com/brentlintner/synt"
14
14
  spec.license = "ISC"
15
15
 
16
16
  spec.files = `git ls-files`.split("\n")
17
17
  spec.executables = ["synt"]
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.required_ruby_version = '>= 1.9'
21
22
  spec.add_runtime_dependency 'manowar', '0.0.1'
22
23
  spec.add_runtime_dependency 'slop', '3.6.0'
23
24
  spec.add_development_dependency "bundler", "~> 1.7"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brent Lintner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-28 00:00:00.000000000 Z
11
+ date: 2014-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: manowar
@@ -65,6 +65,8 @@ files:
65
65
  - Gemfile.lock
66
66
  - bin/lint
67
67
  - bin/synt
68
+ - bin/test
69
+ - bin/test-cov
68
70
  - lib/synt.rb
69
71
  - lib/synt/cli.rb
70
72
  - lib/synt/parser.rb
@@ -73,9 +75,15 @@ files:
73
75
  - lib/synt/similar/tanimoto.rb
74
76
  - lib/synt/version.rb
75
77
  - readme.md
76
- - spec/synt.spec
78
+ - spec/fixtures/compare-rb-dissimilar-a.rb
79
+ - spec/fixtures/compare-rb-dissimilar-b.rb
80
+ - spec/fixtures/compare-rb-duplicate.rb
81
+ - spec/fixtures/compare-rb-similar-a.rb
82
+ - spec/fixtures/compare-rb-similar-b.rb
83
+ - spec/spec_helper.rb
84
+ - spec/synt_spec.rb
77
85
  - synt.gemspec
78
- homepage: https://github.com/brentlintner/synt/tree/ruby
86
+ homepage: https://github.com/brentlintner/synt
79
87
  licenses:
80
88
  - ISC
81
89
  metadata: {}
@@ -87,7 +95,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
95
  requirements:
88
96
  - - ">="
89
97
  - !ruby/object:Gem::Version
90
- version: '0'
98
+ version: '1.9'
91
99
  required_rubygems_version: !ruby/object:Gem::Requirement
92
100
  requirements:
93
101
  - - ">="
@@ -100,4 +108,10 @@ signing_key:
100
108
  specification_version: 4
101
109
  summary: Similar code analysis.
102
110
  test_files:
103
- - spec/synt.spec
111
+ - spec/fixtures/compare-rb-dissimilar-a.rb
112
+ - spec/fixtures/compare-rb-dissimilar-b.rb
113
+ - spec/fixtures/compare-rb-duplicate.rb
114
+ - spec/fixtures/compare-rb-similar-a.rb
115
+ - spec/fixtures/compare-rb-similar-b.rb
116
+ - spec/spec_helper.rb
117
+ - spec/synt_spec.rb
@@ -1 +0,0 @@
1
- # TODO