Skip to content

Commit e6cfe03

Browse files
authored
Merge pull request #1 from rubygarage/feature/first-working-version
First working version
2 parents 389519b + 22ac693 commit e6cfe03

File tree

19 files changed

+449
-5
lines changed

19 files changed

+449
-5
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@
1414
.rvmrc
1515
.ruby-gemset
1616
.ruby-version
17+
18+
.byebug_history

detectify.gemspec

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ Gem::Specification.new do |spec|
1717
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
1818
spec.require_paths = ['lib']
1919

20+
spec.add_dependency 'rack', '>= 1.6'
21+
spec.add_dependency 'activerecord', '>= 4.2'
22+
23+
spec.add_development_dependency 'byebug', '~> 9.0'
2024
spec.add_development_dependency 'bundler', '~> 1.12'
2125
spec.add_development_dependency 'rake', '~> 10.0'
2226
spec.add_development_dependency 'rspec', '~> 3.0'

lib/detectify.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,30 @@
11
require 'detectify/version'
2+
require 'detectify/config'
3+
require 'detectify/query_builder/base'
4+
require 'detectify/query_builder/sql'
5+
require 'detectify/detector'
6+
require 'detectify/middleware'
27

38
module Detectify
9+
def self.configure
10+
yield(config)
11+
end
12+
13+
def self.config
14+
@config || reset_config
15+
end
16+
17+
def self.reset_config(config = Config.new)
18+
@config = config
19+
end
20+
21+
def self.entity_class
22+
if config.entity_class.is_a?(String)
23+
Object.const_get(config.entity_class)
24+
else
25+
config.entity_class
26+
end
27+
end
428
end
29+
30+
require 'detectify/railtie' if defined?(::Rails)

lib/detectify/config.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module Detectify
2+
class Config
3+
attr_accessor :entity_class, :tld_length, :ignore_urls,
4+
:domain_column, :subdomain_column
5+
6+
def initialize
7+
@entity_class = 'Account'
8+
@tld_length = 1
9+
@ignore_urls = []
10+
@domain_column = 'domain'
11+
@subdomain_column = 'subdomain'
12+
end
13+
end
14+
end

lib/detectify/detector.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require 'uri'
2+
3+
module Detectify
4+
class Detector
5+
attr_reader :request_uri
6+
7+
def initialize(request_url, query_builder = QueryBuilder::SQL)
8+
@request_uri = URI(request_url)
9+
@query_builder = query_builder
10+
end
11+
12+
def detect
13+
@entity ||= Detectify.entity_class.where(*query).first unless ignore?
14+
end
15+
16+
private
17+
18+
def ignore?
19+
@request_uri.to_s[Regexp.union(*Detectify.config.ignore_urls)]
20+
end
21+
22+
def query
23+
@query_builder.new(domain, subdomain).build
24+
end
25+
26+
def domain
27+
request_uri.host
28+
end
29+
30+
def subdomain
31+
chunks = request_uri.host.split('.')
32+
chunks[0...(1 - Detectify.config.tld_length - 2)].join
33+
end
34+
end
35+
end

lib/detectify/middleware.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Detectify
2+
class Middleware
3+
def initialize(app)
4+
@app = app
5+
end
6+
7+
def call(env)
8+
request = Rack::Request.new(env)
9+
detector = Detector.new(request.url)
10+
11+
env['Detectify-Entity'] = detector.detect
12+
13+
@app.call(env)
14+
end
15+
end
16+
end

lib/detectify/query_builder/base.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module Detectify
2+
module QueryBuilder
3+
class Base
4+
attr_reader :domain, :subdomain
5+
6+
def initialize(domain, subdomain)
7+
@domain = domain
8+
@subdomain = subdomain
9+
end
10+
11+
def build
12+
raise(NotImplementedError)
13+
end
14+
15+
private
16+
17+
def need_domain_clause?
18+
Detectify.config.domain_column && domain
19+
end
20+
21+
def need_subdomain_clause?
22+
Detectify.config.subdomain_column && subdomain
23+
end
24+
end
25+
end
26+
end

lib/detectify/query_builder/sql.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module Detectify
2+
module QueryBuilder
3+
class SQL < Base
4+
def build
5+
@query ||= begin
6+
query = ["#{domain_clause}#{or_operator}#{subdomain_clause}"]
7+
query << domain if need_domain_clause?
8+
query << subdomain if need_subdomain_clause?
9+
query.compact
10+
end
11+
end
12+
13+
private
14+
15+
def domain_clause
16+
"#{Detectify.config.domain_column} = ?" if need_domain_clause?
17+
end
18+
19+
def subdomain_clause
20+
"#{Detectify.config.subdomain_column} = ?" if need_subdomain_clause?
21+
end
22+
23+
def or_operator
24+
' OR ' if need_domain_clause? && need_subdomain_clause?
25+
end
26+
end
27+
end
28+
end

lib/detectify/railtie.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Detectify
2+
class Railtie < Rails::Railtie
3+
initializer 'detectify' do |app|
4+
app.config.middleware.use 'Detectify::Middleware'
5+
end
6+
end
7+
end

lib/detectify/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module Detectify
2-
VERSION = '0.1.0'
2+
VERSION = '0.1.0'.freeze
33
end

0 commit comments

Comments
 (0)