samer 1.0.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjJhZDQ0M2VmMmZmMjMxNTMyNDQ1NjQ4MThmYzEwYTM1Y2Q5NmY3Mg==
5
+ data.tar.gz: !binary |-
6
+ MDJlMmJmNWQwMDFkOGRhNDg3YjQ2YjZmZDVlNzA1ZThkNzkyMDYwZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZjEzNzllODU5ZDA4NTA2ZTVmNDc4NGM2MzYwNjM4NDc3NGNlOWU5Mjk2MTk0
10
+ NTUyM2ZkMDI3ZWNhY2RmNTY5ZDFhN2NjYmRhNzcwMjY3ZWJhYjAxNWUwNTIw
11
+ OWMwMDliODI1MGI2NDU1ODZmZjQ1YmJhZDgyNTg4NzMyZjljNTY=
12
+ data.tar.gz: !binary |-
13
+ MmUyNjE4NzI3OGQ4YjllNTAwZGQ0NzhiOWQ1ODBkMTNlYzAzMWZmZWExN2Iy
14
+ OTdkOTMwZTQyODhjMjAwYzllNzhhY2UwOTQ1NDBmZjRmN2Q0NjUwZGRkOTBl
15
+ ZTQyZTJhN2NhZTc3ODhmNTA3MzVhMjU2NTg2MmE2NzA3YTFkMjM=
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'samer'
4
+ puts Samer.find_for ARGV[0]
@@ -0,0 +1,38 @@
1
+ # Electronic music
2
+ john:
3
+ 'trance': 5
4
+ 'ambient': 4
5
+ 'chillout': 4
6
+ 'rock': 3
7
+ 'pop': 1
8
+ 'heavy-metal': 1
9
+ # Pop, ballad
10
+ jane:
11
+ 'trance': 1
12
+ 'ambient': 2
13
+ 'chillout': 3
14
+ 'ballad': 4
15
+ 'pop': 5
16
+ # Rock
17
+ jake:
18
+ 'rock': 5
19
+ 'heavy-metal': 4
20
+ 'pop': 1
21
+ 'ballad': 2
22
+ 'trance': 1
23
+ # Pop, ballad
24
+ jasmine:
25
+ 'pop': 5
26
+ 'ballad': 4
27
+ 'heavy-metal': 1
28
+ 'rock': 2
29
+ 'trance': 1
30
+ 'ambient': 2
31
+ # Chillout, ambient, ballad
32
+ johanna:
33
+ 'ambient': 5
34
+ 'ballad': 3
35
+ 'chillout': 4
36
+ 'pop': 2
37
+ 'rock': 2
38
+ 'heavy-metal': 0
@@ -0,0 +1,12 @@
1
+ require 'yaml'
2
+ require 'samer/data_provider'
3
+ require 'samer/engine'
4
+
5
+ module Samer
6
+
7
+ def self.find_for name
8
+ @engine ||= Engine.new(DataProvider.new.prepare)
9
+ @engine.find_for name
10
+ end
11
+
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'samer/user'
2
+
3
+ module Samer
4
+ class DataProvider
5
+
6
+ DATA_PATH = File.expand_path '../../data/users.yml', __FILE__
7
+
8
+ def initialize
9
+ @data = YAML.load_file DATA_PATH
10
+ end
11
+
12
+ def prepare
13
+ @data.keys.map!{ |name| User.new name, @data[name] }
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ # require 'samer/similar_user'
2
+
3
+ module Samer
4
+ class Engine
5
+
6
+ def initialize users
7
+ @users = users
8
+ end
9
+
10
+ def find_for name
11
+ similar = {}
12
+ current_user = @users.find{ |user| user.name == name }
13
+
14
+ @users.each do |user|
15
+ next if user.name == current_user.name
16
+ similar[user.name] = distance(current_user, user)
17
+ end
18
+
19
+ similar.max_by{ |_, score| score }
20
+ end
21
+
22
+
23
+ private
24
+
25
+ def distance current_user, user
26
+ distances = []
27
+
28
+ current_user.music.keys.each do |genre|
29
+ next unless user.music[genre]
30
+ distances.push (current_user.music[genre] - user.music[genre]) ** 2
31
+ end
32
+
33
+ 1.fdiv 1 + Math.sqrt(distances.inject(0){ |sum, score| sum + score })
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ module Samer
2
+ class SimilarUser
3
+
4
+ def initialize
5
+ @similar = {}
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Samer
2
+ class User
3
+
4
+ attr_reader :name, :music
5
+
6
+ def initialize name, music
7
+ @name = name
8
+ @music = music
9
+ end
10
+
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: samer
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Evgeniy Fateev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A simple gem that finds similar person to you by comparing music ratings
14
+ email: spaceflow@gmail.com
15
+ executables:
16
+ - samer
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/samer
21
+ - lib/data/users.yml
22
+ - lib/samer.rb
23
+ - lib/samer/data_provider.rb
24
+ - lib/samer/engine.rb
25
+ - lib/samer/similar_user.rb
26
+ - lib/samer/user.rb
27
+ homepage: http://rubygems.org/gems/samer
28
+ licenses:
29
+ - MIT
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 2.2.2
48
+ signing_key:
49
+ specification_version: 4
50
+ summary: Find someone like you!
51
+ test_files: []