rsamer 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1de85a3f4d06872d699e9b3c41c6db5bc29fbca4
4
+ data.tar.gz: 7d56e7f6c9e2be7d0dfdcb15af6d95da74833c24
5
+ SHA512:
6
+ metadata.gz: 7283a190b04f9dd450227d93f92631d22c557f2feaeae456bc2a9a3d61eea4891d59e9fd0f9f49b8d9066cb79df9b94eb5dca4a2bf930888bb7bda4013ce5ed0
7
+ data.tar.gz: 84a0167c4a2735398db2f4625c5472200052579308fa9b88582c9a2eaf618b78d18ca2e9a2bf36dd25597ee17845b97cd5b8ae9483f645b6372779bfe7be5b76
@@ -0,0 +1,37 @@
1
+ john:
2
+ 'trance' : 5
3
+ 'ambient' : 4
4
+ 'chillout' : 4
5
+ 'rock' : 3
6
+ 'pop' : 1
7
+ 'heavy-metal' : 1
8
+
9
+ jane:
10
+ 'trance' : 1
11
+ 'ambient' : 2
12
+ 'chillout' : 3
13
+ 'pop' : 5
14
+ 'ballad' : 4
15
+
16
+ jake:
17
+ 'trance' : 1
18
+ 'pop' : 1
19
+ 'ballad' : 2
20
+ 'rock' : 5
21
+ 'heavy-metal' : 4
22
+
23
+ jasmine:
24
+ 'trance' : 1
25
+ 'pop' : 5
26
+ 'ballad' : 4
27
+ 'rock' : 2
28
+ 'heavy-metal' : 1
29
+ 'ambient' : 2
30
+
31
+ johanna:
32
+ 'pop' : 2
33
+ 'ballad' : 3
34
+ 'rock' : 2
35
+ 'chillout' : 4
36
+ 'heavy-metal' : 0
37
+ 'ambient' : 5
@@ -0,0 +1,15 @@
1
+ require_relative 'user'
2
+ module Rsamer
3
+ class DataProvider
4
+
5
+ DATA_PATH = File.expand_path '../../data/users.yml', __FILE__
6
+
7
+ def initialize
8
+ @data = YAML.load_file DATA_PATH
9
+ end
10
+
11
+ def prepare
12
+ @data.keys.map!{ |name| User.new name, @data[name] }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,66 @@
1
+ module Rsamer
2
+ class Engine
3
+
4
+ attr_reader :users
5
+
6
+ def initialize users
7
+ @users = users
8
+ end
9
+
10
+ def find_for name
11
+ @name = name
12
+ @similars = {}
13
+ return "User #{@name} in mot present in example. See in the lib/data/users.yml" unless current_user
14
+
15
+ @users.each do |user|
16
+ next if user.name == current_user.name
17
+ @similars[user.name] = distance(current_user, user)
18
+ end
19
+ similar
20
+ end
21
+
22
+ def recommend name
23
+ find_for name
24
+ recommendations = []
25
+ similar_user.genres.each do |genre|
26
+ recommendations.push genre[0] unless genre[1] < 3 || current_user_have?(genre[0])
27
+ end
28
+ if recommendations.any?
29
+ "We advise you to listen #{recommendations.join}"
30
+ else
31
+ "Sorry, but we can not advise you anything"
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def current_user_have? genre
38
+ current_user.genres.keys.find{ |user_genre| user_genre == genre }
39
+ end
40
+
41
+ def distance current_user, user
42
+ distances = []
43
+
44
+ current_user.genres.keys.each do |genre|
45
+ next unless user.genres[genre]
46
+ distances.push (current_user.genres[genre] - user.genres[genre])**2
47
+ end
48
+
49
+ 1.fdiv 1 + Math.sqrt(distances.inject(0){ |sum, score| sum + score })
50
+ end
51
+
52
+ def current_user
53
+ @current_user ||= @users.find{ |user| user.name == @name }
54
+ end
55
+
56
+ def similar_user
57
+ @similar_user ||= @users.find{ |user| user.name == similar.first }
58
+ end
59
+
60
+ def similar
61
+ @similars.max_by{ |_, score| score }
62
+ end
63
+
64
+
65
+ end
66
+ end
@@ -0,0 +1,11 @@
1
+ module Rsamer
2
+ class User
3
+
4
+ attr_reader :name, :genres
5
+
6
+ def initialize name, genres
7
+ @name = name
8
+ @genres = genres
9
+ end
10
+ end
11
+ end
data/lib/rsamer.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'yaml'
2
+ require 'active_support/all'
3
+ require_relative 'rsamer/data_provider'
4
+ require_relative 'rsamer/engine'
5
+
6
+ module Rsamer
7
+
8
+ def self.find_for name
9
+ engine.find_for name
10
+ end
11
+
12
+ def self.recommend name
13
+ engine.recommend name
14
+ end
15
+
16
+ private
17
+ def self.engine
18
+ @engine ||= Engine.new(DataProvider.new.prepare)
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rsamer
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexey Spiridonov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-14 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Use Rsamer.find "...", Rsamer.recommend "..."
14
+ email: alex9spiridonov@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/data/users.yml
20
+ - lib/rsamer.rb
21
+ - lib/rsamer/data_provider.rb
22
+ - lib/rsamer/engine.rb
23
+ - lib/rsamer/user.rb
24
+ homepage: http://rubygems.org/gems/rsamer
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements:
43
+ - Internet connection,
44
+ - A good mood
45
+ rubyforge_project:
46
+ rubygems_version: 2.4.6
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: Find similar users
50
+ test_files: []