├── spec ├── benchmarks │ └── .keep ├── spec_helper.rb ├── fixtures │ └── multiple_categories.json ├── soulheart │ ├── server_spec.rb │ ├── helpers_spec.rb │ ├── matcher_spec.rb │ └── loader_spec.rb └── soulheart_spec.rb ├── .rspec ├── lib ├── soulheart │ ├── version.rb │ ├── helpers.rb │ ├── server.rb │ ├── base.rb │ ├── config.rb │ ├── matcher.rb │ └── loader.rb └── soulheart.rb ├── examples ├── logo.png ├── screenshot.png ├── categories.json ├── manufacturers_simple.tsv └── manufacturers.tsv ├── config.ru ├── Guardfile ├── .gitignore ├── Gemfile ├── app.json ├── .travis.yml ├── bin ├── soulheart-web └── soulheart ├── soulheart.gemspec ├── LICENSE.md ├── Rakefile ├── Gemfile.lock └── README.md /spec/benchmarks/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --format documentation -------------------------------------------------------------------------------- /lib/soulheart/version.rb: -------------------------------------------------------------------------------- 1 | module Soulheart 2 | VERSION = '0.4.0' 3 | end 4 | -------------------------------------------------------------------------------- /examples/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sethherr/soulheart/HEAD/examples/logo.png -------------------------------------------------------------------------------- /examples/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sethherr/soulheart/HEAD/examples/screenshot.png -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/lib/') 4 | 5 | require 'bundler' 6 | require 'soulheart/server' 7 | 8 | run Soulheart::Server 9 | -------------------------------------------------------------------------------- /Guardfile: -------------------------------------------------------------------------------- 1 | guard :rspec, failed_mode: :focus, cmd: 'bundle exec rspec' do 2 | watch(%r{^spec/.+_spec\.rb$}) 3 | watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } 4 | watch(%r{^lib/soulheart/(.+)\.rb$}) { |m| "spec/soulheart/#{m[1]}_spec.rb" } 5 | end 6 | -------------------------------------------------------------------------------- /lib/soulheart.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | require 'soulheart/version' 3 | require 'soulheart/helpers' 4 | require 'soulheart/base' 5 | require 'soulheart/matcher' 6 | require 'soulheart/loader' 7 | require 'soulheart/config' 8 | 9 | module Soulheart 10 | extend Config 11 | end 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # rdoc generated 2 | rdoc 3 | 4 | # yard generated 5 | doc 6 | .yardoc 7 | 8 | # bundler 9 | .bundle 10 | 11 | gem 12 | 13 | test/db/*.rdb 14 | 15 | dump.rdb 16 | tmp/ 17 | 18 | .rvmrc 19 | .ruby-* 20 | .tool-versions 21 | 22 | _site 23 | .sass-cache 24 | 25 | # Ignore benchmarking 26 | spec/benchmarks/*.html -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'http://rubygems.org' 2 | 3 | group :development do 4 | gem 'rspec', '~> 2.14.1' 5 | gem 'bundler' 6 | gem 'guard' 7 | gem 'guard-rspec', '~> 4.2.8' 8 | gem 'rubocop' 9 | end 10 | 11 | group :test do 12 | gem 'rack-test' 13 | end 14 | 15 | gem 'rake' 16 | gem 'soulheart' 17 | gem 'vegas', '>= 0.1.0' 18 | gem 'sinatra' 19 | 20 | platforms :ruby do 21 | gem 'hiredis' 22 | gem 'redis', '>= 3.2.0', require: ['redis', 'redis/connection/hiredis'] 23 | end 24 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Soulheart", 3 | "description": "Autocomplete remote data source", 4 | "repository": "https://github.com/sethherr/soulheart", 5 | "logo": "https://raw.githubusercontent.com/sethherr/soulheart/master/examples/logo.png", 6 | "keywords": [ 7 | "ruby", 8 | "autocomplete", 9 | "redis", 10 | "heart", 11 | "typeahead" 12 | ], 13 | "addons": [ 14 | "heroku-redis:hobby-dev" 15 | ], 16 | "env": { 17 | "CUSTOM_RUBY_VERSION": "2.2.5" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - 2.1.0 4 | bundler_args: "--without=guard" 5 | notifications: 6 | disabled: true 7 | before_install: 8 | - gem install bundler 9 | - gem update bundler 10 | script: 11 | - bundle exec rake spec 12 | services: 13 | - redis 14 | rvm: 15 | - 2.3 16 | - 2.7 17 | - jruby 18 | - jruby-head 19 | matrix: 20 | allow_failures: 21 | - rvm: jruby-head 22 | addons: 23 | code_climate: 24 | repo_token: e72d8fa152922cef05c311cd49d3db9016b82486b712399a8e7c7da2af5e071e 25 | branches: 26 | except: 27 | - gh-pages -------------------------------------------------------------------------------- /lib/soulheart/helpers.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | module Soulheart 3 | module Helpers 4 | def normalize(str) 5 | # Letter, Mark, Number, Connector_Punctuation (Chinese, Japanese, etc.) 6 | str.downcase.gsub(/#{Soulheart.normalizer}/i, '').strip 7 | end 8 | 9 | def prefixes_for_phrase(phrase) 10 | words = normalize(phrase).split(' ').reject do |w| 11 | Soulheart.stop_words.include?(w) 12 | end 13 | words.map do |w| 14 | (0..(w.length - 1)).map { |l| w[0..l] } 15 | end.flatten.uniq 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'rack/test' 2 | require 'rspec' 3 | 4 | $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) 5 | require 'soulheart' 6 | require 'soulheart/server' 7 | 8 | ENV['RACK_ENV'] = 'test' 9 | 10 | module RSpecMixin 11 | include Rack::Test::Methods 12 | def app 13 | Soulheart::Server 14 | end 15 | end 16 | 17 | RSpec.configure do |config| 18 | config.treat_symbols_as_metadata_keys_with_true_values = true 19 | config.include RSpecMixin 20 | end 21 | 22 | def store_terms_fixture 23 | items = [] 24 | file = File.read('spec/fixtures/multiple_categories.json') 25 | file.each_line { |l| items << JSON.parse(l) } 26 | loader = Soulheart::Loader.new 27 | loader.clear(true) 28 | loader.load(items) 29 | end 30 | -------------------------------------------------------------------------------- /bin/soulheart-web: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') 4 | begin 5 | require 'vegas' 6 | rescue LoadError 7 | require 'rubygems' 8 | require 'vegas' 9 | end 10 | require 'soulheart/server' 11 | 12 | Vegas::Runner.new(Soulheart::Server, 'soulheart-web') do |runner, opts| 13 | opts.on('-r', '--redis [HOST:PORT]', 'Redis connection string') do |host| 14 | runner.logger.info "Using Redis connection string '#{host}'" 15 | Soulheart.redis = host 16 | end 17 | opts.on('-s', '--stop-words [FILE]', 'Path to file containing a list of stop words') do |fn| 18 | File.open(fn) do |file| 19 | Soulheart.stop_words = file.readlines.map(&:strip).reject(&:empty?) 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /soulheart.gemspec: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | require File.expand_path('../lib/soulheart/version', __FILE__) 3 | 4 | Gem::Specification.new do |gem| 5 | gem.version = Soulheart::VERSION 6 | gem.authors = ['Seth Herr'] 7 | gem.email = ['seth.william.herr@gmail.com'] 8 | gem.description = gem.summary = 'Simple, fast autocomplete server for Ruby and Rails' 9 | gem.homepage = 'https://github.com/sethherr/soulheart' 10 | gem.license = 'MIT' 11 | gem.executables = ['soulheart', 'soulheart-web'] 12 | gem.files = `git ls-files README.md Rakefile LICENSE.md lib bin`.split("\n") 13 | gem.name = 'soulheart' 14 | gem.require_paths = ['lib'] 15 | gem.add_dependency 'redis', '>= 3.0.5' 16 | gem.add_dependency 'vegas', '>= 0.1.0' 17 | gem.add_dependency 'sinatra', '>= 1.4.4' 18 | gem.add_development_dependency 'rake', '~> 10.4' 19 | gem.add_development_dependency 'rspec', '>= 2.14', '< 4.0' 20 | end 21 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2015 Eric Waller, Seth Herr, and Soulheart contributors 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /lib/soulheart/server.rb: -------------------------------------------------------------------------------- 1 | require 'sinatra/base' 2 | require 'soulheart' 3 | 4 | module Soulheart 5 | class Server < Sinatra::Base 6 | include Helpers 7 | 8 | before do 9 | content_type 'application/json', charset: 'utf-8' 10 | headers['Access-Control-Allow-Origin'] = '*' 11 | headers['Access-Control-Allow-Methods'] = 'POST, PUT, GET, OPTIONS' 12 | headers['Access-Control-Request-Method'] = '*' 13 | headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 14 | end 15 | 16 | get '/' do 17 | matches = Matcher.new(params).matches 18 | {matches: matches}.to_json 19 | end 20 | 21 | get '/categories' do 22 | {categories: Base.new.sorted_category_array}.to_json 23 | end 24 | 25 | get '/info' do 26 | info = Soulheart::Base.new.redis.info 27 | { 28 | soulheart_version: Soulheart::VERSION, 29 | current_time: Time.now.utc.strftime('%H:%M:%S UTC'), 30 | redis_used_memory: info['used_memory_human'], 31 | stop_words: Soulheart.stop_words, 32 | normalizer: Soulheart.normalizer, 33 | }.to_json 34 | end 35 | 36 | not_found do 37 | content_type 'application/json', charset: 'utf-8' 38 | {error: 'not found'}.to_json 39 | end 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env rake 2 | 3 | require 'bundler/gem_helper' 4 | 5 | begin 6 | Bundler.setup(:default, :development) 7 | rescue Bundler::BundlerError => e 8 | $stderr.puts e.message 9 | $stderr.puts 'Run `bundle install` to install missing gems' 10 | exit e.status_code 11 | end 12 | require 'rake' 13 | 14 | REDIS_DIR = File.expand_path(File.join('..', 'test'), __FILE__) 15 | REDIS_CNF = File.join(REDIS_DIR, 'test.conf') 16 | REDIS_PID = File.join(REDIS_DIR, 'db', 'redis.pid') 17 | REDIS_LOCATION = ENV['REDIS_LOCATION'] 18 | 19 | desc 'Run rcov and manage server start/stop' 20 | task rcoverage: [:start, :rcov, :stop] 21 | 22 | desc 'Start the Redis server' 23 | task :start do 24 | redis_running = \ 25 | begin 26 | File.exist?(REDIS_PID) && Process.kill(0, File.read(REDIS_PID).to_i) 27 | rescue Errno::ESRCH 28 | FileUtils.rm REDIS_PID 29 | false 30 | end 31 | 32 | if REDIS_LOCATION 33 | system "#{REDIS_LOCATION}/redis-server #{REDIS_CNF}" unless redis_running 34 | else 35 | system "redis-server #{REDIS_CNF}" unless redis_running 36 | end 37 | end 38 | 39 | desc 'Stop the Redis server' 40 | task :stop do 41 | if File.exist?(REDIS_PID) 42 | Process.kill 'INT', File.read(REDIS_PID).to_i 43 | FileUtils.rm REDIS_PID 44 | end 45 | end 46 | 47 | require 'rspec/core/rake_task' 48 | 49 | desc 'Run all specs' 50 | RSpec::Core::RakeTask.new(:spec) do |t| 51 | t.rspec_opts = %w(--color) 52 | t.verbose = false 53 | end 54 | 55 | task default: :spec 56 | -------------------------------------------------------------------------------- /spec/fixtures/multiple_categories.json: -------------------------------------------------------------------------------- 1 | {"text":"Steel","category":"Frame Materials" } 2 | {"text":"Brompton Bicycle","priority":51,"category":"Frame Manufacturer","data":{"id":8,"url":"http://www.brompton.com"}} 3 | {"text":"Jamis","priority":101,"category":"Frame Manufacturer","data":{"id":2222,"url":"http://jamisbikes.com"}} 4 | {"text":"Surly","priority":101,"category":"Frame Manufacturer"} 5 | {"text":"Jagwire","priority":40,"category":"Manufacturer"} 6 | {"text":"Jannd","priority":41,"category":"Manufacturer"} 7 | {"text":"Sram","priority":50,"category":"Manufacturer","data":{"id":8,"url":"http://sram.com"}} 8 | {"text":"Brooks England LTD.","priority":50,"category":"Manufacturer","data":{"id":200,"url":"http://www.brooksengland.com/"}} 9 | {"text":"Dodger Stadium","priority":84,"data":{"id":1,"url":"\/dodger-stadium-tickets\/","subtitle":"Los Angeles, CA"},"aliases":["Chavez Ravine"]} 10 | {"text":"Angel Stadium","priority":90,"data":{"id":28,"url":"\/angel-stadium-tickets\/","subtitle":"Anaheim, CA"},"aliases":["Edison International Field of Anaheim"]} 11 | {"text":"Chase Field ","priority":80,"data":{"id":30,"url":"\/chase-field-tickets\/","subtitle":"Phoenix, AZ"},"aliases":["Bank One Ballpark", "Bank One Stadium"]} 12 | {"text":"Sun Life Stadium","priority":75,"data":{"id":29,"url":"\/sun-life-stadium-tickets\/","subtitle":"Miami, FL"},"aliases":["Dolphins Stadium","Land Shark Stadium"]} 13 | {"text":"Turner Field","priority":50,"data":{"id":2,"url":"\/turner-field-tickets\/","subtitle":"Atlanta, GA"}} 14 | {"text":"Citi Field","priority":92,"data":{"id":3,"url":"\/citi-field-tickets\/","subtitle":"Atlanta, GA"},"aliases":["Shea Stadium"]} 15 | {"text":"中国佛山 李小龙","priority":94,"data":{"id":8,"url":"\/Bruce Lee\/","subtitle":"Chinese Foshan"},"aliases":["Li XiaoLong"]} -------------------------------------------------------------------------------- /lib/soulheart/base.rb: -------------------------------------------------------------------------------- 1 | module Soulheart 2 | class Base 3 | include Helpers 4 | 5 | attr_accessor :type 6 | 7 | def redis 8 | Soulheart.redis 9 | end 10 | 11 | def cache_duration 12 | 10 * 60 # Setting to 10 minutes, but making it possible to edit down the line 13 | end 14 | 15 | def sorted_category_array 16 | redis.smembers(categories_id).map { |c| normalize(c) }.uniq.sort 17 | end 18 | 19 | def hidden_category_array 20 | redis.smembers(hidden_categories_id).map { |c| normalize(c) }.uniq.sort 21 | end 22 | 23 | def combinatored_category_array 24 | 1.upto(sorted_category_array.size). 25 | flat_map { |n| sorted_category_array.combination(n). 26 | map { |el| el.join('') } } 27 | end 28 | 29 | def set_category_combos_array 30 | redis.expire category_combos_id, 0 31 | array = combinatored_category_array 32 | array.any? ? array.last.replace('all') : array << 'all' 33 | redis.sadd category_combos_id, array 34 | array 35 | end 36 | 37 | def category_combos_id 38 | "#{Soulheart.base_id}category_combos:" 39 | end 40 | 41 | def category_combos 42 | redis.smembers(category_combos_id) 43 | end 44 | 45 | def categories_id 46 | "#{Soulheart.base_id}categories:" 47 | end 48 | 49 | def hidden_categories_id 50 | "#{categories_id}hidden:" 51 | end 52 | 53 | def category_id(name = 'all') 54 | "#{categories_id}#{name}:" 55 | end 56 | 57 | def no_query_id(category = category_id) 58 | "all:#{category}" 59 | end 60 | 61 | def results_hashes_id 62 | "#{Soulheart.base_id}database:" 63 | end 64 | 65 | def normalize_type_id 66 | "#{Soulheart.base_id}normalize:" 67 | end 68 | 69 | 70 | def cache_id(type = 'all') 71 | "#{Soulheart.base_id}cache:#{type}:" 72 | end 73 | end 74 | end 75 | -------------------------------------------------------------------------------- /spec/soulheart/server_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Soulheart::Server do 4 | describe :search do 5 | it 'Has CORS headers, JSON Content-Type and it succeeds' do 6 | get '/' 7 | expect(last_response.headers['Access-Control-Allow-Origin']).to eq('*') 8 | expect(last_response.headers['Access-Control-Request-Method']).to eq('*') 9 | expect(last_response.headers['Content-Type']).to match('json') 10 | expect(last_response.status).to eq(200) 11 | expect(JSON.parse(last_response.body).keys).to eq(['matches']) 12 | end 13 | end 14 | 15 | describe :not_found do 16 | it 'Renders not found' do 17 | get '/not-here' 18 | expect(last_response.headers['Content-Type']).to match('json') 19 | expect(last_response.status).to eq(404) 20 | expect(JSON.parse(last_response.body).keys).to eq(['error']) 21 | end 22 | end 23 | 24 | describe :categories do 25 | it 'Renders the categories' do 26 | Soulheart::Loader.new.reset_categories(%w(sweet test cool)) 27 | get '/categories' 28 | expect(last_response.headers['Content-Type']).to match('json') 29 | expect(last_response.headers['Access-Control-Allow-Origin']).to eq('*') 30 | expect(last_response.headers['Access-Control-Request-Method']).to eq('*') 31 | expect(last_response.headers['Content-Type']).to match('json') 32 | expect(JSON.parse(last_response.body)['categories']).to eq(['cool', 'sweet', 'test']) 33 | end 34 | end 35 | 36 | describe :info do 37 | it 'Has cors headers and is valid JSON' do 38 | get '/info' 39 | expect(last_response.headers['Access-Control-Allow-Origin']).to eq('*') 40 | expect(last_response.headers['Access-Control-Request-Method']).to eq('*') 41 | expect(last_response.headers['Content-Type']).to match('json') 42 | expect(JSON.parse(last_response.body)['soulheart_version']).to match(/\d/) 43 | expect(JSON.parse(last_response.body)['current_time']).to_not be_nil 44 | expect(JSON.parse(last_response.body)['redis_used_memory']).to_not be_nil 45 | end 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /lib/soulheart/config.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require 'uri' 3 | require 'redis' 4 | 5 | module Soulheart 6 | module Config 7 | 8 | 9 | # Accepts: 10 | # 1. A Redis URL String 'redis://host:port/db' 11 | # 2. An existing instance of Redis, Redis::Namespace, etc. 12 | def redis=(server) 13 | if server.is_a?(String) 14 | @redis = nil 15 | @redis_url = server 16 | else 17 | @redis = server 18 | end 19 | 20 | redis 21 | end 22 | 23 | def jruby? 24 | RUBY_ENGINE == 'jruby' 25 | end 26 | 27 | # Returns the current Redis connection. If none has been created, will 28 | # create a new one. 29 | def redis 30 | @redis ||= ( 31 | url = URI(@redis_url || ENV['REDIS_URL'] || 'redis://127.0.0.1:6379/0') 32 | ::Redis.new( 33 | driver: (jruby? ? :ruby : :hiredis), 34 | host: url.host, 35 | port: url.port, 36 | db: url.path[1..-1], 37 | password: url.password) 38 | ) 39 | end 40 | 41 | def base_id 42 | ENV['RACK_ENV'] != 'test' ? 'soulheart:' : 'soulheart_test:' 43 | end 44 | 45 | def stop_words_id 46 | "#{base_id}stop_list:" 47 | end 48 | 49 | def default_stop_words 50 | %w(vs at the) 51 | end 52 | 53 | def redis_stop_words 54 | return false unless redis.exists stop_words_id 55 | redis.lrange(stop_words_id, 0, -1) 56 | end 57 | 58 | def stop_words 59 | @stop_words ||= redis_stop_words || default_stop_words 60 | end 61 | 62 | def stop_words=(arr) 63 | redis.expire stop_words_id, 0 64 | @stop_words = Array(arr).flatten 65 | redis.lpush stop_words_id, @stop_words 66 | end 67 | 68 | def normalizer_id 69 | "#{base_id}normalizer:" 70 | end 71 | 72 | def default_normalizer 73 | '[^\p{Word}\ ]' 74 | end 75 | 76 | def redis_normalizer 77 | return false unless redis.exists normalizer_id 78 | redis.get normalizer_id 79 | end 80 | 81 | def normalizer 82 | @normalizer ||= redis_normalizer || default_normalizer 83 | end 84 | 85 | def normalizer=(str) 86 | redis.expire normalizer_id, 0 87 | @normalizer = str 88 | redis.set normalizer_id, @normalizer 89 | end 90 | end 91 | end 92 | -------------------------------------------------------------------------------- /spec/soulheart_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Soulheart do 4 | it 'Has a version number' do 5 | expect(Soulheart::VERSION).not_to be nil 6 | end 7 | 8 | it 'Has a test base_id' do 9 | expect(Soulheart.base_id).to eq('soulheart_test:') 10 | end 11 | 12 | it 'Has a cache expiration time' do 13 | expect(Soulheart::Base.new.cache_duration).to eq(600) 14 | end 15 | 16 | it 'Uses the correct driver for redis' do 17 | redis = Soulheart::Base.new.redis 18 | if RUBY_ENGINE == 'jruby' 19 | expect(redis.client.options[:driver].to_s).to match /ruby/i 20 | else 21 | expect(redis.client.options[:driver].to_s).to match /hiredis/i 22 | end 23 | end 24 | 25 | it 'gets the sorted_category_array without hidden_categories' do 26 | base = Soulheart::Base.new 27 | base.redis.expire base.categories_id, 0 28 | base.redis.sadd base.categories_id, ['George', 'category one', 'other thing '] 29 | base.redis.sadd base.hidden_categories_id, ['scotch', 'foobar'] 30 | expect(base.sorted_category_array).to eq(['category one', 'george', 'other thing']) 31 | end 32 | 33 | it 'gets the hidden_category_array' do 34 | base = Soulheart::Base.new 35 | base.redis.expire base.hidden_categories_id, 0 36 | base.redis.sadd base.categories_id, ['George', 'category one', 'other thing '] 37 | base.redis.sadd base.hidden_categories_id, ['scotch', 'foobar'] 38 | expect(base.hidden_category_array).to eq(['foobar', 'scotch']) 39 | end 40 | 41 | it 'Combinates all the things' do 42 | base = Soulheart::Base.new 43 | base.redis.expire base.categories_id, 0 44 | base.redis.sadd base.categories_id, ['George', 'category one', 'other thing '] 45 | result = base.set_category_combos_array 46 | expect(result.include?('category one')).to be_true 47 | expect(result.include?('george')).to be_true 48 | expect(result.include?('other thing')).to be_true 49 | expect(result.include?('georgeother thing')).to be_true 50 | expect(result.include?('category oneother thing')).to be_true 51 | expect(result.include?('category onegeorge')).to be_true 52 | expect(result.include?('georgecategory one')).to be_false 53 | expect(result.include?('all')).to be_true 54 | expect(result.include?('category onegeorgeother thing')).to be_false 55 | expect(base.redis.smembers(base.category_combos_id) - result).to eq([]) 56 | end 57 | end 58 | -------------------------------------------------------------------------------- /lib/soulheart/matcher.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | module Soulheart 3 | class Matcher < Base 4 | def initialize(params = {}) 5 | set_clean_opts(params) 6 | end 7 | 8 | attr_accessor :opts 9 | 10 | def self.default_params_hash 11 | { 12 | 'page' => 1, 13 | 'per_page' => 5, 14 | 'categories' => [], 15 | 'q' => '', # Query 16 | 'cache' => true 17 | } 18 | end 19 | 20 | def sort_categories(categories) 21 | return [] if categories.empty? 22 | categories = categories.split(/,|\+/) unless categories.is_a?(Array) 23 | categories = categories.map { |s| normalize(s) }.uniq.sort 24 | categories = [] if categories.length == redis.scard(categories_id) 25 | categories 26 | end 27 | 28 | def clean_opts 29 | @opts['categories'] = sort_categories(@opts['categories']) 30 | @opts['q'] = normalize(@opts['q']).split(' ') unless @opts['q'].is_a?(Array) 31 | # .reject{ |i| i && i.length > 0 } .split(' ').reject{ Soulmate.stop_words.include?(w) } 32 | @opts 33 | end 34 | 35 | def set_clean_opts(params) 36 | @opts = self.class.default_params_hash.merge params 37 | clean_opts 38 | @cachekey = cache_id_from_opts 39 | @cid = category_id_from_opts 40 | end 41 | 42 | def categories_string 43 | @opts['categories'].empty? ? 'all' : @opts['categories'].join('') 44 | end 45 | 46 | def category_id_from_opts 47 | category_id(categories_string) 48 | end 49 | 50 | def cache_id_from_opts 51 | "#{cache_id(categories_string)}#{@opts['q'].join(':')}" 52 | end 53 | 54 | def interkeys_from_opts 55 | # If there isn't a query, we use a special key in redis 56 | @opts['q'].empty? ? [no_query_id(@cid)] : @opts['q'].map { |w| "#{@cid}#{w}" } 57 | end 58 | 59 | def cache_it_because 60 | redis.zinterstore(@cachekey, interkeys_from_opts) 61 | redis.expire(@cachekey, cache_duration) # cache_duration is set in base.rb 62 | end 63 | 64 | def matching_hashes(terms) 65 | return [] unless terms.size > 0 66 | results = redis.hmget(results_hashes_id, *terms) 67 | results = results.reject(&:nil?) # handle cached results for terms which have since been deleted 68 | results.map { |r| JSON.parse(r) } 69 | end 70 | 71 | def matches 72 | cache_it_because if !@opts['cache'] || !redis.exists(@cachekey) || redis.exists(@cachekey) == 0 73 | offset = (@opts['page'].to_i - 1) * @opts['per_page'].to_i 74 | limit = @opts['per_page'].to_i + offset - 1 75 | 76 | limit = 0 if limit < 0 77 | terms = redis.zrange(@cachekey, offset, limit) 78 | matching_hashes(terms) 79 | end 80 | end 81 | end 82 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: http://rubygems.org/ 3 | specs: 4 | ast (2.0.0) 5 | astrolabe (1.3.0) 6 | parser (>= 2.2.0.pre.3, < 3.0) 7 | coderay (1.1.0) 8 | diff-lcs (1.2.5) 9 | ffi (1.9.10) 10 | ffi (1.9.10-java) 11 | formatador (0.2.5) 12 | guard (2.12.8) 13 | formatador (>= 0.2.4) 14 | listen (>= 2.7, <= 4.0) 15 | lumberjack (~> 1.0) 16 | nenv (~> 0.1) 17 | notiffany (~> 0.0) 18 | pry (>= 0.9.12) 19 | shellany (~> 0.0) 20 | thor (>= 0.18.1) 21 | guard-rspec (4.2.10) 22 | guard (~> 2.1) 23 | rspec (>= 2.14, < 4.0) 24 | hiredis (0.6.0) 25 | hiredis (0.6.0-java) 26 | listen (3.0.2) 27 | rb-fsevent (>= 0.9.3) 28 | rb-inotify (>= 0.9) 29 | lumberjack (1.0.9) 30 | method_source (0.8.2) 31 | multi_json (1.11.2) 32 | nenv (0.2.0) 33 | notiffany (0.0.6) 34 | nenv (~> 0.1) 35 | shellany (~> 0.0) 36 | parser (2.2.2.6) 37 | ast (>= 1.1, < 3.0) 38 | powerpack (0.1.1) 39 | pry (0.10.1) 40 | coderay (~> 1.1.0) 41 | method_source (~> 0.8.1) 42 | slop (~> 3.4) 43 | pry (0.10.1-java) 44 | coderay (~> 1.1.0) 45 | method_source (~> 0.8.1) 46 | slop (~> 3.4) 47 | spoon (~> 0.0) 48 | rack (1.6.4) 49 | rack-protection (1.5.3) 50 | rack 51 | rack-test (0.6.3) 52 | rack (>= 1.0) 53 | rainbow (2.0.0) 54 | rake (10.4.2) 55 | rb-fsevent (0.9.5) 56 | rb-inotify (0.9.5) 57 | ffi (>= 0.5.0) 58 | redis (3.2.1) 59 | rspec (2.14.1) 60 | rspec-core (~> 2.14.0) 61 | rspec-expectations (~> 2.14.0) 62 | rspec-mocks (~> 2.14.0) 63 | rspec-core (2.14.8) 64 | rspec-expectations (2.14.5) 65 | diff-lcs (>= 1.1.3, < 2.0) 66 | rspec-mocks (2.14.6) 67 | rubocop (0.32.1) 68 | astrolabe (~> 1.3) 69 | parser (>= 2.2.2.5, < 3.0) 70 | powerpack (~> 0.1) 71 | rainbow (>= 1.99.1, < 3.0) 72 | ruby-progressbar (~> 1.4) 73 | ruby-progressbar (1.7.5) 74 | shellany (0.0.1) 75 | sinatra (1.4.6) 76 | rack (~> 1.4) 77 | rack-protection (~> 1.4) 78 | tilt (>= 1.3, < 3) 79 | slop (3.6.0) 80 | soulheart (0.2.6) 81 | hiredis (~> 0.4, >= 0.4.5) 82 | multi_json (~> 1.11, >= 1.11.2) 83 | redis (~> 3.0, >= 3.0.5) 84 | sinatra (~> 1.4, >= 1.4.4) 85 | vegas (~> 0.1, >= 0.1.0) 86 | spoon (0.0.4) 87 | ffi 88 | thor (0.19.1) 89 | tilt (2.0.1) 90 | vegas (0.1.11) 91 | rack (>= 1.0.0) 92 | 93 | PLATFORMS 94 | java 95 | ruby 96 | 97 | DEPENDENCIES 98 | bundler 99 | guard 100 | guard-rspec (~> 4.2.8) 101 | hiredis 102 | rack-test 103 | rake 104 | redis (>= 3.2.0) 105 | rspec (~> 2.14.1) 106 | rubocop 107 | sinatra 108 | soulheart 109 | vegas (>= 0.1.0) 110 | 111 | BUNDLED WITH 112 | 2.2.15 113 | -------------------------------------------------------------------------------- /spec/soulheart/helpers_spec.rb: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | require 'spec_helper' 3 | 4 | describe Soulheart::Helpers do 5 | 6 | describe "Stop words" do 7 | after :each do # Reset the stop words, just to be sure 8 | Soulheart.stop_words = Soulheart.default_stop_words 9 | require 'soulheart' 10 | end 11 | 12 | it "sets stop words from redis" do 13 | target = ['party', 'cool', 'awesome'] 14 | redis = Soulheart::Base.new.redis 15 | redis.expire Soulheart.stop_words_id, 0 16 | redis.rpush Soulheart.stop_words_id, target 17 | require 'soulheart' 18 | expect(Soulheart.stop_words).to eq(target) 19 | end 20 | 21 | it "Obeys passed stop words" do 22 | soulheart = Soulheart::Base.new 23 | Soulheart.stop_words = 'with' 24 | prefixes1 = ['l', 'lo', 'loc', 'lock', 't', 'th', 'the', 'i', 'in', 'ink', 'p', 'pe', 'pen'] 25 | expect(soulheart.prefixes_for_phrase('lock with the ink pen')).to eq(prefixes1) 26 | end 27 | 28 | it "Obeys default stop words" do 29 | soulheart = Soulheart::Base.new 30 | 31 | prefixes1 = ['k', 'kn', 'kni', 'knic', 'knick', 'knicks'] 32 | expect(soulheart.prefixes_for_phrase('the knicks')).to eq(prefixes1) 33 | 34 | prefixes2 = ['t', 'te', 'tes', 'test', 'testi', 'testin', 'th', 'thi', 'this'] 35 | expect(soulheart.prefixes_for_phrase("testin' this")).to eq(prefixes2) 36 | 37 | prefixes3 = ['t', 'te', 'tes', 'test'] 38 | expect(soulheart.prefixes_for_phrase('test test')).to eq(prefixes3) 39 | 40 | prefixes4 = ['s', 'so', 'sou', 'soul', 'soulm', 'soulma', 'soulmat', 'soulmate'] 41 | expect(soulheart.prefixes_for_phrase('SoUlmATE')).to eq(prefixes4) 42 | 43 | prefixes5 = ['测', '测试', '测试中', '测试中文', 't', 'te', 'tes', 'test'] 44 | expect(soulheart.prefixes_for_phrase('测试中文 test')).to eq(prefixes5) 45 | 46 | prefixes6 = ['t', 'te', 'tet', 'teth', 'tethe', 'tether'] 47 | expect(soulheart.prefixes_for_phrase('tether')).to eq(prefixes6) 48 | end 49 | end 50 | 51 | describe "normalizing" do 52 | after :each do # Reset the normalizing words, just to be sure 53 | Soulheart.normalizer = Soulheart.default_normalizer 54 | require 'soulheart' 55 | end 56 | 57 | it "normalizes things by default" do 58 | Soulheart.normalizer = '[^\p{Word}\ ]' 59 | soulheart = Soulheart::Base.new 60 | expect(soulheart.normalize("somethin'_SPECialy888\t")).to eq('somethin_specialy888') 61 | end 62 | 63 | it "normalizes things without removing special characters" do 64 | soulheart = Soulheart::Base.new 65 | Soulheart.normalizer = '' 66 | expect(soulheart.normalize(" somethin'_SPECialy888")).to eq(("somethin'_specialy888")) 67 | end 68 | 69 | it "sets normalizer from redis" do 70 | Soulheart.normalizer = false # Give some help with the reset ;) 71 | target = '\s' 72 | redis = Soulheart::Base.new.redis 73 | redis.set Soulheart.normalizer_id, target 74 | require 'soulheart' 75 | redis = Soulheart::Base.new.redis 76 | expect(Soulheart.normalizer).to eq(target) 77 | end 78 | end 79 | 80 | end 81 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Soulheart Soulheart [![Build Status](https://travis-ci.org/sethherr/soulheart.svg?branch=master)](https://travis-ci.org/sethherr/soulheart) [![Code Climate](https://codeclimate.com/github/sethherr/soulheart/badges/gpa.svg)](https://codeclimate.com/github/sethherr/soulheart) [![Test Coverage](https://codeclimate.com/github/sethherr/soulheart/badges/coverage.svg)](https://codeclimate.com/github/sethherr/soulheart/coverage) 2 | 3 | Soulheart is a ready-to-use remote data source for autocomplete. The goal is to provide a solid, flexible tool that's downright easy to set up and use. 4 | 5 | - [Intro page](https://sethherr.github.io/soulheart/) 6 | - [Usage documentation (commands)](https://sethherr.github.io/soulheart/commands/) 7 | - [Example data sources](https://github.com/sethherr/soulheart/tree/master/examples) 8 | - [Getting started](#getting-started) 9 | - [Deployment](#deployment) 10 | - [Testing](#testing) 11 | - Example usage [with Selectize](https://sethherr.github.io/soulheart/examples_selectize) & [Select2](https://sethherr.github.io/soulheart/examples_select2) 12 | 13 | 14 | ## Features 15 | 16 | - **Pagination** 17 |
For infinite scrolling of results - wow! 18 | - **Categories** 19 |
Match results for specified categories, or not. Your choice 20 | - **Prioritization** 21 |
Return results sorted by priority (not just alphabetically) 22 | - **Arbitrary return objects** 23 |
Get whatever you want back. IDs, URLs, image links, HTML, :boom: 24 | - **Loads data** 25 |
Accepts local or remote data - e.g. you can use a [gist](https://github.com/sethherr/soulheart/blob/master/examples/manufacturers.tsv) 26 | - **Runs Standalone or inside a rails app** 27 | 28 | [![Autocomplete in action](https://github.com/sethherr/soulheart/raw/master/examples/screenshot.png)](https://sethherr.github.io/soulheart/) 29 | 30 | 31 | ## Getting started 32 | 33 | See the [Soulheart intro page](https://sethherr.github.io/soulheart/) for a step-by-step explanation of setting up a select box that uses Soulheart as a remote data source. 34 | 35 | 36 | ## Deployment 37 | 38 | #### With Heroku [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy) 39 | 40 | **You can instantly deploy Soulheart to Heroku for free!** This requires a verified Heroku account—you will have to add a payment method to Heroku but you won't be charged. 41 | 42 | To update your Heroku deploy of Soulheart, use the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-command) and redeploy the app: 43 | 44 | heroku deploy -a NAME_OF_YOUR_APP_ON_HEROKU 45 | 46 | 47 | ## In a Rails app 48 | 49 | Soulheart is a gem. It uses [hiredis](https://github.com/redis/hiredis) on Ruby MRI. Add these lines to your gemfile: 50 | 51 | gem 'soulheart' 52 | gem 'hiredis', '~> 0.6.0' # Skip using JRuby 53 | gem 'redis', '>= 3.2.0', require: ['redis', 'redis/connection/hiredis'] # Skip if using JRuby 54 | 55 | 56 | And add this in your routes.rb: 57 | 58 | require 'soulheart/server' 59 | 60 | Rails.application.routes.draw do 61 | # .... your application routes 62 | 63 | mount Soulheart::Server => '/soulhearts' 64 | end 65 | 66 | You can then access the server when your rails app is running. You can run the [Soulheart commands](https://sethherr.github.io/soulheart/commands/) from that directory. 67 | 68 | *Hote: On Heroku Soulheart uses `rackup` to start the server. Because of this, there's a `config.ru`, a `Gemfile.lock` and a `app.json`—to make it (and any forks of it) directly deployable. These files aren't in the Gem.* 69 | 70 | ##### Setting redis url 71 | 72 | You can also set the redis url. 73 | 74 | ```ruby 75 | # config/initializers/soulheart.rb 76 | 77 | Soulheart.redis = 'redis://127.0.0.1:6379/0' 78 | # or you can asign an existing instance of Redis, Redis::Namespace, etc. 79 | # Soulheart.redis = $redis 80 | ``` 81 | ## Testing 82 | 83 | Tested with rspec. Check out test information at [Code Climate](https://codeclimate.com/github/sethherr/soulheart). 84 | 85 | You can run `bundle exec guard` to watch for changes and rerun the tests when files are saved. 86 | 87 | 88 | ## Requirements 89 | 90 | Soulheart is a Redis backed Sinatra server. It's tested with the latest MRI (2.2, 2.1, 2.0) and JRuby versions (1.7). Other versions/VMs are untested but might work fine. 91 | 92 | It requires Redis >= 3.0 93 | 94 | ## Additional info 95 | 96 | This initially started as a fork of [Soulmate](https://github.com/seatgeek/soulmate) to support the features listed, provide demos and make it instantly deployable to Heroku. 97 | 98 | It's MIT licensed. -------------------------------------------------------------------------------- /bin/soulheart: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib') 4 | begin 5 | require 'redis' 6 | rescue LoadError 7 | require 'rubygems' 8 | require 'redis' 9 | end 10 | require 'soulheart' 11 | require 'optparse' 12 | require 'tempfile' 13 | 14 | @batch_size = 1000 15 | @no_all = false 16 | @no_combinatorial = false 17 | @normalize_regex = false 18 | @normalize_no_sym = false 19 | @remove_results = false 20 | 21 | parser = OptionParser.new do |opts| 22 | opts.banner = 'Usage: soulheart [options] COMMAND' 23 | 24 | opts.separator '' 25 | opts.separator 'Options:' 26 | 27 | opts.on('-r', '--redis [HOST:PORT]', 'Redis connection string') do |host| 28 | Soulheart.redis = host 29 | end 30 | 31 | opts.on('-h', '--help', 'Show this message') do 32 | puts opts 33 | exit 34 | end 35 | 36 | opts.separator '' 37 | opts.separator ' load options:' 38 | 39 | opts.on('-A', '--no-all', 'Do not add items into the "all" category') do |size| 40 | @no_all = true 41 | end 42 | 43 | opts.on('-C', '--no-combinatorial', 'Do not create combined categories, do not add items to combined categories') do |size| 44 | @no_combinatorial = true 45 | end 46 | 47 | opts.separator '' 48 | opts.separator ' normalize options:' 49 | 50 | opts.on('-s', '--with-symbols', 'Do not remove symbols when normalizing terms') do |size| 51 | @normalize_no_sym = true 52 | end 53 | 54 | opts.on('-x', '--regex', 'Use the first line from the FILE as the regular expression for normalizing terms') do |size| 55 | @normalize_regex = true 56 | end 57 | 58 | opts.separator '' 59 | opts.separator ' clear options:' 60 | 61 | opts.on('-R', '--remove-results', 'Remove results data - breaks the cache, fully clears all loaded data') do |size| 62 | @remove_results = true 63 | end 64 | 65 | opts.separator '' 66 | opts.separator 'Commands:' 67 | opts.separator ' load FILE Loads data from a FILE - can be a local file or a url. Accepted formats are .json, .tsv and .csv' 68 | opts.separator " stop-words FILE Load file containing a list of stop words to overwrite defaults - 'the', 'at' and 'vs'" 69 | opts.separator " normalize Set the way that terms are normalized. Requires a file when including the --regex option" 70 | opts.separator " clear Removes existing items and categories from the database" 71 | opts.separator '' 72 | opts.separator 'Additional info: https://sethherr.github.io/soulheart/commands/' 73 | opts.separator '' 74 | end 75 | 76 | def open_file(file) 77 | require 'uri' 78 | if file =~ URI.regexp 79 | require 'open-uri' 80 | open(file) 81 | elsif File.exist?(file) 82 | File.open(file) 83 | else 84 | raise StandardError, "Couldn't open file: #{file}" 85 | end 86 | end 87 | 88 | def load(file) 89 | f = open_file(file) 90 | start_time = Time.now.to_i 91 | count = 0 92 | loader = Soulheart::Loader.new({no_all: @no_all, no_combinatorial: @no_combinatorial}) 93 | lines = [] 94 | begin 95 | if file.match(/(c|t)sv\z/i) 96 | puts 'Reading a CSV' 97 | require 'csv' 98 | sep = file.match(/tsv\z/i) ? "\t" : ',' 99 | CSV.foreach(f, headers: true, col_sep: sep) do |row| 100 | lines << row.to_hash 101 | count += 1 102 | end 103 | elsif file.match(/json\z/i) 104 | puts 'Reading JSON' 105 | puts "Loading items in batches of #{@batch_size} ..." 106 | until f.eof? 107 | lines = [] 108 | @batch_size.times do 109 | break if f.eof? 110 | lines << JSON.parse(f.gets) 111 | count += 1 112 | end 113 | end 114 | else 115 | puts 'unknown File type' 116 | end 117 | ensure 118 | f.close 119 | end 120 | loader.load(lines) 121 | puts "Total time to load: #{Time.now.to_i - start_time} second(s)" 122 | end 123 | 124 | def stop_words(file) 125 | f = open_file(file) 126 | Soulheart.stop_words = f.readlines.map(&:strip).reject(&:empty?) 127 | end 128 | 129 | def normalize(file=nil) 130 | if @normalize_regex 131 | f = open_file(file) 132 | puts "Updating normalizer: regular expression - " + f.readlines.map(&:strip).reject(&:empty?).first 133 | Soulheart.normalizer = f.readlines.map(&:strip).reject(&:empty?).first 134 | elsif @normalize_no_sym 135 | puts "Updating normalizer: allow symbols" 136 | Soulheart.normalizer = '' 137 | else 138 | puts "Updating normalizer: default settings" 139 | Soulheart.normalizer = Soulheart.default_normalizer 140 | end 141 | end 142 | 143 | def clear 144 | Soulheart::Loader.new.clear(@remove_results) 145 | end 146 | 147 | parser.parse! 148 | case ARGV[0] 149 | when 'load' 150 | load ARGV[1] 151 | when 'stop-words' 152 | stop_words ARGV[1] 153 | when 'normalize' 154 | ARGV[1] ? normalize(ARGV[1]) : normalize 155 | when 'clear' 156 | puts @remove_results ? "Clearing ALL data (-R option)" : "Clearing data" 157 | clear 158 | load ARGV[1] if ARGV[1] 159 | else 160 | puts parser.help 161 | end 162 | -------------------------------------------------------------------------------- /lib/soulheart/loader.rb: -------------------------------------------------------------------------------- 1 | module Soulheart 2 | class Loader < Base 3 | def initialize(defaults={}) 4 | @no_all = defaults[:no_all] 5 | @no_combinatorial = defaults[:no_combinatorial] 6 | end 7 | 8 | def default_items_hash(text, category) 9 | category ||= 'default' 10 | { 11 | 'category' => normalize(category), 12 | 'priority' => 100, 13 | 'term' => normalize(text), 14 | 'aliases' => [], 15 | 'data' => { 16 | 'text' => text, 17 | 'category' => category 18 | } 19 | } 20 | end 21 | 22 | def add_to_categories_array(category) 23 | if @no_combinatorial 24 | return if redis.smembers(hidden_categories_id).include?(category) 25 | redis.sadd hidden_categories_id, category 26 | elsif !redis.smembers(categories_id).include?(category) 27 | redis.sadd categories_id, category 28 | end 29 | end 30 | 31 | def delete_categories 32 | redis.expire category_combos_id, 0 33 | redis.expire categories_id, 0 34 | redis.expire hidden_categories_id, 0 35 | end 36 | 37 | def reset_categories(categories) 38 | delete_categories 39 | redis.sadd categories_id, categories 40 | end 41 | 42 | def delete_data(id="#{Soulheart.base_id}:") 43 | # delete the sorted sets for this type 44 | phrases = redis.smembers(Soulheart.base_id) 45 | redis.pipelined do 46 | phrases.each do |p| 47 | redis.del("#{id}#{p}") 48 | end 49 | redis.del(id) 50 | end 51 | 52 | # Redis can continue serving cached requests while the reload is 53 | # occurring. Some requests may be cached incorrectly as empty set (for requests 54 | # which come in after the above delete, but before the loading completes). But 55 | # everything will work itself out as soon as the cache expires again. 56 | end 57 | 58 | def clear_cache 59 | # Remove the remove_results_hash 60 | # has to be called before the cat_ids are cleared 61 | category_combos.map { |cat| redis.expire(no_query_id(category_id(cat)), 0) } 62 | redis.expire results_hashes_id, 0 63 | redis.del(results_hashes_id) 64 | end 65 | 66 | def clear(should_clear_cache = false) 67 | clear_cache if should_clear_cache 68 | category_combos.each {|cat| delete_data(category_id(cat)) } 69 | delete_categories 70 | delete_data 71 | end 72 | 73 | def load(items) 74 | Soulheart.stop_words # Load stop words so we don't pipeline redis_stop_words accidentally 75 | i = 0 76 | items.each do |item| 77 | item.replace(add_item(item)) # Replace with item return so we know we have category_id 78 | i += 1 79 | end 80 | set_category_combos_array.each do |category_combo| 81 | items.each do |item| 82 | if category_combo == item['category'] 83 | next 84 | elsif category_combo == 'all' 85 | next if @no_all 86 | elsif @no_combinatorial 87 | next 88 | elsif !category_combo.match(item['category']) 89 | next 90 | end 91 | add_item(item, category_id(category_combo), true) # send it base 92 | i += 1 93 | end 94 | end 95 | puts "Total items (including combinatorial categories): #{i}" 96 | end 97 | 98 | def clean_hash(item) 99 | item['aliases'] = item['aliases'].split(',').map(&:strip) if item['aliases'] && !item['aliases'].kind_of?(Array) 100 | fail ArgumentError, 'Items must have text' unless item['text'] 101 | default_items_hash(item.delete('text'), item.delete('category')) 102 | .tap { |i| i['data'].merge!(item.delete('data')) if item['data'] } 103 | .tap { |i| i['priority'] = item.delete('priority').to_f if item['priority'] } 104 | .merge item 105 | end 106 | 107 | def clean(item) 108 | item = clean_hash(item) 109 | item.keys.select{ |k| !%w(category priority term aliases data).include?(k) }.each do |key| 110 | item['data'].merge!({"#{key}" => item.delete(key)}) 111 | end 112 | add_to_categories_array(item['category']) 113 | item 114 | end 115 | 116 | def add_item(item, category_base_id=nil, cleaned=false) 117 | item = clean(item) unless cleaned 118 | category_base_id ||= category_id(item['category']) 119 | priority = (-item['priority']) 120 | redis.pipelined do 121 | redis.zadd(no_query_id(category_base_id), priority, item['term']) # Add to master set for queryless searches 122 | # store the raw data in a separate key to reduce memory usage, if it's cleaned it's done 123 | redis.hset(results_hashes_id, item['term'], item['data'].to_json) unless cleaned 124 | phrase = ([item['term']] + (item['aliases'] || [])).join(' ') 125 | # Store all the prefixes 126 | prefixes_for_phrase(phrase).each do |p| 127 | redis.sadd(Soulheart.base_id, p) unless cleaned # remember prefix in a master set 128 | # store the normalized term in the index for each of the categories 129 | redis.zadd("#{category_base_id}#{p}", priority, item['term']) 130 | end 131 | end 132 | item 133 | end 134 | end 135 | end 136 | -------------------------------------------------------------------------------- /spec/soulheart/matcher_spec.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | require 'spec_helper' 3 | 4 | describe Soulheart::Matcher do 5 | 6 | describe :categories_array do 7 | it "Returns an empty array from a string" do 8 | matcher = Soulheart::Matcher.new('categories' => '') 9 | expect(matcher.opts['categories']).to eq([]) 10 | end 11 | end 12 | 13 | describe :clean_opts do 14 | it 'Has the keys we need' do 15 | target_keys = %w(categories q page per_page) 16 | keys = Soulheart::Matcher.default_params_hash.keys 17 | expect((target_keys - keys).count).to eq(0) 18 | end 19 | 20 | it "Makes category empty if it's all the categories" do 21 | Soulheart::Loader.new.reset_categories(%w(cool test)) 22 | cleaned = Soulheart::Matcher.new('categories' => 'cool, test') 23 | expect(cleaned.opts['categories']).to eq([]) 24 | end 25 | end 26 | 27 | describe :category_id_from_opts do 28 | it 'Gets the id for one' do 29 | Soulheart::Loader.new.reset_categories(%w(cool test)) 30 | matcher = Soulheart::Matcher.new('categories' => ['some_category']) 31 | expect(matcher.category_id_from_opts).to eq(matcher.category_id('some_category')) 32 | end 33 | 34 | it 'Gets the id for all of them' do 35 | Soulheart::Loader.new.reset_categories(%w(cool test boo)) 36 | matcher = Soulheart::Matcher.new('categories' => 'cool, boo, test') 37 | expect(matcher.category_id_from_opts).to eq(matcher.category_id('all')) 38 | end 39 | end 40 | 41 | describe :categories_string do 42 | it 'Does all if none' do 43 | Soulheart::Loader.new.reset_categories(%w(cool test)) 44 | matcher = Soulheart::Matcher.new('categories' => '') 45 | expect(matcher.categories_string).to eq('all') 46 | end 47 | it 'Correctly concats a string of categories' do 48 | Soulheart::Loader.new.reset_categories(['cool', 'some_category', 'another cat', 'z9', 'stuff']) 49 | matcher = Soulheart::Matcher.new('categories' => 'some_category, another cat, z9') 50 | expect(matcher.categories_string).to eq('another catsome_categoryz9') 51 | end 52 | end 53 | 54 | describe :matches do 55 | it 'With no params, gets all the matches, ordered by priority and name' do 56 | store_terms_fixture 57 | opts = { 'cache' => false } 58 | matches = Soulheart::Matcher.new(opts).matches 59 | expect(matches.count).to be == 5 60 | end 61 | 62 | it 'With no query but with categories, matches categories' do 63 | store_terms_fixture 64 | opts = { 'per_page' => 100, 'cache' => false, 'categories' => 'manufacturer' } 65 | matches = Soulheart::Matcher.new(opts).matches 66 | expect(matches.count).to eq(4) 67 | expect(matches[0]['text']).to eq('Brooks England LTD.') 68 | expect(matches[1]['text']).to eq('Sram') 69 | end 70 | 71 | it 'Gets the matches matching query and priority for one item in query, all categories' do 72 | store_terms_fixture 73 | opts = { 'per_page' => 100, 'q' => 'j', 'cache' => false } 74 | matches = Soulheart::Matcher.new(opts).matches 75 | expect(matches.count).to eq(3) 76 | expect(matches[0]['text']).to eq('Jamis') 77 | end 78 | 79 | it 'Gets the matches matching query and priority for one item in query, one category' do 80 | store_terms_fixture 81 | opts = { 'per_page' => 100, 'q' => 'j', 'cache' => false, 'categories' => 'manufacturer' } 82 | matches = Soulheart::Matcher.new(opts).matches 83 | expect(matches.count).to eq(2) 84 | expect(matches[0]['text']).to eq('Jannd') 85 | end 86 | 87 | it "Matches Chinese" do 88 | store_terms_fixture 89 | opts = { 'q' => "中国" } 90 | matches = Soulheart::Matcher.new(opts).matches 91 | expect(matches.length).to eq(1) 92 | expect(matches[0]['text']).to eq("中国佛山 李小龙") 93 | end 94 | 95 | it "Finds by aliases" do 96 | store_terms_fixture 97 | opts = { 'q' => 'land shark stadium' } 98 | matches = Soulheart::Matcher.new(opts).matches 99 | expect(matches.length).to eq(1) 100 | expect(matches[0]['text']).to eq('Sun Life Stadium') 101 | end 102 | 103 | it "Doesn't duplicate when matching both alias and the normal term" do 104 | store_terms_fixture 105 | opts = { 'q' => 'stadium' } 106 | matches = Soulheart::Matcher.new(opts).matches 107 | expect(matches.length).to eq(5) 108 | end 109 | 110 | it 'Gets pages and uses them' do 111 | Soulheart::Loader.new.clear(true) 112 | # Pagination wrecked my mind, hence the multitude of tests] 113 | items = [ 114 | { 'text' => 'First item', 'priority' => '11000' }, 115 | { 'text' => 'First atom', 'priority' => '11000' }, 116 | { 'text' => 'Second item', 'priority' => '1999' }, 117 | { 'text' => 'Third item', 'priority' => 1900 }, 118 | { 'text' => 'Fourth item', 'priority' => 1800 }, 119 | { 'text' => 'Fifth item', 'priority' => 1750 }, 120 | { 'text' => 'Sixth item', 'priority' => 1700 }, 121 | { 'text' => 'Seventh item', 'priority' => 1699 } 122 | ] 123 | loader = Soulheart::Loader.new 124 | loader.delete_categories 125 | loader.load(items) 126 | page1 = Soulheart::Matcher.new('per_page' => 1, 'cache' => false).matches 127 | expect(page1[0]['text']).to eq('First atom') 128 | 129 | page2 = Soulheart::Matcher.new('per_page' => 1, 'page' => 2, 'cache' => false).matches 130 | expect(page2[0]['text']).to eq('First item') 131 | 132 | page2 = Soulheart::Matcher.new('per_page' => 1, 'page' => 3, 'cache' => false).matches 133 | expect(page2.count).to eq(1) 134 | expect(page2[0]['text']).to eq('Second item') 135 | 136 | page3 = Soulheart::Matcher.new('per_page' => 2, 'page' => 3, 'cache' => false).matches 137 | expect(page3[0]['text']).to eq('Fourth item') 138 | expect(page3[1]['text']).to eq('Fifth item') 139 | end 140 | 141 | it "gets +1 and things with changed normalizer function" do 142 | Soulheart.normalizer = '' 143 | require 'soulheart' 144 | items = [ 145 | { 'text' => '+1'}, 146 | { 'text' => '-1'}, 147 | { 'text' => '( ͡↑ ͜ʖ ͡↑)' }, 148 | { 'text' => '100' }, 149 | ] 150 | loader = Soulheart::Loader.new 151 | loader.delete_categories 152 | loader.load(items) 153 | plus1 = Soulheart::Matcher.new('q' => '+', 'cache' => false).matches 154 | expect(plus1.count).to eq(1) 155 | expect(plus1[0]['text']).to eq('+1') 156 | 157 | minus1 = Soulheart::Matcher.new('q' => '-', 'cache' => false).matches 158 | expect(minus1[0]['text']).to eq('-1') 159 | 160 | donger = Soulheart::Matcher.new('q' => '(', 'cache' => false).matches 161 | expect(donger[0]['text']).to eq('( ͡↑ ͜ʖ ͡↑)') 162 | 163 | Soulheart.normalizer = Soulheart.default_normalizer 164 | require 'soulheart' 165 | end 166 | end 167 | end 168 | -------------------------------------------------------------------------------- /examples/categories.json: -------------------------------------------------------------------------------- 1 | {"text":"Black","category":"Colors"} 2 | {"text":"Blue","category":"Colors"} 3 | {"text":"Brown","category":"Colors"} 4 | {"text":"Green","category":"Colors"} 5 | {"text":"Orange","category":"Colors"} 6 | {"text":"Pink","category":"Colors"} 7 | {"text":"Purple","category":"Colors"} 8 | {"text":"Red","category":"Colors"} 9 | {"text":"Silver or Gray","category":"Colors"} 10 | {"text":"Stickers tape or other cover-up","category":"Colors"} 11 | {"text":"Teal","category":"Colors"} 12 | {"text":"White","category":"Colors"} 13 | {"text":"Yellow or Gold","category":"Colors"} 14 | {"text":"other","category":"Component Types"} 15 | {"text":"water bottle cage","category":"Component Types"} 16 | {"text":"stem","category":"Component Types", "aliases": ["Goose neck", "handlebar clamp"]} 17 | {"text":"fairing","category":"Component Types"} 18 | {"text":"lights","category":"Component Types"} 19 | {"text":"basket","category":"Component Types"} 20 | {"text":"chain tensioners","category":"Component Types"} 21 | {"text":"derailleur","category":"Component Types"} 22 | {"text":"unknown","category":"Component Types"} 23 | {"text":"training wheels","category":"Component Types"} 24 | {"text":"bottom bracket","category":"Component Types"} 25 | {"text":"brake","category":"Component Types"} 26 | {"text":"hub guard","category":"Component Types"} 27 | {"text":"handlebar","category":"Component Types"} 28 | {"text":"wheel","category":"Component Types"} 29 | {"text":"saddle","category":"Component Types"} 30 | {"text":"generator/dynamo","category":"Component Types"} 31 | {"text":"bashguard/chain guide","category":"Component Types"} 32 | {"text":"bell/noisemaker","category":"Component Types"} 33 | {"text":"chainrings","category":"Component Types"} 34 | {"text":"cog/cassette/freewheel","category":"Component Types"} 35 | {"text":"rim","category":"Component Types"} 36 | {"text":"axle nuts","category":"Component Types"} 37 | {"text":"hub","category":"Component Types"} 38 | {"text":"spokes","category":"Component Types"} 39 | {"text":"tube","category":"Component Types"} 40 | {"text":"tire","category":"Component Types"} 41 | {"text":"brake lever","category":"Component Types"} 42 | {"text":"shift and brake lever","category":"Component Types"} 43 | {"text":"brake rotor","category":"Component Types"} 44 | {"text":"brake pad","category":"Component Types"} 45 | {"text":"shifter","category":"Component Types"} 46 | {"text":"fork","category":"Component Types"} 47 | {"text":"rear suspension","category":"Component Types"} 48 | {"text":"headset","category":"Component Types"} 49 | {"text":"brake cable","category":"Component Types"} 50 | {"text":"shift cable","category":"Component Types"} 51 | {"text":"chain","category":"Component Types"} 52 | {"text":"crankset","category":"Component Types"} 53 | {"text":"pedals","category":"Component Types"} 54 | {"text":"computer","category":"Component Types"} 55 | {"text":"pegs","category":"Component Types"} 56 | {"text":"toe clips","category":"Component Types"} 57 | {"text":"grips/tape","category":"Component Types"} 58 | {"text":"seatpost clamp","category":"Component Types"} 59 | {"text":"detangler","category":"Component Types"} 60 | {"text":"kickstand","category":"Component Types"} 61 | {"text":"rack","category":"Component Types"} 62 | {"text":"seatpost","category":"Component Types"} 63 | {"text":"fender","category":"Component Types"} 64 | {"text":"aero bars/extensions/bar ends","category":"Component Types"} 65 | {"text":"Bike","category":"Cycle Types"} 66 | {"text":"Tandem","category":"Cycle Types"} 67 | {"text":"Unicycle","category":"Cycle Types"} 68 | {"text":"Tricycle","category":"Cycle Types"} 69 | {"text":"Recumbent","category":"Cycle Types"} 70 | {"text":"Tall Bike","category":"Cycle Types"} 71 | {"text":"Penny Farthing","category":"Cycle Types"} 72 | {"text":"Wheelchair","category":"Cycle Types"} 73 | {"text":"Stroller","category":"Cycle Types"} 74 | {"text":"Cargo Bike (front storage)","category":"Cycle Types"} 75 | {"text":"Cargo Bike (rear storage)","category":"Cycle Types"} 76 | {"text":"Cargo Tricycle (front storage)","category":"Cycle Types"} 77 | {"text":"Cargo Tricycle (rear storage)","category":"Cycle Types"} 78 | {"text":"Bike Trailer","category":"Cycle Types"} 79 | {"text":"Trail behind (half bike)","category":"Cycle Types"} 80 | {"text":"Pedi Cab (rickshaw)","category":"Cycle Types"} 81 | {"text":"Wood or organic material","category":"Frame Materials"} 82 | {"text":"Titanium","category":"Frame Materials"} 83 | {"text":"Carbon or composite","category":"Frame Materials"} 84 | {"text":"Aluminum","category":"Frame Materials"} 85 | {"text":"Steel","category":"Frame Materials"} 86 | {"text":"Drop","category":"Handlebar Types"} 87 | {"text":"Forward facing","category":"Handlebar Types"} 88 | {"text":"Rear facing","category":"Handlebar Types"} 89 | {"text":"Not handlebars","category":"Handlebar Types"} 90 | {"text":"BMX style","category":"Handlebar Types"} 91 | {"text":"Flat or riser","category":"Handlebar Types"} 92 | {"text":"Foot pedal","category":"Propulsion Types"} 93 | {"text":"Hand pedal","category":"Propulsion Types"} 94 | {"text":"Sail","category":"Propulsion Types"} 95 | {"text":"Insufflation","category":"Propulsion Types"} 96 | {"text":"Electric Assist","category":"Propulsion Types"} 97 | {"text":"Electric throttle","category":"Propulsion Types"} 98 | {"text":"Gas","category":"Propulsion Types"} 99 | {"text":"Other style","category":"Propulsion Types"} 100 | {"text":"8 x 1 1/4","category":"Wheel Sizes"} 101 | {"text":"10 x 2","category":"Wheel Sizes"} 102 | {"text":"12in","category":"Wheel Sizes"} 103 | {"text":"16in","category":"Wheel Sizes"} 104 | {"text":"16 x 1 3/4","category":"Wheel Sizes"} 105 | {"text":"16 x 1 3/8","category":"Wheel Sizes"} 106 | {"text":"16 x 1 3/8","category":"Wheel Sizes"} 107 | {"text":"400 A","category":"Wheel Sizes"} 108 | {"text":"16 x 1 3/8","category":"Wheel Sizes"} 109 | {"text":"18in","category":"Wheel Sizes"} 110 | {"text":"17 x 1 1/4","category":"Wheel Sizes"} 111 | {"text":"450 A","category":"Wheel Sizes"} 112 | {"text":"20in","category":"Wheel Sizes"} 113 | {"text":"20 x 1 3/4","category":"Wheel Sizes"} 114 | {"text":"500 A","category":"Wheel Sizes"} 115 | {"text":"20 x 1 1/8; x 1 1/4; x 1 3/8","category":"Wheel Sizes"} 116 | {"text":"22 x 1.75; x 2.125","category":"Wheel Sizes"} 117 | {"text":"550 A","category":"Wheel Sizes"} 118 | {"text":"24in","category":"Wheel Sizes"} 119 | {"text":"24 x 1","category":"Wheel Sizes"} 120 | {"text":"24 x 1 1/8, 24 x 1 3/8 (E.5), 600 A","category":"Wheel Sizes"} 121 | {"text":"24 x 1 1/4, 24 x 1 3/8 (S-5)","category":"Wheel Sizes"} 122 | {"text":"26in","category":"Wheel Sizes"} 123 | {"text":"650 C","category":"Wheel Sizes"} 124 | {"text":"650 B","category":"Wheel Sizes"} 125 | {"text":"700 D","category":"Wheel Sizes"} 126 | {"text":"26 x 1 3/8","category":"Wheel Sizes"} 127 | {"text":"26 x 1 3/8","category":"Wheel Sizes"} 128 | {"text":"26 x 1.25, x 1.375","category":"Wheel Sizes"} 129 | {"text":"700 C","category":"Wheel Sizes"} 130 | {"text":"27in","category":"Wheel Sizes"} 131 | {"text":"28 x 1 1/2, 700 B","category":"Wheel Sizes"} -------------------------------------------------------------------------------- /spec/soulheart/loader_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Soulheart::Loader do 4 | describe :clean_data do 5 | it 'sets the default category, priority and normalizes term' do 6 | item = { 'text' => ' FooBar' } 7 | result = Soulheart::Loader.new.clean_hash(item) 8 | expect(result['priority']).to eq(100) 9 | expect(result['term']).to eq('foobar') 10 | expect(result['category']).to eq('default') 11 | expect(result['data']['text']).to eq(' FooBar') 12 | end 13 | 14 | it "doesn't overwrite the submitted params (including the data-text)" do 15 | item = { 16 | 'text' => 'Cool ', 17 | 'priority' => '50', 18 | 'category' => 'Gooble', 19 | 'aliases' => 'deck, fly', 20 | 'data' => { 21 | 'text' => ' Cspan', 22 | 'id' => 199, 23 | 'category' => 'Stuff' 24 | } 25 | } 26 | result = Soulheart::Loader.new.clean_hash(item) 27 | expect(result['term']).to eq('cool') 28 | expect(result['priority']).to eq(50) 29 | expect(result['aliases']).to eq(['deck', 'fly']) 30 | expect(result['data']['id']).to eq(199) 31 | expect(result['data']['text']).to eq(' Cspan') 32 | expect(result['category']).to eq('gooble') 33 | expect(result['data']['category']).to eq('Stuff') 34 | end 35 | 36 | it 'raises argument error if no text is passed' do 37 | expect do 38 | Soulheart::Loader.new.clean_hash('name' => 'stuff') 39 | end.to raise_error(/must have/i) 40 | end 41 | end 42 | 43 | describe :clean do 44 | it "calls add to category" do 45 | integration = Soulheart::Loader.new 46 | item = {'text' => 'something'} 47 | expect(integration).to receive(:add_to_categories_array) 48 | integration.clean(item) 49 | end 50 | end 51 | 52 | describe :add_to_categories_array do 53 | it "adds to hidden category if hidden" do 54 | loader = Soulheart::Loader.new(no_combinatorial: true) 55 | loader.clear(true) 56 | loader.add_to_categories_array('george') 57 | expect(loader.hidden_category_array).to eq(['george']) 58 | end 59 | it "adds to normal category" do 60 | loader = Soulheart::Loader.new 61 | loader.clear(true) 62 | loader.add_to_categories_array('george') 63 | expect(loader.sorted_category_array).to eq(['george']) 64 | end 65 | end 66 | 67 | describe :add_item do 68 | it 'adds an item, adds prefix scopes, adds category' do 69 | Soulheart.stop_words # Meh. Unclear why it's needed, but it's needed here to not fail 70 | item = { 71 | 'text' => 'Brompton Bicycle', 72 | 'priority' => 50, 73 | 'category' => 'Gooble', 74 | 'data' => { 75 | 'id' => 199 76 | } 77 | } 78 | loader = Soulheart::Loader.new 79 | loader.clear(true) 80 | redis = loader.redis 81 | loader.add_item(item) 82 | redis = loader.redis 83 | target = "{\"text\":\"Brompton Bicycle\",\"category\":\"Gooble\",\"id\":199}" 84 | result = redis.hget(loader.results_hashes_id, 'brompton bicycle') 85 | expect(result).to eq(target) 86 | prefixed = redis.zrange "#{loader.category_id('gooble')}brom", 0, -1 87 | expect(prefixed[0]).to eq('brompton bicycle') 88 | expect(redis.smembers(loader.categories_id).include?('gooble')).to be_true 89 | end 90 | 91 | it 'deals with csv format, with data- prefixed items' do 92 | Soulheart.stop_words # Meh. Unclear why it's needed, but it's needed here to not fail 93 | item = { 94 | 'text' => 'Brompton Bicycle', 95 | 'priority' => 50, 96 | 'category' => 'Gooble', 97 | 'id' => 199, 98 | 'url' => 'http://something.com', 99 | } 100 | loader = Soulheart::Loader.new 101 | loader.clear(true) 102 | redis = loader.redis 103 | loader.add_item(item) 104 | redis = loader.redis 105 | target = "{\"text\":\"Brompton Bicycle\",\"category\":\"Gooble\",\"id\":199,\"url\":\"http://something.com\"}" 106 | result = redis.hget(loader.results_hashes_id, 'brompton bicycle') 107 | expect(result).to eq(target) 108 | end 109 | 110 | end 111 | 112 | describe :load do 113 | it 'stores terms by priority and adds categories for each possible category combination' do 114 | items = [] 115 | file = File.read('spec/fixtures/multiple_categories.json') 116 | file.each_line { |l| items << JSON.parse(l) } 117 | loader = Soulheart::Loader.new 118 | loader.clear(true) 119 | redis = loader.redis 120 | loader.delete_categories 121 | loader.load(items) 122 | 123 | cat_prefixed = redis.zrange "#{loader.category_id('frame manufacturermanufacturer')}brom", 0, -1 124 | expect(cat_prefixed.count).to eq(1) 125 | expect(redis.smembers(loader.categories_id).count).to be > 3 126 | prefixed = redis.zrange "#{loader.category_id('all')}bro", 0, -1 127 | expect(prefixed.count).to eq(2) 128 | expect(prefixed[0]).to eq('brompton bicycle') 129 | end 130 | 131 | it "stores terms by priority and doesn't add run categories if none are present" do 132 | items = [ 133 | { 'text' => 'cool thing', 'category' => 'AWESOME' }, 134 | { 'text' => 'Sweet', 'category' => ' awesome' } 135 | ] 136 | loader = Soulheart::Loader.new 137 | loader.clear(true) 138 | redis = loader.redis 139 | loader.delete_categories 140 | loader.load(items) 141 | expect(redis.smembers(loader.category_combos_id).count).to eq(1) 142 | end 143 | 144 | it "doesn't add category if no_combinatorial" do 145 | items = [] 146 | file = File.read('spec/fixtures/multiple_categories.json') 147 | file.each_line { |l| items << JSON.parse(l) } 148 | loader = Soulheart::Loader.new(no_combinatorial: true) 149 | loader.clear(true) 150 | redis = loader.redis 151 | loader.delete_categories 152 | loader.load(items) 153 | 154 | cat_prefixed = redis.zrange "#{loader.category_id('frame manufacturer')}brom", 0, -1 155 | expect(cat_prefixed.count).to eq(1) 156 | multicat_prefixed = redis.zrange "#{loader.category_id('frame manufacturermanufacturer')}brom", 0, -1 157 | expect(multicat_prefixed.count).to eq(0) 158 | expect(loader.hidden_category_array.count).to eq(4) 159 | expect(loader.category_combos).to eq(['all']) 160 | prefixed = redis.zrange "#{loader.category_id('all')}brom", 0, -1 161 | expect(prefixed.count).to eq(1) 162 | end 163 | 164 | it "doesn't add all if no_all" do 165 | items = [] 166 | file = File.read('spec/fixtures/multiple_categories.json') 167 | file.each_line { |l| items << JSON.parse(l) } 168 | loader = Soulheart::Loader.new(no_all: true) 169 | loader.clear(true) 170 | redis = loader.redis 171 | loader.delete_categories 172 | loader.load(items) 173 | 174 | cat_prefixed = redis.zrange "#{loader.category_id('frame manufacturermanufacturer')}brom", 0, -1 175 | expect(cat_prefixed.count).to eq(1) 176 | expect(loader.category_combos.count).to be > 3 177 | prefixed = redis.zrange "#{loader.category_id('all')}b", 0, -1 178 | expect(prefixed.count).to eq(0) 179 | end 180 | 181 | it "doesn't add all or category if no_all and no_combinatorial" do 182 | items = [] 183 | file = File.read('spec/fixtures/multiple_categories.json') 184 | file.each_line { |l| items << JSON.parse(l) } 185 | loader = Soulheart::Loader.new(no_combinatorial: true, no_all: true) 186 | loader.clear(true) 187 | redis = loader.redis 188 | loader.delete_categories 189 | loader.load(items) 190 | 191 | cat_prefixed = redis.zrange "#{loader.category_id('frame manufacturer')}brom", 0, -1 192 | expect(cat_prefixed.count).to eq(1) 193 | multicat_prefixed = redis.zrange "#{loader.category_id('frame manufacturermanufacturer')}brom", 0, -1 194 | expect(multicat_prefixed.count).to eq(0) 195 | expect(loader.category_combos).to eq(['all']) # We still need an all category, or querying will break 196 | prefixed = redis.zrange "#{loader.category_id('all')}b", 0, -1 197 | expect(prefixed.count).to eq(0) 198 | end 199 | end 200 | 201 | describe :clear do 202 | context 'remove_results false (default)' do 203 | it "deletes everything, but leaves the cache" do 204 | items = [ 205 | {'text' => 'Brompton Bicycle', 'category' => 'Gooble'}, 206 | {'text' => 'Surly Bicycle', 'category' => 'Bluster'}, 207 | {"text" => "Defaulted"} 208 | ] 209 | search_opts = {'categories' => 'Bluster, Gooble', 'q' => 'brom'} 210 | 211 | loader = Soulheart::Loader.new 212 | 213 | redis = loader.redis 214 | loader.load(items) 215 | redis = loader.redis 216 | expect(redis.hget(loader.results_hashes_id, 'brompton bicycle').length).to be > 0 217 | expect((redis.zrange "#{loader.category_id('gooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 218 | expect((redis.zrange "#{loader.category_id('blustergooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 219 | 220 | matches1 = Soulheart::Matcher.new(search_opts).matches 221 | expect(matches1[0]['text']).to eq("Brompton Bicycle") 222 | 223 | loader.clear 224 | expect(redis.hget(loader.results_hashes_id, 'brompton bicycle')).to_not be_nil 225 | prefixed = redis.zrange "#{loader.category_id('gooble')}brom", 0, -1 226 | expect(prefixed).to be_empty 227 | expect(redis.zrange "#{loader.category_id('blustergooble')}brom", 0, -1).to be_empty 228 | expect(redis.smembers(loader.categories_id).include?('gooble')).to be_false 229 | 230 | matches2 = Soulheart::Matcher.new(search_opts).matches 231 | expect(matches2[0]['text']).to eq("Brompton Bicycle") 232 | expect(Soulheart::Matcher.new(search_opts.merge("cache" => false)).matches).to be_empty 233 | end 234 | end 235 | context 'remove_results true' do 236 | it 'removes everything including the results' do 237 | items = [ 238 | {'text' => 'Brompton Bicycle', 'category' => 'Gooble'}, 239 | {'text' => 'Surly Bicycle', 'category' => 'Bluster'}, 240 | {"text" => "Defaulted"} 241 | ] 242 | search_opts = {'categories' => 'Bluster, Gooble', 'q' => 'brom'} 243 | 244 | loader = Soulheart::Loader.new 245 | 246 | redis = loader.redis 247 | loader.load(items) 248 | redis = loader.redis 249 | expect(redis.hget(loader.results_hashes_id, 'brompton bicycle').length).to be > 0 250 | expect(redis.zrange "#{loader.no_query_id(loader.category_id('gooble'))}", 0, -1).to_not be_nil 251 | # expect((redis.zrange "#{loader.no_query_id('gooble')}", 0, -1)[0]).to eq("brompton bicycle") 252 | expect((redis.zrange "#{loader.category_id('gooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 253 | expect((redis.zrange "#{loader.category_id('blustergooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 254 | 255 | matches1 = Soulheart::Matcher.new(search_opts).matches 256 | expect(matches1[0]['text']).to eq("Brompton Bicycle") 257 | 258 | loader.clear(true) 259 | expect(redis.zrange "#{loader.no_query_id(loader.category_id('gooble'))}", 0, -1).to eq([]) 260 | expect(redis.hget(loader.results_hashes_id, 'brompton bicycle')).to be_nil 261 | end 262 | end 263 | end 264 | describe :clear_cache do 265 | it 'removes the cache' do 266 | items = [ 267 | {'text' => 'Brompton Bicycle', 'category' => 'Gooble'}, 268 | {'text' => 'Surly Bicycle', 'category' => 'Bluster'}, 269 | {"text" => "Defaulted"} 270 | ] 271 | search_opts = {'categories' => 'Bluster, Gooble', 'q' => 'brom'} 272 | 273 | loader = Soulheart::Loader.new 274 | 275 | redis = loader.redis 276 | loader.load(items) 277 | redis = loader.redis 278 | expect(redis.hget(loader.results_hashes_id, 'brompton bicycle').length).to be > 0 279 | expect(redis.zrange "#{loader.no_query_id(loader.category_id('gooble'))}", 0, -1).to_not be_nil 280 | # expect((redis.zrange "#{loader.no_query_id('gooble')}", 0, -1)[0]).to eq("brompton bicycle") 281 | expect((redis.zrange "#{loader.category_id('gooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 282 | expect((redis.zrange "#{loader.category_id('blustergooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 283 | 284 | matches1 = Soulheart::Matcher.new(search_opts).matches 285 | expect(matches1[0]['text']).to eq("Brompton Bicycle") 286 | 287 | loader.clear_cache 288 | expect(redis.zrange "#{loader.no_query_id(loader.category_id('gooble'))}", 0, -1).to eq([]) 289 | expect((redis.zrange "#{loader.category_id('gooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 290 | expect((redis.zrange "#{loader.category_id('blustergooble')}brom", 0, -1)[0]).to eq("brompton bicycle") 291 | end 292 | end 293 | end 294 | -------------------------------------------------------------------------------- /examples/manufacturers_simple.tsv: -------------------------------------------------------------------------------- 1 | text 2 | 24seven 3 | 3G 4 | 3T 5 | 3rd Eye 6 | 3rensho 7 | 45North 8 | 4ZA 9 | 6KU 10 | 9 zero 7 11 | A-Class 12 | A-bike 13 | A2B e-bikes 14 | ABI 15 | ACS 16 | AGang 17 | ALAN 18 | AMF 19 | AXA 20 | Aardvark 21 | Abici 22 | Abus 23 | Accelerade 24 | Accell 25 | Access 26 | Acros 27 | Acstar 28 | Adams (Trail a bike) 29 | Adolphe Clément 30 | Adventure Medical Kits 31 | Aegis 32 | Aerofix Cycles 33 | Affinity Cycles 34 | AheadSet 35 | Airborne 36 | Aist Bicycles 37 | Aladdin 38 | Alcyon 39 | Alex 40 | Alexander Leutner & Co. 41 | Alien Bikes 42 | Alienation 43 | Alite Designs 44 | All City https://files.bikeindex.org/uploads/Ma/371/all-city.png 45 | Alldays & Onions 46 | Alliance 47 | Alton 48 | American Bicycle Company 49 | American Classic 50 | American Machine and Foundry 51 | American Star Bicycle 52 | Amoeba 53 | And 54 | Andiamo 55 | Answer BMX 56 | Apollo 57 | Aqua Sphere 58 | Aquamira 59 | Arai 60 | Argon 18 61 | Asama 62 | Asda 63 | Assos 64 | Atala 65 | Atomlab 66 | Author 67 | Avalon 68 | Avanti 69 | Aventón 70 | Avid 71 | Axiom 72 | Axle Release 73 | Azonic 74 | Azor 75 | Aztec 76 | Azzuri 77 | BCA 78 | BH Bikes (Beistegui Hermanos) 79 | BMC 80 | BOB 81 | BONT 82 | BOX 83 | BSD 84 | BULLITT 85 | Bacchetta 86 | Backpacker's Pantry 87 | Backward Circle 88 | Bahco 89 | Bailey 90 | Baladeo 91 | Bamboo Cycles 92 | Banjo Brothers 93 | Banshee bikes 94 | Bantam (Bantam Bicycle works) 95 | Bar Mitts 96 | Barracuda 97 | Basso 98 | Batavus 99 | Bazooka 100 | BeOne 101 | Beater Bikes 102 | Bell 103 | Bellwether 104 | Benotto 105 | Bergamont 106 | Bertucci 107 | Bianchi 108 | Bickerton 109 | Bicycle Research 110 | Big Agnes Inc 111 | Big Shot 112 | Bike Fit Systems 113 | Bike Friday 114 | Bike Mielec 115 | Bike Ribbon 116 | Bike-Aid 117 | Bike-Eye 118 | Bike-O-Vision 119 | Bike4Life 120 | BikeE recumbents 121 | Bikes Belong 122 | Bikeverywhere 123 | Bilenky Cycle Works 124 | Biomega 125 | BionX 126 | Birdy 127 | Biria 128 | Birmingham Small Arms Company 129 | Bishop 130 | Black Diamond 131 | Black Market 132 | Black Mountain Cycles 133 | Black Sheep Bikes 134 | Blue 135 | Boardman Bikes 136 | Bobbin 137 | BodyGlide 138 | Boeshield 139 | Bohemian Bicycles 140 | Bondhus 141 | Bonk Breaker 142 | Boo Bicycles 143 | Boreal 144 | Borealis (fat bikes) 145 | Boreas Gear 146 | Borile 147 | Bottecchia 148 | Boulder Bicycles 149 | Brannock Device Co 150 | Brasil & Movimento 151 | Brave Soldier 152 | Breadwinner 153 | Breakbrake17 Bicycle Co. 154 | Breezer 155 | Brennabor 156 | Bridgestone 157 | British Eagle 158 | Brodie 159 | Broke Bikes 160 | Brompton Bicycle 161 | Brooklyn Bicycle Co. 162 | Brooks England LTD. 163 | Browning 164 | Brunswick Corporation 165 | Brush Research 166 | Budnitz 167 | Buff 168 | Burley 169 | Burley Design 170 | Bushnell 171 | Buzzy's 172 | CCM 173 | CDI Torque Products 174 | CETMA Cargo 175 | CHUMBA Racing 176 | CRUD 177 | CST 178 | CVLN (Civilian) 179 | CX Tape 180 | Caffelatex 181 | Calcott Brothers 182 | Calfee Design 183 | California Springs 184 | Caloi 185 | Camelbak 186 | Camillus 187 | Campagnolo 188 | Campion Cycle Company 189 | Cane Creek 190 | Canfield Brothers 191 | Cannondale 192 | Canyon bicycles 193 | Carmichael Training Systems 194 | Carrera bicycles 195 | CatEye 196 | Catrike 197 | Cayne 198 | Centurion 199 | CeramicSpeed 200 | Cervélo 201 | Chadwick 202 | Challenge 203 | Charge 204 | Chariot 205 | Chase 206 | Chater-Lea 207 | Chicago Bicycle Company 208 | Chris King 209 | Christiania Bikes 210 | Chromag 211 | Cielo 212 | Cignal 213 | Cilo 214 | Cinelli 215 | Ciocc 216 | Citizen Bike 217 | City Bicycles Company 218 | Civia 219 | Clark-Kent 220 | Claud Butler 221 | Clean Bottle 222 | Clement 223 | Cloud Nine 224 | Club Roost 225 | Co-Motion 226 | Coker Tire 227 | Colnago 228 | Colony 229 | Colossi 230 | Columbia 231 | Columbus Tubing 232 | Competition Cycles Services 233 | Condor 234 | Conor 235 | Continental 236 | Contour Sport 237 | Cook Bros. Racing 238 | Cooper Bikes 239 | Corima 240 | Corratec 241 | Cortina Cycles 242 | Cove 243 | Craft 244 | Crank Brothers 245 | Crank2 246 | Crazy Creek 247 | Create 248 | Creme Cycles 249 | Crescent Moon 250 | Crew 251 | Critical Cycles 252 | Crumpton 253 | Cube 254 | CueClip 255 | Cult 256 | Currie Technology (Currietech) 257 | Currys 258 | Cyclamatic 259 | Cycle Dog 260 | Cycle Force Group 261 | Cycle Stuff 262 | CycleAware 263 | CycleOps 264 | CyclePro 265 | Cycles Fanatic 266 | Cycles Follis 267 | Cycleurope 268 | Cyclo 269 | Cycloc 270 | Cyfac 271 | CygoLite 272 | Cytosport 273 | DAJO 274 | DEAN 275 | DHS 276 | DIG BMX 277 | DK Bikes 278 | DMR Bikes 279 | DNP 280 | DT Swiss 281 | DZ Nuts 282 | Da Bomb Bikes 283 | Daccordi 284 | Dahon 285 | Davidson 286 | Dawes Cycles 287 | De Rosa 288 | DeBernardi 289 | DeFeet 290 | DeSalvo Cycles 291 | Decathlon 292 | Deco 293 | Deda Elementi 294 | Deity 295 | Del Sol 296 | Della Santa 297 | Delta 298 | Deluxe 299 | Demolition 300 | Den Beste Sykkel 301 | Dengfu 302 | Derby Cycle 303 | Dermatone 304 | Dero 305 | Detroit Bikes 306 | Deuter 307 | Devinci 308 | Di Blasi Industriale 309 | Dia-Compe 310 | DiaTech 311 | Diadora 312 | Diamant 313 | Diamondback 314 | Dicta 315 | Dimension 316 | Discwing 317 | Doberman 318 | Dodici Milano 319 | Dolan 320 | Dorel Industries 321 | Dual Eyewear 322 | Dualco 323 | Dynacraft 324 | Dynamic Bicycles 325 | Dyno 326 | E-Case 327 | E. C. Stearns Bicycle Agency 328 | EAI (Euro Asia Imports) 329 | EBC 330 | EG Bikes (Metronome) 331 | EK USA 332 | EMC Bikes 333 | ENVE Composites 334 | ESI 335 | EVS Sports 336 | EZ Pedaler (EZ Pedaler electric bikes) 337 | Eagle Bicycle Manufacturing Company 338 | Eagles Nest Outfitters 339 | East Germany 340 | Eastern 341 | Easy Motion 342 | Ebisu 343 | Eddy Merckx 344 | Edinburgh Bicycle Co-operative 345 | EighthInch 346 | Electra 347 | Elevn Technologies 348 | Elite SRL 349 | Elliptigo 350 | Ellis 351 | Ellis Briggs 352 | Ellsworth 353 | Emilio Bozzi 354 | Endurance Films 355 | Enduro 356 | Endurox 357 | Energizer 358 | Engin Cycles 359 | Enigma Titanium 360 | Epic 361 | Ergon 362 | Esbit 363 | Europa 364 | Evelo 365 | Eveready 366 | Evil 367 | Excess Components 368 | Exustar 369 | FBM 370 | FRAMED 371 | FSA (Full Speed Ahead) 372 | Faggin 373 | Failure 374 | Fairdale 375 | Falco Bikes 376 | Falcon 377 | Faraday 378 | Fast Wax 379 | Fat City Cycles 380 | Fatback 381 | Fausto Coppi 382 | Federal 383 | Felt 384 | Fetish 385 | Fezzari 386 | FiberFix 387 | Fiction 388 | Field 389 | Finish Line 390 | Finite 391 | Firefly Bicycles 392 | Firefox 393 | Firenze 394 | Firmstrong 395 | First Endurance 396 | Fit bike Co. 397 | Fizik 398 | Fleet Velo 399 | Fleetwing 400 | Flybikes 401 | Flying Pigeon 402 | Flying Scot 403 | Flyxii 404 | Focale44 405 | Focus 406 | Foggle 407 | Fokhan 408 | Folmer & Schwing 409 | Fondriest 410 | Forge Bikes 411 | Formula 412 | Fortified (lights) 413 | Foundry Cycles 414 | Fox 415 | Fram 416 | Frances 417 | Francesco Moser (F. Moser) 418 | Freddie Grubb 419 | Free Agent 420 | Free Spirit 421 | Freedom 422 | Freeload 423 | FuelBelt 424 | Fuji 425 | Fulcrum 426 | Fyxation 427 | G Sport 428 | G-Form 429 | GMC 430 | GT Bicycles 431 | GU 432 | Gamut 433 | Gardin 434 | Garmin 435 | Gary Fisher 436 | Gates Carbon Drive 437 | Gateway 438 | Gavin 439 | Gazelle 440 | Gear Aid 441 | Gear Clamp 442 | Gear Up 443 | Geax 444 | Gendron Bicycles 445 | Genesis 446 | Genuine Innovations 447 | Geotech 448 | Gepida 449 | Ghost 450 | Giant 451 | Gibbon Slacklines 452 | Gilmour 453 | Giordano 454 | Gitane 455 | Glacier Glove 456 | Gladiator Cycle Company 457 | Globe 458 | Gnome et Rhône 459 | GoGirl 460 | Gomier 461 | Gore 462 | Gormully & Jeffery 463 | Grab On 464 | Grabber 465 | Graber 466 | Graflex 467 | Granite Gear 468 | Gravity 469 | Greenfield 470 | Greenspeed 471 | Gudereit 472 | Guerciotti 473 | Gunnar 474 | Guru 475 | Guyot Designs 476 | H Plus Son 477 | HBBC (Huntington Beach Bicycle, Co) 478 | HED 479 | HP Velotechnik 480 | Haibike (Currietech) 481 | Hallstrom 482 | Halo 483 | Hammer Nutrition 484 | Hampsten Cycles 485 | Handsome Cycles 486 | Handspun 487 | Hanford 488 | Haro 489 | Harry Quinn 490 | Harvey Cycle Works 491 | Hasa 492 | Hase bikes 493 | Hayes 494 | Head 495 | Headsweats 496 | Heinkel 497 | Helkama 498 | Hercules Fahrrad GmbH & Co 499 | Heritage https://files.bikeindex.org/uploads/Ma/995/heritage-logo.png 500 | Herkelmann 501 | Hero Cycles Ltd 502 | Heron 503 | Hetchins 504 | High Gear 505 | Highland 506 | Hija de la Coneja 507 | Hillman 508 | Hinton Cycles 509 | Hirschfeld 510 | Hirzl 511 | Hobson 512 | Hoffman 513 | Holdsworth 514 | Honey Stinger 515 | Hope 516 | House of Talents 517 | Hozan 518 | HubBub 519 | Hudz 520 | Huffy 521 | Hufnagel 522 | Humangear 523 | Humber 524 | Humble Frameworks 525 | Hunter 526 | Hurricane Components 527 | Hurtu 528 | Hutchinson 529 | Hyalite Equipment 530 | Hydrapak 531 | Hyper 532 | IBEX 533 | ICE Trikes (Inspired Cycle Engineering ) 534 | IMBA 535 | IRO Cycles 536 | ISM 537 | IZIP (Currietech) 538 | Ibis 539 | Ice Trekkers 540 | IceToolz 541 | Ideal Bikes 542 | Identiti 543 | Incredibell 544 | Independent Fabrication 545 | Industrieverband Fahrzeugbau 546 | Industry Nine 547 | Infini 548 | Inglis (Retrotec) 549 | Innerlight Cycles 550 | Innova 551 | Intense 552 | Iride Bicycles 553 | Iron Horse Bicycles 554 | Islabikes 555 | Issimo Designs 556 | Italvega 557 | Itera plastic bicycle 558 | Iver Johnson 559 | Iverson 560 | JMC Bicycles 561 | JP Weigle's 562 | Jagwire 563 | Jamis 564 | Jan Jansen 565 | Jandd 566 | Javelin 567 | Jelly Belly 568 | JetBoil 569 | Jittery Joe's 570 | John Cherry bicycles 571 | John Deere 572 | Jorg & Olif 573 | Juliana Bicycles 574 | K-Edge 575 | K2 576 | KBC 577 | KHS Bicycles 578 | KMC 579 | KS 580 | KT Tape 581 | KTM 582 | KW Bicycle 583 | Kalkhoff 584 | Kalloy 585 | Katadyn 586 | Kazam 587 | Keith Bontrager 588 | Kellys Bicycles 589 | Kenda 590 | Kent 591 | Kestrel 592 | Kettler 593 | Kind Bar 594 | Kinesis 595 | Kinesis Industry 596 | Kinetic 597 | Kinetic Koffee 598 | Kink 599 | Kirk 600 | Kish Fabrication 601 | Kiss My Face 602 | Klean Kanteen 603 | Klein Bikes 604 | Knog 605 | Knolly 606 | Koga-Miyata 607 | Kogswell Cycles 608 | Kona 609 | Kool Kovers 610 | Kool-Stop 611 | Kreitler 612 | Kron 613 | Kronan 614 | Kross SA 615 | Kryptonite 616 | Kuat 617 | Kuota 618 | Kustom Kruiser 619 | Kuwahara 620 | LDG (Livery Design Gruppe) 621 | LOW// 622 | Land Shark 623 | Lapierre 624 | Laurin & Klement 625 | Lazer 626 | LeMond Racing Cycles 627 | Leader Bikes 628 | Leg Lube 629 | Legacy Frameworks 630 | Leopard 631 | Lezyne 632 | Light My Fire 633 | Light and Motion 634 | Lightning Cycle Dynamics 635 | Lightspeed 636 | Linus 637 | Liotto (Cicli Liotto Gino & Figli) 638 | Litespeed 639 | Liteville 640 | Lizard Skins 641 | Loctite 642 | Loekie 643 | Lonely Planet 644 | Look 645 | Lotus 646 | Louis Garneau 647 | Louison Bobet 648 | Lycoming Engines 649 | Lynskey 650 | M Essentials 651 | MBK 652 | MEC (Mountain Equipment Co-op) 653 | MKS 654 | MMR 655 | MRP 656 | MSR 657 | MTI Adventurewear 658 | Madsen 659 | Madwagon 660 | Magellan 661 | Magna 662 | Malvern Star 663 | ManKind 664 | Mango 665 | Manhattan 666 | Manitou 667 | Map Bicycles 668 | Maraton 669 | Marin Bikes 670 | Marinoni 671 | Marson 672 | Maruishi 673 | Marukin 674 | Marzocchi 675 | Masi 676 | Master Lock 677 | Matchless 678 | Matra 679 | Maverick 680 | Mavic 681 | Maxit 682 | Maxxis 683 | Mechanical Threads 684 | Meiser 685 | Melon Bicycles 686 | Mercian Cycles 687 | Mercier 688 | Merida Bikes 689 | Merlin 690 | Merrell 691 | MetaBikes 692 | Metric Hardware 693 | Metrofiets 694 | Micajah C. Henley 695 | Micargi 696 | Miche 697 | Michelin 698 | MicroShift 699 | Miele bicycles 700 | Mikkelsen 701 | Milwaukee Bicycle Co. 702 | Minoura 703 | MirraCo 704 | Mirrycle 705 | Mission Bicycles 706 | Miyata 707 | Mizutani 708 | Monark 709 | Mondia 710 | Mondraker 711 | Mongoose 712 | Montague 713 | Moots Cycles 714 | Mophie 715 | Mosaic 716 | Moser Cicli 717 | Mosh 718 | Mosso 719 | Moth Attack 720 | Motiv 721 | Motobecane 722 | Moulden 723 | Moulton Bicycle 724 | Mountain Cycles 725 | Mountainsmith 726 | Mr. Tuffy 727 | Muddy Fox 728 | Murray 729 | Mutant Bikes 730 | Mutiny 731 | Müsing (Musing) 732 | N Gear 733 | NEMO 734 | NS Bikes 735 | Nakamura 736 | Naked 737 | Nalgene 738 | Nantucket Bike Basket Company 739 | Nashbar 740 | Nathan 741 | National 742 | Native 743 | Neil Pryde 744 | Nema 745 | Neobike 746 | New Albion 747 | New Balance 748 | Next 749 | Niner 750 | Nirve 751 | Nishiki 752 | Nite Ize 753 | NiteRider 754 | Nitto 755 | Nokon 756 | Norco Bikes 757 | Norman Cycles 758 | North Shore Billet 759 | Northrock 760 | Novara 761 | NuVinci 762 | Nukeproof 763 | Nymanbolagen 764 | O-Stand 765 | O2 766 | ODI 767 | OHM 768 | Odyssey 769 | Ohio Travel Bag 770 | Olmo 771 | On-One (On One) 772 | OnGuard 773 | One Way 774 | Opel 775 | Optic Nerve 776 | Optimus 777 | Opus 778 | Orange 779 | Orange Seal 780 | Orbea 781 | Orbit 782 | Orient Bikes 783 | Origin8 (Origin-8) 784 | Ortlieb 785 | Other 786 | Otis Guy 787 | Oury 788 | OutGo 789 | Owl 360 790 | Oyama 791 | Ozone 792 | PDW 793 | POC 794 | PUBLIC bikes 795 | Pace Sportswear 796 | Paceline Products 797 | Pacific Cycle 798 | PackTowl 799 | Pake 800 | Panaracer 801 | Panasonic 802 | Paper Bicycle 803 | Park 804 | Parkpre 805 | Parlee 806 | Pashley Cycles 807 | Patria 808 | Paul 809 | Pearl Izumi 810 | Pedco 811 | Pedego 812 | Pedersen bicycle 813 | Pedro's 814 | Pegoretti 815 | Penguin Brands 816 | Pereira 817 | Performance 818 | Peugeot 819 | Phat Cycles 820 | Phil Wood 821 | Philips 822 | Phillips Cycles 823 | Phoenix 824 | Phorm 825 | Pierce-Arrow 826 | Pilen 827 | Pinarello 828 | Pinhead 829 | Pitlock 830 | Pivot 831 | Planet Bike 832 | Planet X 833 | Platypus 834 | Pletscher 835 | Po Campo 836 | Pocket Bicycles 837 | Pogliaghi 838 | Polar 839 | Polar Bottles 840 | Polygon 841 | Pope Manufacturing Company 842 | Power Grips 843 | PowerBar 844 | PowerTap 845 | Premium 846 | Price 847 | Primal Wear 848 | Primo 849 | Primus Mootry (PM Cycle Fabrication) 850 | Princeton Tec 851 | Principia 852 | Private label 853 | Pro-tec 854 | ProBar 855 | ProGold 856 | Problem Solvers 857 | Procycle Group 858 | Prodeco 859 | Profile Design 860 | Profile Racing 861 | Prologo 862 | Promax 863 | Prophete 864 | Puch 865 | Pure Fix 866 | Python 867 | Python Pro 868 | Q-Outdoor 869 | Q-Tubes 870 | QBP 871 | Quadrant Cycle Company 872 | Quest 873 | Quik Stik 874 | Quintana Roo 875 | R12 876 | RIH 877 | RPM 878 | RRB (Rat Rod Bikes) 879 | RST 880 | Rabeneick 881 | RaceFace 882 | Racktime 883 | Radio Flyer 884 | Raleigh 885 | Ram 886 | Rambler 887 | Rans Designs 888 | Rawland Cycles 889 | Razor 890 | ReTale 891 | Redline 892 | Redlof 893 | Reflect Sports 894 | Regina 895 | Rema 896 | Renthal 897 | René Herse 898 | Republic 899 | Republic of China 900 | Resist 901 | Retrospec 902 | Revelate Designs 903 | Revolights 904 | Rhythm 905 | Ribble 906 | Ride2 907 | Ridgeback 908 | Ridley 909 | Riese und Müller 910 | Ritchey 911 | Ritte 912 | Rivendell Bicycle Works 913 | Roadmaster 914 | Roberts Cycles 915 | Robin Hood 916 | Rock Lobster 917 | Rock-N-Roll 918 | RockShox 919 | Rocky Mountain Bicycles 920 | Rocky Mounts 921 | Rodriguez 922 | Rohloff 923 | Rokform 924 | Rola 925 | Ross 926 | Rossignol 927 | Rossin 928 | Rover Company 929 | Rowbike 930 | Rox 931 | Royal 932 | Royce Union 933 | Rudge-Whitworth 934 | S and M (S&M) 935 | S and S 936 | SCOTT 937 | SDG 938 | SE Bikes (SE Racing) 939 | SKS 940 | SLS3 941 | SR Suntour 942 | SRAM 943 | SST 944 | START 945 | SWEAT GUTR 946 | Salomon 947 | Salsa 948 | SaltStick 949 | Samchuly 950 | Sancineto 951 | Sanderson 952 | Santa Cruz 953 | Santana Cycles 954 | Saracen Cycles 955 | Saris 956 | Scania AB 957 | Scattante 958 | Schindelhauer 959 | Schwalbe 960 | Schwinn 961 | Scotty 962 | Seal Line 963 | Sears Roebuck 964 | Season 965 | Seattle Sports Company 966 | Sekai 967 | Sekine 968 | Selle Anatomica 969 | Selle Italia 970 | Selle Royal 971 | Selle San Marco 972 | Serotta 973 | Sette 974 | Seven Cycles 975 | Shadow Conspiracy 976 | Shelby Cycle Company 977 | Sherpani 978 | Shimano 979 | Shinola 980 | Shogun 981 | Shredder 982 | Sidi 983 | Sierra Designs 984 | Sigma 985 | Silca 986 | Simple Green 987 | Simplon 988 | Simson 989 | Sinclair Research 990 | Singletrack Solutions 991 | Sinz 992 | Six-Eleven 993 | SixSixOne 994 | Skadi 995 | Skinz 996 | Skratch Labs 997 | Skyway 998 | Slime 999 | Smartwool 1000 | SockGuy 1001 | Sohrab Cycles 1002 | Solex 1003 | Solio 1004 | Solé (Sole bicycles) 1005 | Soma 1006 | Somec 1007 | Sonoma 1008 | Soulcraft 1009 | Source 1010 | Spalding Bicycles 1011 | Sparta B.V. 1012 | Specialized 1013 | Spectrum 1014 | Speedfil 1015 | Speedwell bicycles 1016 | Spenco 1017 | Spicer 1018 | SpiderTech 1019 | Spike 1020 | Spinskins 1021 | Spooky 1022 | SportRack 1023 | Sportlegs 1024 | Sportourer 1025 | Spot 1026 | Sprintech 1027 | Squeal Out 1028 | Squire 1029 | St. Tropez 1030 | Stages cycling (Power meters) 1031 | Staiger 1032 | Stan's No Tubes 1033 | Standard Byke 1034 | Stanley 1035 | Stanridge Speed 1036 | State Bicycle Co. 1037 | Steadyrack 1038 | Steelman Cycles 1039 | Stein 1040 | Stein Trikes 1041 | Stelber Cycle Corp 1042 | Stella 1043 | Stem CAPtain 1044 | Sterling Bicycle Co. 1045 | Steve Potts 1046 | Stevens 1047 | Stevenson Custom Bicycles 1048 | Stoemper 1049 | Stolen Bicycle Co. 1050 | Stop Flats 2 1051 | Strada Customs 1052 | Stradalli Cycles 1053 | Straitline 1054 | Strida 1055 | Strider 1056 | Stromer 1057 | Strong Frames 1058 | Sturmey-Archer 1059 | Stålhästen 1060 | Subrosa 1061 | Suelo 1062 | Sugino 1063 | Sun 1064 | Sun Ringle 1065 | SunRace 1066 | Sunday 1067 | Sunn 1068 | Suomi 1069 | Superfeet 1070 | Supernova 1071 | Surly 1072 | Surrey 1073 | Sutherlands 1074 | Suunto 1075 | Suzuki 1076 | Sweatpea Bicycles 1077 | Swingset 1078 | Swix 1079 | Swobo 1080 | SyCip 1081 | Syntace 1082 | T Mat Pro 1083 | TET Cycles (Tom Teesdale Bikes) 1084 | TH Industries 1085 | TI Cycles of India 1086 | TRP 1087 | TYR 1088 | Tacx 1089 | Takara 1090 | Talisman 1091 | Tallac 1092 | Tamer 1093 | Tange-Seiki 1094 | Tangent Products 1095 | Tati Cycles https://files.bikeindex.org/uploads/Ma/1209/tati.jpg 1096 | Taylor Bicycles (Paul Taylor) 1097 | Tec Labs 1098 | Tektro 1099 | Tern 1100 | Terra Trike 1101 | Terrible One 1102 | Terrot 1103 | Terry 1104 | The Arthur Pequegnat Clock Company 1105 | The Bicycle Forge 1106 | The Hive 1107 | Thinksport 1108 | Thomson 1109 | Thorn Cycles 1110 | Thruster 1111 | Thule 1112 | Ti Cycles 1113 | Tigr 1114 | Timbuk2 1115 | Time 1116 | Timex 1117 | Tioga 1118 | Titan 1119 | Titus 1120 | Toko 1121 | Tommasini 1122 | Tommaso 1123 | Tony Hawk 1124 | Topeak 1125 | TorHans 1126 | Torelli 1127 | Torker 1128 | Tour de France 1129 | Toyo 1130 | Traitor 1131 | Transit 1132 | Transition Bikes 1133 | Tranz-X 1134 | Tree 1135 | Trek 1136 | Tressostar 1137 | TriFlow 1138 | TriSlide 1139 | TriSwim 1140 | Trigger Point 1141 | Trik Topz 1142 | Trinx 1143 | Triumph Cycle 1144 | TruVativ 1145 | Tubasti 1146 | Tufo 1147 | Tunturi 1148 | Turin 1149 | Turner Bicycles 1150 | Twin Six 1151 | TwoFish 1152 | UCLEAR 1153 | UCO 1154 | Uline 1155 | Ultimate Survival Technologies 1156 | UltraPaws 1157 | Umberto Dei 1158 | Unior 1159 | Univega 1160 | Unknown 1161 | Upland 1162 | Urago 1163 | Utopia 1164 | VP Components 1165 | VSF Fahrradmanufaktur 1166 | Valdora 1167 | Van Dessel 1168 | Van Herwerden 1169 | Vanilla 1170 | Vanmoof 1171 | Vargo 1172 | Vassago 1173 | Vee Rubber 1174 | Velo 1175 | Velo Orange 1176 | Velo Press 1177 | Velo Vie 1178 | Velocity 1179 | Velomotors 1180 | Velorbis 1181 | Velox 1182 | Verde 1183 | Versa 1184 | Vilano 1185 | Villy Customs 1186 | Vincero Design 1187 | Vindec High Riser 1188 | Virtue 1189 | Viscount 1190 | Vision 1191 | Vittoria 1192 | Vitus 1193 | Viva 1194 | Vivente 1195 | Volae 1196 | Volagi 1197 | Volume 1198 | Voodoo 1199 | Vortrieb 1200 | VéloSoleX 1201 | WD-40 Bike 1202 | WTB 1203 | Wabi Cycles 1204 | Wahoo Fitness 1205 | Wald 1206 | Walking Bird 1207 | Waterford 1208 | WeThePeople 1209 | WeeRide 1210 | Weehoo 1211 | Wellgo 1212 | Wheels Manufacturing 1213 | Wheelsmith 1214 | Where to Bike 1215 | Whisky Parts Co 1216 | Whispbar 1217 | White Bros 1218 | White Lightning 1219 | Wigwam 1220 | Wilderness Trail Bikes 1221 | Wilier Triestina 1222 | Williams 1223 | Willworx 1224 | Win 1225 | Windsor 1226 | Winora 1227 | Winter Bicycles 1228 | Wippermann 1229 | Witcomb Cycles 1230 | Witz 1231 | Wooden Bike Coffee 1232 | WordLock 1233 | WorkCycles 1234 | Worksman Cycles 1235 | World Jerseys 1236 | Wright Cycle Company 1237 | X-Fusion 1238 | X-Lab 1239 | X-Treme 1240 | Xds 1241 | Xootr 1242 | Xpedo 1243 | Xtracycle 1244 | YST 1245 | Yakima 1246 | Yaktrax 1247 | Yamaguchi Bicycles 1248 | Yamaha 1249 | Yankz 1250 | Yeti 1251 | Yuba 1252 | Yurbuds 1253 | Zensah 1254 | Zigo 1255 | Zinn Cycles 1256 | Zipp Speed Weaponry 1257 | Zoic 1258 | Zoom 1259 | Zoot 1260 | Zycle Fix 1261 | b'Twin 1262 | beixo 1263 | de Fietsfabriek 1264 | di Florino 1265 | e*thirteen 1266 | eGear 1267 | eZip 1268 | eflow (Currietech) 1269 | elete 1270 | epicRIDES 1271 | name 1272 | nuun 1273 | sixthreezero 1274 | van Andel/Bakfiets 1275 | -------------------------------------------------------------------------------- /examples/manufacturers.tsv: -------------------------------------------------------------------------------- 1 | id text category priority website logo 2 | 7 24seven Frame manufacturer 10 http://www.leisurelakesbikes.com/bikes/bmx-bikes/b/24seven 3 | 1125 3G Frame manufacturer 10 http://www.3gbikes.com/ 4 | 375 3T Manufacturer 10 5 | 374 3rd Eye Manufacturer 10 6 | 1112 3rensho Frame manufacturer 10 7 | 376 45North Manufacturer 10 8 | 377 4ZA Manufacturer 10 9 | 1274 6KU Frame manufacturer 10 http://6kubikes.com https://files.bikeindex.org/uploads/Ma/1274/6kubikescom.png 10 | 1113 9 zero 7 Frame manufacturer 10 https://www.facebook.com/9Zero7Bikes 11 | 378 A-Class Manufacturer 10 12 | 8 A-bike Frame manufacturer 10 http://www.a-bike.co.uk/ 13 | 1212 A2B e-bikes Frame manufacturer 10 http://www.wearea2b.com/us/ 14 | 380 ABI Manufacturer 10 15 | 384 ACS Manufacturer 10 16 | 1255 AGang Frame manufacturer 10 http://www.agang.eu 17 | 24 ALAN Frame manufacturer 10 http://www.alanbike.it/ 18 | 29 AMF Frame manufacturer 10 19 | 1268 AXA Manufacturer 10 http://www.axa-stenman.com/en/bicycle-components/locks/frame-locks/defender/ 20 | 379 Aardvark Manufacturer 10 21 | 9 Abici Frame manufacturer 10 http://www.abici-italia.it/en/index.html 22 | 107 Abus Manufacturer 10 http://www.abus.com/eng/Mobile-Security/Bike-safety-and-security/Locks 23 | 382 Accelerade Manufacturer 10 24 | 10 Accell Frame manufacturer 10 http://www.accell-group.com/uk/accell-group.asp 25 | 1042 Access Frame manufacturer 10 https://www.performancebike.com/ 26 | 383 Acros Manufacturer 10 27 | 1293 Acstar Frame manufacturer 10 http://www.acstar.cz/ 28 | 1258 Adams (Trail a bike) Frame manufacturer 10 http://www.trail-a-bike.com/ 29 | 77 Adolphe Clément Frame manufacturer 10 30 | 385 Adventure Medical Kits Manufacturer 10 31 | 1260 Aegis Frame manufacturer 10 http://www.aegisbicycles.com/home.html 32 | 1002 Aerofix Cycles Frame manufacturer 10 http://www.aerofixcycles.com/ 33 | 1199 Affinity Cycles Frame manufacturer 10 http://affinitycycles.com/ 34 | 386 AheadSet Manufacturer 10 35 | 1133 Airborne Frame manufacturer 10 http://www.airbornebicycles.com/ 36 | 23 Aist Bicycles Frame manufacturer 10 http://aist-bike.com/ 37 | 387 Aladdin Manufacturer 10 38 | 25 Alcyon Frame manufacturer 10 39 | 388 Alex Manufacturer 10 40 | 214 Alexander Leutner & Co. Frame manufacturer 10 41 | 1013 Alien Bikes Frame manufacturer 10 http://alienbikes.com/ 42 | 389 Alienation Manufacturer 10 43 | 390 Alite Designs Manufacturer 10 44 | 371 All City Frame manufacturer 100 http://allcitycycles.com https://files.bikeindex.org/uploads/Ma/371/all-city.png 45 | 26 Alldays & Onions Frame manufacturer 10 46 | 1257 Alliance Frame manufacturer 10 http://alliancebicycles.com/ 47 | 1366 Alton Frame manufacturer 10 http://altonus.com/ 48 | 27 American Bicycle Company Frame manufacturer 10 49 | 391 American Classic Manufacturer 10 50 | 28 American Machine and Foundry Frame manufacturer 10 51 | 31 American Star Bicycle Frame manufacturer 10 52 | 1355 Amoeba Frame manufacturer 10 http://www.amoebaparts.com/ 53 | 392 And Manufacturer 10 54 | 393 Andiamo Manufacturer 10 55 | 394 Answer BMX Manufacturer 10 56 | 1099 Apollo Frame manufacturer 10 http://www.apollobikes.com/ 57 | 396 Aqua Sphere Manufacturer 10 58 | 397 Aquamira Manufacturer 10 59 | 398 Arai Manufacturer 10 60 | 1379 Ares Frame manufacturer 10 http://www.aresbikes.com/ 61 | 32 Argon 18 Frame manufacturer 10 http://www.argon18bike.com/velo.html 62 | 1081 Asama Frame manufacturer 10 http://www.asamabicycles.com/ 63 | 994 Asda Frame manufacturer 10 http://direct.asda.com/Bikes/AD080202,default,sc.html 64 | 399 Assos Manufacturer 10 65 | 17 Atala Frame manufacturer 10 66 | 400 Atomlab Frame manufacturer 10 http://www.atomlab.com/ 67 | 33 Author Frame manufacturer 10 http://www.author.eu/ 68 | 1126 Avalon Frame manufacturer 10 http://www.walmart.com/ 69 | 34 Avanti Frame manufacturer 10 http://www.avantibikes.com/nz/ 70 | 1059 Aventón Frame manufacturer 10 http://aventonbikes.com/ 71 | 401 Avid Manufacturer 10 72 | 402 Axiom Manufacturer 10 73 | 403 Axle Release Manufacturer 10 74 | 1156 Azonic Frame manufacturer 10 http://www.oneal.com/index.php/home/azonic-prime 75 | 1120 Azor Frame manufacturer 10 http://www.azor.nl/ 76 | 404 Aztec Manufacturer 10 77 | 1101 Azzuri Frame manufacturer 10 http://www.azzurribikes.com/ 78 | 410 BCA Manufacturer 10 79 | 36 BH Bikes (Beistegui Hermanos) Frame manufacturer 10 http://bhbikes-us.com 80 | 359 BMC Frame manufacturer 10 http://www.bmc-racing.com https://files.bikeindex.org/uploads/Ma/359/wwwbmcracingcom.png 81 | 424 BOB Manufacturer 10 http://www.bobgear.com/bike-trailers 82 | 429 BONT Manufacturer 10 83 | 431 BOX Manufacturer 10 84 | 437 BSD Manufacturer 10 85 | 1015 BULLITT Frame manufacturer 10 http://www.larryvsharry.com/english/ 86 | 989 Bacchetta Frame manufacturer 10 http://www.bacchettabikes.com/ 87 | 405 Backpacker's Pantry Manufacturer 10 88 | 1025 Backward Circle Frame manufacturer 10 http://www.backwardcircle.com/ 89 | 406 Bahco Manufacturer 10 90 | 958 Bailey Frame manufacturer 10 http://www.bailey-bikes.com 91 | 407 Baladeo Manufacturer 10 92 | 1307 Bamboo Cycles Frame manufacturer 10 http://bamboocycles.com/ 93 | 408 Banjo Brothers Manufacturer 10 94 | 1066 Banshee bikes Frame manufacturer 10 http://www.bansheebikes.com https://files.bikeindex.org/uploads/Ma/1066/wwwbansheebikescom.png 95 | 1362 Bantam (Bantam Bicycle works) Frame manufacturer 10 http://www.bantambicycles.com/ 96 | 409 Bar Mitts Manufacturer 10 97 | 1134 Barracuda Frame manufacturer 10 http://www.barracudabikes.co.uk/ 98 | 35 Basso Frame manufacturer 10 http://www.bassobikes.com/ 99 | 18 Batavus Frame manufacturer 10 http://www.batavus.com/ 100 | 1223 Bazooka Frame manufacturer 10 http://www.bazookasports.com/ 101 | 1044 BeOne Frame manufacturer 10 http://www.beone-bikes.com/ 102 | 1024 Beater Bikes Frame manufacturer 10 http://beaterbikes.net/ 103 | 1235 Bell Manufacturer 10 104 | 411 Bellwether Manufacturer 10 105 | 1110 Benotto Frame manufacturer 10 106 | 1031 Bergamont Frame manufacturer 10 http://www.bergamont.de/ 107 | 1383 Bertoni Frame manufacturer 10 108 | 412 Bertucci Manufacturer 10 109 | 129 Bianchi Frame manufacturer 500 http://www.bianchi.com/ 110 | 39 Bickerton Frame manufacturer 10 111 | 413 Bicycle Research Manufacturer 10 112 | 414 Big Agnes Inc Manufacturer 10 113 | 1152 Big Shot Frame manufacturer 10 http://www.bigshotbikes.com/ 114 | 415 Bike Fit Systems Manufacturer 10 115 | 40 Bike Friday Frame manufacturer 10 http://bikefriday.com/ 116 | 1017 Bike Mielec Frame manufacturer 10 http://www.bikemielec.com/ 117 | 416 Bike Ribbon Manufacturer 10 118 | 417 Bike-Aid Manufacturer 10 119 | 418 Bike-Eye Manufacturer 10 120 | 419 Bike-O-Vision Manufacturer 10 121 | 1148 Bike4Life Frame manufacturer 10 122 | 1100 BikeE recumbents Frame manufacturer 10 123 | 420 Bikes Belong Manufacturer 10 124 | 421 Bikeverywhere Manufacturer 10 125 | 41 Bilenky Cycle Works Frame manufacturer 10 http://www.bilenky.com/Home.html 126 | 42 Biomega Frame manufacturer 10 http://biomega.dk/biomega.aspx 127 | 422 BionX Manufacturer 10 128 | 255 Birdy Frame manufacturer 10 http://www.birdybike.com/ 129 | 944 Biria Frame manufacturer 10 http://www.biria.com/ 130 | 43 Birmingham Small Arms Company Frame manufacturer 10 131 | 1350 Bishop Frame manufacturer 10 http://bishopbikes.com/ 132 | 423 Black Diamond Manufacturer 10 133 | 109 Black Market Frame manufacturer 10 http://www.blackmarketbikes.com 134 | 1178 Black Mountain Cycles Frame manufacturer 10 http://www.blackmtncycles.com/ 135 | 1034 Black Sheep Bikes Frame manufacturer 10 http://blacksheepbikes.com/ 136 | 1167 Blue Frame manufacturer 10 http://www.rideblue.com/ 137 | 44 Boardman Bikes Frame manufacturer 10 http://www.boardmanbikes.com/ 138 | 1032 Bobbin Frame manufacturer 10 http://www.bobbinbikes.co.uk/ 139 | 425 BodyGlide Manufacturer 10 140 | 426 Boeshield Manufacturer 10 141 | 45 Bohemian Bicycles Frame manufacturer 10 http://www.bohemianbicycles.com/ 142 | 427 Bondhus Manufacturer 10 143 | 428 Bonk Breaker Manufacturer 10 144 | 1286 Boo Bicycles Frame manufacturer 10 http://boobicycles.com/ 145 | 1304 Boreal Frame manufacturer 10 http://borealbikes.com/ 146 | 1305 Borealis (fat bikes) Frame manufacturer 10 http://www.borealisbikes.com/ 147 | 430 Boreas Gear Manufacturer 10 148 | 48 Borile Frame manufacturer 10 http://www.borile.it/gb_chi.html 149 | 49 Bottecchia Frame manufacturer 10 http://www.bottecchia.co.uk/ 150 | 1016 Boulder Bicycles Frame manufacturer 10 http://www.renehersebicycles.com/Randonneur%20bikes.htm 151 | 432 Brannock Device Co Manufacturer 10 152 | 51 Brasil & Movimento Frame manufacturer 10 http://www.brasilemovimento.com.br 153 | 433 Brave Soldier Manufacturer 10 154 | 1354 Breadwinner Frame manufacturer 10 http://breadwinnercycles.com/ 155 | 1363 Breakbrake17 Bicycle Co. Frame manufacturer 10 http://breakbrake17.com/ 156 | 941 Breezer Frame manufacturer 100 http://www.breezerbikes.com/ 157 | 52 Brennabor Frame manufacturer 10 http://brennabor.pl/ 158 | 53 Bridgestone Frame manufacturer 100 http://www.bridgestone.com/ 159 | 1381 Brilliant Bicycle Frame manufacturer 10 http://brilliant.co/ 160 | 54 British Eagle Frame manufacturer 10 161 | 1128 Brodie Frame manufacturer 10 http://www.brodiebikes.com/2014/ 162 | 1246 Broke Bikes Frame manufacturer 10 https://brokebik.es/ 163 | 55 Brompton Bicycle Frame manufacturer 10 http://www.brompton.co.uk/ 164 | 1098 Brooklyn Bicycle Co. Frame manufacturer 10 http://www.brooklynbicycleco.com/ 165 | 435 Brooks England LTD. Manufacturer 10 http://www.brooksengland.com/ 166 | 1239 Browning Frame manufacturer 10 167 | 56 Brunswick Corporation Frame manufacturer 10 http://www.brunswick.com/ 168 | 436 Brush Research Manufacturer 10 169 | 1265 Budnitz Frame manufacturer 10 http://budnitzbicycles.com/ 170 | 438 Buff Manufacturer 10 171 | 439 Burley Manufacturer 10 172 | 57 Burley Design Frame manufacturer 10 http://www.burley.com/ 173 | 440 Bushnell Manufacturer 10 174 | 441 Buzzy's Manufacturer 10 175 | 271 CCM Frame manufacturer 10 176 | 450 CDI Torque Products Manufacturer 10 177 | 1369 CETMA Cargo Frame manufacturer 10 http://cetmacargo.com/ 178 | 72 CHUMBA Racing Frame manufacturer 10 http://chumbabikes.com/ 179 | 468 CRUD Manufacturer 10 180 | 469 CST Manufacturer 10 181 | 1093 CVLN (Civilian) Frame manufacturer 10 http://www.ridecvln.com/ 182 | 471 CX Tape Manufacturer 10 183 | 442 Caffelatex Manufacturer 10 184 | 58 Calcott Brothers Frame manufacturer 10 185 | 59 Calfee Design Frame manufacturer 10 http://www.calfeedesign.com/ 186 | 443 California Springs Manufacturer 10 187 | 60 Caloi Frame manufacturer 10 http://www.caloi.com/home/ 188 | 444 Camelbak Manufacturer 10 http://www.camelbak.com/ 189 | 445 Camillus Manufacturer 10 190 | 446 Campagnolo Manufacturer 10 http://www.campagnolo.com/ 191 | 61 Campion Cycle Company Frame manufacturer 10 192 | 447 Cane Creek Manufacturer 10 http://www.canecreek.com/ 193 | 1183 Canfield Brothers Frame manufacturer 10 http://canfieldbrothers.com/ 194 | 62 Cannondale Frame manufacturer 500 http://www.cannondale.com/ 195 | 63 Canyon bicycles Frame manufacturer 10 http://www.canyon.com/ 196 | 448 Carmichael Training Systems Manufacturer 10 197 | 64 Carrera bicycles Frame manufacturer 10 http://www.carrera-podium.it/ 198 | 449 CatEye Manufacturer 10 199 | 66 Catrike Frame manufacturer 10 http://www.catrike.com/ 200 | 1179 Cayne Frame manufacturer 10 http://www.sun.bike/ 201 | 68 Centurion Frame manufacturer 100 http://www.centurion.de/en_int 202 | 451 CeramicSpeed Manufacturer 10 203 | 69 Cervélo Frame manufacturer 100 http://www.cervelo.com/en/ 204 | 452 Chadwick Manufacturer 10 205 | 453 Challenge Manufacturer 10 206 | 940 Charge Frame manufacturer 10 http://www.chargebikes.com/ 207 | 1129 Chariot Frame manufacturer 10 http://www.thule.com/en-us/us/products/active-with-kids 208 | 454 Chase Manufacturer 10 209 | 70 Chater-Lea Frame manufacturer 10 210 | 71 Chicago Bicycle Company Frame manufacturer 10 211 | 455 Chris King Manufacturer 10 212 | 1247 Christiania Bikes Frame manufacturer 10 http://christianiabikes.com/en/ 213 | 456 Chromag Frame manufacturer 10 http://www.chromagbikes.com 214 | 1218 Cielo Frame manufacturer 10 http://cielo.chrisking.com/ 215 | 1084 Cignal Frame manufacturer 10 216 | 73 Cilo Frame manufacturer 10 217 | 74 Cinelli Frame manufacturer 10 http://www.cinelli-usa.com/ 218 | 1130 Ciocc Frame manufacturer 10 http://www.ciocc.it/ 219 | 1068 Citizen Bike Frame manufacturer 10 http://www.citizenbike.com/ 220 | 937 City Bicycles Company Frame manufacturer 10 http://citybicycleco.com https://files.bikeindex.org/uploads/Ma/937/citybicyclecocom.png 221 | 372 Civia Frame manufacturer 10 http://www.civiacycles.com https://files.bikeindex.org/uploads/Ma/372/wwwciviacyclescom.png 222 | 75 Clark-Kent Frame manufacturer 10 223 | 76 Claud Butler Frame manufacturer 10 http://claudbutler.co.uk/ 224 | 457 Clean Bottle Manufacturer 10 225 | 458 Clement Manufacturer 10 226 | 459 Cloud Nine Manufacturer 10 227 | 460 Club Roost Manufacturer 10 228 | 78 Co-Motion Frame manufacturer 10 http://www.co-motion.com/ 229 | 79 Coker Tire Frame manufacturer 10 http://www.cokertire.com/ 230 | 80 Colnago Frame manufacturer 10 http://www.colnago.com/bicycles/ 231 | 1225 Colony Frame manufacturer 10 http://www.colonybmx.com 232 | 1374 Colossi Frame manufacturer 10 http://www.colossicycling.com/ 233 | 1146 Columbia Frame manufacturer 10 234 | 1295 Columbus Tubing Frame manufacturer 10 http://www.columbustubi.com/ 235 | 461 Competition Cycles Services Manufacturer 10 236 | 959 Condor Frame manufacturer 10 http://www.condorcycles.com/ 237 | 978 Conor Frame manufacturer 10 http://www.conorbikes.com/ 238 | 462 Continental Manufacturer 10 239 | 463 Contour Sport Manufacturer 10 240 | 1060 Cook Bros. Racing Frame manufacturer 10 241 | 936 Cooper Bikes Frame manufacturer 10 http://www.cooperbikes.com https://files.bikeindex.org/uploads/Ma/936/wwwcooperbikescom.png 242 | 81 Corima Frame manufacturer 10 http://www.corima.com/ 243 | 1205 Corratec Frame manufacturer 10 http://www.corratec.com/ 244 | 82 Cortina Cycles Frame manufacturer 10 http://www.cortinacycles.com/ 245 | 1139 Cove Frame manufacturer 10 http://covebike.com/ 246 | 464 Craft Manufacturer 10 247 | 465 Crank Brothers Manufacturer 10 248 | 1220 Crank2 Frame manufacturer 10 http://www.crank-2.com 249 | 466 Crazy Creek Manufacturer 10 250 | 1095 Create Frame manufacturer 10 http://www.createbikes.com/ 251 | 1224 Creme Cycles Frame manufacturer 10 http://cremecycles.com https://files.bikeindex.org/uploads/Ma/1224/cremecyclescom.png 252 | 467 Crescent Moon Manufacturer 10 253 | 1253 Crew Frame manufacturer 10 http://crewbikeco.com/ 254 | 935 Critical Cycles Frame manufacturer 10 http://www.criticalcycles.com/ 255 | 1348 Crumpton Frame manufacturer 10 http://www.crumptoncycles.com/ 256 | 1391 Cruzbike Frame manufacturer 10 http://cruzbike.com/ 257 | 83 Cube Frame manufacturer 10 http://www.cube.eu/en/cube-bikes/ 258 | 470 CueClip Manufacturer 10 259 | 362 Cult Frame manufacturer 10 http://www.cultcrew.com 260 | 1115 Currie Technology (Currietech) Frame manufacturer 10 http://www.currietech.com/ 261 | 84 Currys Frame manufacturer 10 http://www.currys.co.uk/gbuk/index.html 262 | 1367 Cyclamatic Frame manufacturer 10 263 | 472 Cycle Dog Manufacturer 10 264 | 89 Cycle Force Group Frame manufacturer 10 http://www.cyclefg.com/ 265 | 473 Cycle Stuff Manufacturer 10 266 | 474 CycleAware Manufacturer 10 267 | 475 CycleOps Manufacturer 10 268 | 964 CyclePro Frame manufacturer 10 269 | 1291 Cycles Fanatic Frame manufacturer 10 http://www.cyclesfanatic.com/ 270 | 145 Cycles Follis Frame manufacturer 10 271 | 1385 Cycles Toussaint Frame manufacturer 10 http://www.cyclestoussaint.com/ 272 | 4 Cycleurope Frame manufacturer 10 http://www.cycleurope.com 273 | 476 Cyclo Manufacturer 10 274 | 477 Cycloc Manufacturer 10 275 | 90 Cyfac Frame manufacturer 10 http://www.cyfac.fr/index.aspx 276 | 478 CygoLite Manufacturer 10 277 | 479 Cytosport Manufacturer 10 278 | 480 DAJO Manufacturer 10 279 | 1203 DEAN Frame manufacturer 10 http://www.deanbikes.com https://files.bikeindex.org/uploads/Ma/1203/wwwdeanbikescom.png 280 | 1127 DHS Frame manufacturer 10 http://www.dhsbike.hu/ 281 | 493 DIG BMX Manufacturer 10 282 | 1132 DK Bikes Frame manufacturer 10 http://www.dkbicycles.com/ 283 | 496 DMR Bikes Frame manufacturer 10 http://www.dmrbikes.com/ 284 | 497 DNP Manufacturer 10 285 | 498 DT Swiss Manufacturer 10 286 | 501 DZ Nuts Manufacturer 10 287 | 91 Da Bomb Bikes Frame manufacturer 10 http://www.dabombbike.com/ 288 | 1292 Daccordi Frame manufacturer 10 http://www.daccordicicli.com/ 289 | 92 Dahon Frame manufacturer 100 http://www.dahon.com/ 290 | 1219 Davidson Frame manufacturer 10 http://davidsonbicycles.com/ 291 | 93 Dawes Cycles Frame manufacturer 10 http://www.dawescycles.com/ 292 | 96 De Rosa Frame manufacturer 10 http://www.derosanews.com/ 293 | 1087 DeBernardi Frame manufacturer 10 http://www.zarbikes.com/zar/about-debernardi.html 294 | 483 DeFeet Manufacturer 10 295 | 1244 DeSalvo Cycles Frame manufacturer 10 http://www.desalvocycles.com/ 296 | 1300 Decathlon Frame manufacturer 10 http://www.decathlon.fr https://files.bikeindex.org/uploads/Ma/1300/wwwdecathlonfr.png 297 | 481 Deco Manufacturer 10 298 | 482 Deda Elementi Manufacturer 10 299 | 1008 Deity Frame manufacturer 10 http://www.deitycomponents.com/ 300 | 1131 Del Sol Frame manufacturer 10 http://www.ridedelsol.com/bikes 301 | 1346 Della Santa Frame manufacturer 10 http://dellasanta.com/ 302 | 484 Delta Manufacturer 10 303 | 485 Deluxe Manufacturer 10 304 | 486 Demolition Manufacturer 10 305 | 95 Den Beste Sykkel Frame manufacturer 10 http://www.dbs.no/ 306 | 1242 Dengfu Frame manufacturer 10 http://dengfubikes.com/ 307 | 5 Derby Cycle Frame manufacturer 10 http://www.derby-cycle.com/en.html 308 | 487 Dermatone Manufacturer 10 309 | 488 Dero Manufacturer 10 310 | 1206 Detroit Bikes Frame manufacturer 10 http://detroitbikes.com/ 311 | 489 Deuter Manufacturer 10 312 | 97 Devinci Frame manufacturer 10 http://www.devinci.com/home.html 313 | 98 Di Blasi Industriale Frame manufacturer 10 http://www.diblasi.it/?lng=en 314 | 490 Dia-Compe Manufacturer 10 315 | 491 DiaTech Manufacturer 10 316 | 1237 Diadora Frame manufacturer 10 http://www.diadoraamerica.com/ 317 | 99 Diamant Frame manufacturer 10 http://www.diamantrad.com/home/ 318 | 199 Diamondback Frame manufacturer 500 http://www.diamondback.com/ 319 | 492 Dicta Manufacturer 10 320 | 494 Dimension Manufacturer 10 321 | 495 Discwing Manufacturer 10 322 | 1 Doberman Frame manufacturer 10 http:// https://www.facebook.com/DobermannBikes 323 | 967 Dodici Milano Frame manufacturer 10 http://www.dodicicicli.com/ 324 | 1057 Dolan Frame manufacturer 10 http://www.dolan-bikes.com/ 325 | 6 Dorel Industries Frame manufacturer 10 http://www.dorel.com/ 326 | 499 Dual Eyewear Manufacturer 10 327 | 500 Dualco Manufacturer 10 328 | 121 Dynacraft Frame manufacturer 10 http://www.dynacraftbike.com/ 329 | 1208 Dynamic Bicycles Frame manufacturer 10 http://www.dynamicbicycles.com/ 330 | 927 Dyno Frame manufacturer 10 331 | 503 E-Case Manufacturer 10 332 | 310 E. C. Stearns Bicycle Agency Frame manufacturer 10 333 | 356 EAI (Euro Asia Imports) Frame manufacturer 10 http://www.euroasiaimports.com/aboutus.asp 334 | 506 EBC Manufacturer 10 335 | 1277 EG Bikes (Metronome) Frame manufacturer 10 http://www.egbike.com/ 336 | 508 EK USA Manufacturer 10 337 | 1200 EMC Bikes Frame manufacturer 10 http://www.emcbikes.com/ 338 | 516 ENVE Composites Manufacturer 10 339 | 521 ESI Manufacturer 10 340 | 523 EVS Sports Manufacturer 10 341 | 1356 EZ Pedaler (EZ Pedaler electric bikes) Frame manufacturer 10 http://www.ezpedaler.com/ 342 | 124 Eagle Bicycle Manufacturing Company Frame manufacturer 10 http:// none 343 | 504 Eagles Nest Outfitters Manufacturer 10 344 | 183 East Germany Frame manufacturer 10 http://www.easternbikes.com/dealers/ 345 | 505 Eastern Frame manufacturer 10 http://easternbikes.com/ 346 | 1196 Easy Motion Frame manufacturer 10 http://www.emotionbikesusa.com/ 347 | 973 Ebisu Frame manufacturer 10 http://www.jitensha.com/eng/aboutframes_e.html 348 | 225 Eddy Merckx Frame manufacturer 10 http://www.eddymerckx.be/ 349 | 1028 Edinburgh Bicycle Co-operative Frame manufacturer 10 http://www.edinburghbicycle.com/ 350 | 1090 EighthInch Frame manufacturer 10 http://www.eighthinch.com https://files.bikeindex.org/uploads/Ma/1090/wwweighthinchcom.png 351 | 125 Electra Frame manufacturer 250 http://www.electrabike.com/ 352 | 510 Elevn Technologies Manufacturer 10 353 | 511 Elite SRL Manufacturer 10 354 | 1233 Elliptigo Frame manufacturer 10 http://www.elliptigo.com/ 355 | 1236 Ellis Frame manufacturer 10 http://www.elliscycles.com/ 356 | 126 Ellis Briggs Frame manufacturer 10 http://www.ellisbriggscycles.co.uk/ 357 | 127 Ellsworth Frame manufacturer 10 http:// www.­ellsworthride.­com 358 | 128 Emilio Bozzi Frame manufacturer 10 http:// none 359 | 512 Endurance Films Manufacturer 10 360 | 513 Enduro Manufacturer 10 361 | 514 Endurox Manufacturer 10 362 | 515 Energizer Manufacturer 10 363 | 1365 Engin Cycles Frame manufacturer 10 http://www.engincycles.com/ 364 | 130 Enigma Titanium Frame manufacturer 10 http://www.enigmabikes.com/ 365 | 517 Epic Manufacturer 10 366 | 519 Ergon Manufacturer 10 367 | 520 Esbit Manufacturer 10 368 | 1103 Europa Frame manufacturer 10 http://www.europacycles.com.au/ 369 | 1281 Evelo Frame manufacturer 10 http://www.evelo.com/ 370 | 522 Eveready Manufacturer 10 371 | 1048 Evil Frame manufacturer 10 http://www.evil-bikes.com https://files.bikeindex.org/uploads/Ma/1048/wwwevilbikescom.png 372 | 1389 Evo Frame manufacturer 10 http://evobicycle.com/ 373 | 524 Excess Components Manufacturer 10 374 | 525 Exustar Manufacturer 10 375 | 529 FBM Frame manufacturer 10 http://fbmbmx.com https://files.bikeindex.org/uploads/Ma/529/fbmbmxcom.png 376 | 1269 FRAMED Frame manufacturer 10 http://www.framedbikes.com/ 377 | 543 FSA (Full Speed Ahead) Manufacturer 10 378 | 1259 Faggin Frame manufacturer 10 http://www.fagginbikes.com/en 379 | 1009 Failure Frame manufacturer 10 http://www.failurebikes.com/ 380 | 526 Fairdale Frame manufacturer 10 http://fairdalebikes.com/ 381 | 1358 Falco Bikes Frame manufacturer 10 http://www.falcobike.com/ 382 | 132 Falcon Frame manufacturer 10 http://www.falconcycles.co.uk/CORP/aboutFalcon.html 383 | 1256 Faraday Frame manufacturer 10 http://www.faradaybikes.com/ 384 | 528 Fast Wax Manufacturer 10 385 | 134 Fat City Cycles Frame manufacturer 10 http:// none 386 | 1056 Fatback Frame manufacturer 10 http://fatbackbikes.com/ 387 | 1217 Fausto Coppi Frame manufacturer 10 388 | 113 Federal Frame manufacturer 10 http://www.federalbikes.com https://files.bikeindex.org/uploads/Ma/113/wwwfederalbikescom.png 389 | 136 Felt Frame manufacturer 500 http://www.feltbicycles.com/ 390 | 1168 Fetish Frame manufacturer 10 https://www.facebook.com/FetishCycles 391 | 1169 Fezzari Frame manufacturer 10 http://www.fezzari.com/ 392 | 530 FiberFix Manufacturer 10 393 | 531 Fiction Manufacturer 10 394 | 140 Field Frame manufacturer 10 http://www.fieldcycles.com/ 395 | 532 Finish Line Manufacturer 10 396 | 533 Finite Manufacturer 10 397 | 1376 Firefly Bicycles Frame manufacturer 10 http://fireflybicycles.com/ 398 | 1153 Firefox Frame manufacturer 10 http://www.firefoxbikes.com/ 399 | 1064 Firenze Frame manufacturer 10 400 | 1065 Firmstrong Frame manufacturer 10 http://www.firmstrong.com/ 401 | 534 First Endurance Manufacturer 10 402 | 353 Fit bike Co. Frame manufacturer 10 403 | 535 Fizik Manufacturer 10 404 | 370 Fleet Velo Frame manufacturer 10 http://fleetvelo.com/fv/ 405 | 138 Fleetwing Frame manufacturer 10 http:// none 406 | 536 Flybikes Manufacturer 10 407 | 141 Flying Pigeon Frame manufacturer 10 http://flyingpigeon-la.com/ 408 | 142 Flying Scot Frame manufacturer 10 http://www.flying-scot.com/core/welcome.html 409 | 1378 Flyxii Frame manufacturer 10 http://www.flyxii.com/ 410 | 966 Focale44 Frame manufacturer 10 http://www.focale44bikes.com/ 411 | 143 Focus Frame manufacturer 10 http://www.focus-bikes.com/int/en/home.html 412 | 537 Foggle Manufacturer 10 413 | 1049 Fokhan Frame manufacturer 10 414 | 158 Folmer & Schwing Frame manufacturer 10 415 | 1094 Fondriest Frame manufacturer 10 http://www.fondriestbici.com 416 | 1079 Forge Bikes Frame manufacturer 10 http://forgebikes.com/ 417 | 538 Formula Manufacturer 10 418 | 1359 Fortified (lights) Frame manufacturer 10 http://fortifiedbike.com/ 419 | 539 Foundry Cycles Frame manufacturer 10 http://foundrycycles.com/ 420 | 540 Fox Manufacturer 10 421 | 146 Fram Frame manufacturer 10 http://wsid9d3eg.homepage.t-online.de 422 | 1345 Frances Frame manufacturer 10 http://francescycles.com/ 423 | 1221 Francesco Moser (F. Moser) Frame manufacturer 10 http://www.mosercycles.com/ 424 | 147 Freddie Grubb Frame manufacturer 10 425 | 1102 Free Agent Frame manufacturer 10 http://www.freeagentbmx.com/ 426 | 1172 Free Spirit Frame manufacturer 10 427 | 541 Freedom Manufacturer 10 428 | 542 Freeload Manufacturer 10 429 | 544 FuelBelt Manufacturer 10 430 | 101 Fuji Frame manufacturer 500 http://www.fujibikes.com/ 431 | 545 Fulcrum Manufacturer 10 432 | 546 Fyxation Frame manufacturer 10 http://www.fyxation.com/ 433 | 547 G Sport Manufacturer 10 434 | 548 G-Form Manufacturer 10 435 | 1138 GMC Frame manufacturer 10 436 | 119 GT Bicycles Frame manufacturer 500 http://www.gtbicycles.com/ 437 | 568 GU Manufacturer 10 438 | 549 Gamut Manufacturer 10 439 | 1014 Gardin Frame manufacturer 10 440 | 550 Garmin Manufacturer 10 441 | 149 Gary Fisher Frame manufacturer 500 http://www.trekbikes.com/us/en/collections/gary_fisher/ 442 | 551 Gates Carbon Drive Manufacturer 10 443 | 552 Gateway Manufacturer 10 444 | 1171 Gavin Frame manufacturer 10 http://www.gavinbikes.com/ 445 | 150 Gazelle Frame manufacturer 10 http://www.gazelle.us.com/ 446 | 553 Gear Aid Manufacturer 10 447 | 554 Gear Clamp Manufacturer 10 448 | 555 Gear Up Manufacturer 10 449 | 556 Geax Manufacturer 10 450 | 151 Gendron Bicycles Frame manufacturer 10 http://www.gendron-bicycles.ca/ 451 | 1137 Genesis Frame manufacturer 10 http://www.genesisbikes.co.uk/ 452 | 557 Genuine Innovations Manufacturer 10 453 | 1303 Geotech Frame manufacturer 10 http://www.geotechbikes.com 454 | 152 Gepida Frame manufacturer 10 http://www.gepida.eu/ 455 | 1245 Ghost Frame manufacturer 10 http://www.ghost-bikes.com 456 | 153 Giant Frame manufacturer 500 http://www.giant-bicycles.com/ 457 | 558 Gibbon Slacklines Manufacturer 10 458 | 1185 Gilmour Frame manufacturer 10 http://www.gilmourbicycles.us/ 459 | 1174 Giordano Frame manufacturer 10 http://giordanobicycles.com/ 460 | 86 Gitane Frame manufacturer 10 http://www.gitaneusa.com/ 461 | 559 Glacier Glove Manufacturer 10 462 | 154 Gladiator Cycle Company Frame manufacturer 10 http://www.cyclesgladiator.com/ 463 | 943 Globe Frame manufacturer 100 http://www.specialized.com/us/en/bikes/globe 464 | 155 Gnome et Rhône Frame manufacturer 10 465 | 560 GoGirl Manufacturer 10 466 | 1288 Gomier Frame manufacturer 10 467 | 561 Gore Manufacturer 10 468 | 156 Gormully & Jeffery Frame manufacturer 10 469 | 562 Grab On Manufacturer 10 470 | 563 Grabber Manufacturer 10 471 | 564 Graber Manufacturer 10 472 | 157 Graflex Frame manufacturer 10 http://graflex.org/ 473 | 565 Granite Gear Manufacturer 10 474 | 566 Gravity Frame manufacturer 10 http://www.bikesdirect.com/ 475 | 567 Greenfield Manufacturer 10 476 | 1083 Greenspeed Frame manufacturer 10 http://www.greenspeed.com.au/ 477 | 1266 Gudereit Frame manufacturer 10 http://www.gudereit.de 478 | 159 Guerciotti Frame manufacturer 10 http://www.guerciotti.it/ 479 | 986 Gunnar Frame manufacturer 10 http://gunnarbikes.com/site/ 480 | 1193 Guru Frame manufacturer 10 http://www.gurucycles.com/en 481 | 569 Guyot Designs Manufacturer 10 482 | 570 H Plus Son Manufacturer 10 483 | 1214 HBBC (Huntington Beach Bicycle, Co) Frame manufacturer 10 http://hbbcinc.com/ 484 | 576 HED Manufacturer 10 485 | 1204 HP Velotechnik Frame manufacturer 10 http://www.hpvelotechnik.com 486 | 1279 Haibike (Currietech) Frame manufacturer 10 http://www.currietech.com/ 487 | 1373 Hallstrom Frame manufacturer 10 http://www.hallstrom.no/ 488 | 571 Halo Manufacturer 10 489 | 572 Hammer Nutrition Manufacturer 10 490 | 1371 Hampsten Cycles Frame manufacturer 10 http://www.hampsten.com/ 491 | 934 Handsome Cycles Frame manufacturer 10 http://www.handsomecycles.com https://files.bikeindex.org/uploads/Ma/934/wwwhandsomecyclescom.png 492 | 573 Handspun Manufacturer 10 493 | 1238 Hanford Frame manufacturer 10 https://www.facebook.com/pages/Hanford-Cycles/230458813647205 494 | 105 Haro Frame manufacturer 250 http://www.harobikes.com 495 | 162 Harry Quinn Frame manufacturer 10 496 | 1097 Harvey Cycle Works Frame manufacturer 10 http://harveykevin65.wix.com/harveycycleworks 497 | 1181 Hasa Frame manufacturer 10 http://www.hasa.com.tw/ 498 | 163 Hase bikes Frame manufacturer 10 http://hasebikes.com/ 499 | 574 Hayes Manufacturer 10 500 | 164 Head Frame manufacturer 10 501 | 575 Headsweats Manufacturer 10 502 | 166 Heinkel Frame manufacturer 10 http://www.heinkeltourist.com/ 503 | 165 Helkama Frame manufacturer 10 http://www.helkamavelox.fi/en/ 504 | 11 Hercules Fahrrad GmbH & Co Frame manufacturer 10 505 | 995 Heritage Frame manufacturer 100 http://www.heritagebicycles.com/ https://files.bikeindex.org/uploads/Ma/995/heritage-logo.png 506 | 1216 Herkelmann Frame manufacturer 10 http://www.herkelmannbikes.com/ 507 | 169 Hero Cycles Ltd Frame manufacturer 10 http://www.herocycles.com/ 508 | 1201 Heron Frame manufacturer 10 http://www.heronbicycles.com/ 509 | 171 Hetchins Frame manufacturer 10 http://www.hetchins.org/ 510 | 577 High Gear Manufacturer 10 511 | 578 Highland Manufacturer 10 512 | 1155 Hija de la Coneja Frame manufacturer 10 https://www.facebook.com/hijadelaconeja 513 | 172 Hillman Frame manufacturer 10 http://hillmancycles.com.au 514 | 1377 Hinton Cycles Frame manufacturer 10 http://www.hintoncycles.com/ 515 | 1149 Hirschfeld Frame manufacturer 10 516 | 579 Hirzl Manufacturer 10 517 | 580 Hobson Manufacturer 10 518 | 951 Hoffman Frame manufacturer 10 http://hoffmanbikes.com/ 519 | 174 Holdsworth Frame manufacturer 10 http://www.holdsworthbikes.co.uk/ 520 | 581 Honey Stinger Manufacturer 10 521 | 582 Hope Manufacturer 10 522 | 583 House of Talents Manufacturer 10 523 | 584 Hozan Manufacturer 10 524 | 585 HubBub Manufacturer 10 525 | 586 Hudz Manufacturer 10 526 | 175 Huffy Frame manufacturer 100 http://www.huffybikes.com 527 | 1173 Hufnagel Frame manufacturer 10 http://www.hufnagelcycles.com/ 528 | 587 Humangear Manufacturer 10 529 | 176 Humber Frame manufacturer 10 http://en.wikipedia.org/wiki/Humber_(bicycle) 530 | 954 Humble Frameworks Frame manufacturer 10 http://www.humbleframeworks.cc https://files.bikeindex.org/uploads/Ma/954/wwwhumbleframeworkscc.png 531 | 972 Hunter Frame manufacturer 10 http://www.huntercycles.com/ 532 | 588 Hurricane Components Manufacturer 10 533 | 177 Hurtu Frame manufacturer 10 http://en.wikipedia.org/wiki/Hurtu 534 | 589 Hutchinson Manufacturer 10 535 | 590 Hyalite Equipment Manufacturer 10 536 | 591 Hydrapak Manufacturer 10 537 | 1136 Hyper Frame manufacturer 10 http://www.hyperbicycles.com/ 538 | 592 IBEX Frame manufacturer 10 http://ibexbikes.com/ 539 | 1109 ICE Trikes (Inspired Cycle Engineering ) Frame manufacturer 10 http://www.icetrikes.co/ 540 | 595 IMBA Manufacturer 10 541 | 938 IRO Cycles Frame manufacturer 10 http://www.irocycle.com 542 | 601 ISM Manufacturer 10 543 | 1278 IZIP (Currietech) Frame manufacturer 10 http://www.currietech.com/ 544 | 179 Ibis Frame manufacturer 10 http://www.ibiscycles.com/bikes/ 545 | 593 Ice Trekkers Manufacturer 10 546 | 594 IceToolz Manufacturer 10 547 | 180 Ideal Bikes Frame manufacturer 10 http://www.idealbikes.net/ 548 | 1070 Identiti Frame manufacturer 10 http://www.identitibikes.com/ 549 | 596 Incredibell Manufacturer 10 550 | 184 Independent Fabrication Frame manufacturer 10 http://www.ifbikes.com/ 551 | 182 Industrieverband Fahrzeugbau Frame manufacturer 10 552 | 597 Industry Nine Manufacturer 10 553 | 598 Infini Manufacturer 10 554 | 1352 Inglis (Retrotec) Frame manufacturer 10 http://ingliscycles.com/ 555 | 1184 Innerlight Cycles Frame manufacturer 10 http://www.innerlightcycles.com/ 556 | 599 Innova Manufacturer 10 557 | 600 Intense Frame manufacturer 10 http://intensecycles.com/ 558 | 185 Iride Bicycles Frame manufacturer 10 http://www.irideusa.com/ 559 | 116 Iron Horse Bicycles Frame manufacturer 100 http://www.ironhorsebikes.com/ 560 | 1063 Islabikes Frame manufacturer 10 http://www.islabikes.com/ 561 | 602 Issimo Designs Manufacturer 10 562 | 186 Italvega Frame manufacturer 10 http://en.wikipedia.org/wiki/Italvega 563 | 187 Itera plastic bicycle Frame manufacturer 10 564 | 188 Iver Johnson Frame manufacturer 10 565 | 189 Iverson Frame manufacturer 10 566 | 190 JMC Bicycles Frame manufacturer 10 http://www.jmccycles.com/ 567 | 608 JP Weigle's Manufacturer 10 568 | 603 Jagwire Manufacturer 10 569 | 201 Jamis Frame manufacturer 500 http://www.jamisbikes.com/usa/index.html 570 | 1123 Jan Jansen Frame manufacturer 10 http://www.janjanssen.nl/index.php 571 | 604 Jandd Manufacturer 10 572 | 1194 Javelin Frame manufacturer 10 http://www.javbike.com/ 573 | 605 Jelly Belly Manufacturer 10 574 | 606 JetBoil Manufacturer 10 575 | 607 Jittery Joe's Manufacturer 10 576 | 1085 John Cherry bicycles Frame manufacturer 10 http://www.sandsmachine.com/bp_chery.htm 577 | 998 John Deere Frame manufacturer 10 578 | 1222 Jorg & Olif Frame manufacturer 10 http://jorgandolif.com 579 | 1241 Juliana Bicycles Frame manufacturer 10 http://www.julianabicycles.com/en/us 580 | 609 K-Edge Manufacturer 10 581 | 192 K2 Frame manufacturer 100 http://www.k2bike.com/ 582 | 613 KBC Manufacturer 10 583 | 196 KHS Bicycles Frame manufacturer 500 http://khsbicycles.com/ 584 | 621 KMC Manufacturer 10 585 | 626 KS Manufacturer 10 586 | 627 KT Tape Manufacturer 10 587 | 208 KTM Frame manufacturer 10 http://www.ktm.com/us/ready-to-race.html 588 | 1107 KW Bicycle Frame manufacturer 10 http://www.kwcycles.com/ 589 | 977 Kalkhoff Frame manufacturer 10 http://www.kalkhoff-bikes.com/ 590 | 610 Kalloy Manufacturer 10 591 | 611 Katadyn Manufacturer 10 592 | 612 Kazam Manufacturer 10 593 | 46 Keith Bontrager Frame manufacturer 10 http://bontrager.com/history 594 | 1116 Kellys Bicycles Frame manufacturer 10 http://www.kellysbike.com/ 595 | 614 Kenda Manufacturer 10 596 | 193 Kent Frame manufacturer 10 http://www.kentbicycles.com/ 597 | 194 Kestrel Frame manufacturer 10 http://www.kestrelbicycles.com/ 598 | 195 Kettler Frame manufacturer 10 http://www.kettler.co.uk/ 599 | 615 Kind Bar Manufacturer 10 600 | 616 Kinesis Frame manufacturer 10 http://www.kinesisbikes.co.uk/ 601 | 198 Kinesis Industry Frame manufacturer 10 http://www.kinesis.com.tw/ 602 | 617 Kinetic Manufacturer 10 603 | 618 Kinetic Koffee Manufacturer 10 604 | 358 Kink Frame manufacturer 10 http://www.kinkbmx.com https://files.bikeindex.org/uploads/Ma/358/wwwkinkbmxcom.png 605 | 1150 Kirk Frame manufacturer 10 http://www.kirkframeworks.com/ 606 | 1029 Kish Fabrication Frame manufacturer 10 http://www.kishbike.com/ 607 | 619 Kiss My Face Manufacturer 10 608 | 620 Klean Kanteen Manufacturer 10 609 | 325 Klein Bikes Frame manufacturer 100 610 | 622 Knog Manufacturer 10 611 | 1213 Knolly Frame manufacturer 10 http://knollybikes.com/ 612 | 20 Koga-Miyata Frame manufacturer 10 http://www.koga.com/koga_uk/ 613 | 205 Kogswell Cycles Frame manufacturer 10 614 | 203 Kona Frame manufacturer 500 http://www.konaworld.com/ 615 | 623 Kool Kovers Manufacturer 10 616 | 624 Kool-Stop Manufacturer 10 617 | 625 Kreitler Manufacturer 10 618 | 1190 Kron Frame manufacturer 10 http://kronbikes.com/ 619 | 206 Kronan Frame manufacturer 10 http://www.kronan.com/en/cykel 620 | 207 Kross SA Frame manufacturer 10 http://www.kross.pl/ 621 | 106 Kryptonite Manufacturer 10 http://www.kryptonitelock.com/Pages/Home.aspx 622 | 628 Kuat Manufacturer 10 623 | 209 Kuota Frame manufacturer 10 http://www.kuota.it/index.php 624 | 1140 Kustom Kruiser Frame manufacturer 10 625 | 210 Kuwahara Frame manufacturer 10 http://kuwahara-bike.com/ 626 | 1230 LDG (Livery Design Gruppe) Frame manufacturer 10 http://liverydesigngruppe.com/ 627 | 1026 LOW// Frame manufacturer 10 http://lowbicycles.com/ 628 | 1344 Land Shark Frame manufacturer 10 http://landsharkbicycles.com/ 629 | 929 Lapierre Frame manufacturer 10 http://www.lapierre-bikes.co.uk/ 630 | 212 Laurin & Klement Frame manufacturer 10 631 | 629 Lazer Manufacturer 10 632 | 213 LeMond Racing Cycles Frame manufacturer 250 https://en.wikipedia.org/wiki/LeMond_Racing_Cycles 633 | 933 Leader Bikes Frame manufacturer 100 http://www.leaderbikeusa.com 634 | 630 Leg Lube Manufacturer 10 635 | 952 Legacy Frameworks Frame manufacturer 10 http://legacyframeworks.com/ 636 | 1372 Leopard Frame manufacturer 10 http://www.leopardcycles.com/ 637 | 631 Lezyne Manufacturer 10 638 | 633 Light My Fire Manufacturer 10 639 | 632 Light and Motion Manufacturer 10 640 | 1035 Lightning Cycle Dynamics Frame manufacturer 10 http://www.lightningbikes.com/ 641 | 1111 Lightspeed Frame manufacturer 10 http://www.litespeed.com/ 642 | 950 Linus Frame manufacturer 100 http://www.linusbike.com/ 643 | 1261 Liotto (Cicli Liotto Gino & Figli) Frame manufacturer 10 http://www.liotto.com/ 644 | 215 Litespeed Frame manufacturer 10 http://www.litespeed.com/ 645 | 1240 Liteville Frame manufacturer 10 http://www.liteville.de/ 646 | 634 Lizard Skins Manufacturer 10 647 | 635 Loctite Manufacturer 10 648 | 19 Loekie Frame manufacturer 10 http://www.loekie.nl/ 649 | 636 Lonely Planet Manufacturer 10 650 | 369 Look Frame manufacturer 10 http:// www.lookcycles.com 651 | 217 Lotus Frame manufacturer 10 652 | 637 Louis Garneau Frame manufacturer 10 http://www.louisgarneau.com 653 | 216 Louison Bobet Frame manufacturer 10 654 | 94 Lycoming Engines Frame manufacturer 10 http://www.lycoming.textron.com/ 655 | 1088 Lynskey Frame manufacturer 10 http://www.lynskeyperformance.com/ 656 | 638 M Essentials Manufacturer 10 657 | 1301 MBK Frame manufacturer 10 http://mbk-cykler.dk/ 658 | 1157 MEC (Mountain Equipment Co-op) Frame manufacturer 10 http://www.mec.ca/ 659 | 655 MKS Manufacturer 10 660 | 1264 MMR Frame manufacturer 10 http://www.mmrbikes.com/ 661 | 661 MRP Manufacturer 10 662 | 662 MSR Manufacturer 10 663 | 663 MTI Adventurewear Manufacturer 10 664 | 1117 Madsen Frame manufacturer 10 http://www.madsencycles.com/ 665 | 1151 Madwagon Frame manufacturer 10 666 | 639 Magellan Manufacturer 10 667 | 122 Magna Frame manufacturer 10 http://www.magnabike.com/ 668 | 218 Malvern Star Frame manufacturer 10 http://www.malvernstar.com.au/ 669 | 1092 ManKind Frame manufacturer 10 http://mankindbmx.com/ 670 | 1195 Mango Frame manufacturer 10 http://www.mangobikes.co.uk/ 671 | 969 Manhattan Frame manufacturer 10 http://www.manhattancruisers.com/ 672 | 640 Manitou Manufacturer 10 673 | 1290 Map Bicycles Frame manufacturer 10 http://www.mapbicycles.com/ 674 | 993 Maraton Frame manufacturer 10 http://www.bikemaraton.com/ 675 | 219 Marin Bikes Frame manufacturer 500 http://www.marinbikes.com/2013/ 676 | 1158 Marinoni Frame manufacturer 10 http://www.marinoni.qc.ca/indexEN.html 677 | 641 Marson Manufacturer 10 678 | 1036 Maruishi Frame manufacturer 10 http://en.maruishi-bike.com.cn/ 679 | 1175 Marukin Frame manufacturer 10 http://www.marukin-bicycles.com/ 680 | 642 Marzocchi Manufacturer 10 681 | 104 Masi Frame manufacturer 100 http://www.masibikes.com 682 | 108 Master Lock Manufacturer 10 http://www.masterlockbike.com 683 | 220 Matchless Frame manufacturer 10 684 | 221 Matra Frame manufacturer 10 http://matra.com/pre-home/?___SID=U 685 | 1159 Maverick Frame manufacturer 10 http://www.maverickbike.com/ 686 | 643 Mavic Manufacturer 10 687 | 644 Maxit Manufacturer 10 688 | 645 Maxxis Manufacturer 10 689 | 646 Mechanical Threads Manufacturer 10 690 | 647 Meiser Manufacturer 10 691 | 222 Melon Bicycles Frame manufacturer 10 http://www.melonbicycles.com/ 692 | 223 Mercian Cycles Frame manufacturer 10 http://www.merciancycles.co.uk/ 693 | 931 Mercier Frame manufacturer 100 http://www.cyclesmercier.com 694 | 65 Merida Bikes Frame manufacturer 10 http://www.merida.com 695 | 224 Merlin Frame manufacturer 10 http://www.merlinbike.com/ 696 | 648 Merrell Manufacturer 10 697 | 988 MetaBikes Frame manufacturer 10 http://meta-bikes.com/ 698 | 649 Metric Hardware Manufacturer 10 699 | 1364 Metrofiets Frame manufacturer 10 https://metrofiets.com https://files.bikeindex.org/uploads/Ma/1364/metrofietscom.png 700 | 167 Micajah C. Henley Frame manufacturer 10 701 | 1165 Micargi Frame manufacturer 10 http://micargibicycles.com/ 702 | 650 Miche Manufacturer 10 703 | 651 Michelin Manufacturer 10 704 | 652 MicroShift Manufacturer 10 705 | 226 Miele bicycles Frame manufacturer 10 http://www.mielebicycles.com/home.html 706 | 1187 Mikkelsen Frame manufacturer 10 http://www.mikkelsenframes.com/ 707 | 227 Milwaukee Bicycle Co. Frame manufacturer 10 http://www.benscycle.net/ 708 | 653 Minoura Manufacturer 10 709 | 1012 MirraCo Frame manufacturer 10 http://mirrabikeco.com/ 710 | 654 Mirrycle Manufacturer 10 711 | 990 Mission Bicycles Frame manufacturer 100 https://www.missionbicycle.com/ 712 | 229 Miyata Frame manufacturer 100 http://www.miyatabicycles.com/ 713 | 1166 Mizutani Frame manufacturer 10 714 | 1387 Momentum Frame manufacturer 10 http://www.pedalmomentum.com/ 715 | 87 Monark Frame manufacturer 10 http://www.monarkexercise.se/ 716 | 230 Mondia Frame manufacturer 10 http://en.wikipedia.org/wiki/Mondia 717 | 1263 Mondraker Frame manufacturer 10 http://www.mondraker.com/ 718 | 118 Mongoose Frame manufacturer 250 http://www.mongoose.com/ 719 | 656 Montague Frame manufacturer 10 http://www.montaguebikes.com/ 720 | 232 Moots Cycles Frame manufacturer 100 http://moots.com/ 721 | 658 Mophie Manufacturer 10 722 | 1351 Mosaic Frame manufacturer 10 http://mosaiccycles.com/ 723 | 233 Moser Cicli Frame manufacturer 10 http://www.ciclimoser.com/ 724 | 1284 Mosh Frame manufacturer 10 725 | 1302 Mosso Frame manufacturer 10 http://www.mosso.com.tw/ 726 | 1349 Moth Attack Frame manufacturer 10 http://mothattack.com/ 727 | 984 Motiv Frame manufacturer 10 http://www.motivelectricbikes.com 728 | 234 Motobecane Frame manufacturer 250 http://www.motobecane.com/ 729 | 1050 Moulden Frame manufacturer 10 730 | 235 Moulton Bicycle Frame manufacturer 10 http://www.moultonbicycles.co.uk/ 731 | 1283 Mountain Cycles Frame manufacturer 10 732 | 659 Mountainsmith Manufacturer 10 733 | 660 Mr. Tuffy Manufacturer 10 734 | 237 Muddy Fox Frame manufacturer 10 http://www.muddyfoxusa.com/ 735 | 236 Murray Frame manufacturer 10 736 | 664 Mutant Bikes Manufacturer 10 737 | 1067 Mutiny Frame manufacturer 10 http://www.mutinybikes.com/ 738 | 1361 Müsing (Musing) Frame manufacturer 10 http://www.muesing-bikes.de/ 739 | 665 N Gear Manufacturer 10 740 | 671 NEMO Manufacturer 10 741 | 1011 NS Bikes Frame manufacturer 10 http://www.ns-bikes.com/ 742 | 1285 Nakamura Frame manufacturer 10 http://www.nakamura.no/ 743 | 1250 Naked Frame manufacturer 10 http://timetogetnaked.com/ 744 | 666 Nalgene Manufacturer 10 745 | 667 Nantucket Bike Basket Company Manufacturer 10 746 | 957 Nashbar Frame manufacturer 10 http://Nashbar.com https://files.bikeindex.org/uploads/Ma/957/Nashbarcom.png 747 | 668 Nathan Manufacturer 10 748 | 238 National Frame manufacturer 10 http://nationalmoto.com/ 749 | 669 Native Manufacturer 10 750 | 240 Neil Pryde Frame manufacturer 10 http://www.neilprydebikes.com/ 751 | 670 Nema Manufacturer 10 752 | 241 Neobike Frame manufacturer 10 http://www.allproducts.com/bike/neobike/ 753 | 1071 New Albion Frame manufacturer 10 http://newalbioncycles.com/ 754 | 672 New Balance Manufacturer 10 755 | 123 Next Frame manufacturer 10 http://next-bike.com/ 756 | 1022 Niner Frame manufacturer 100 http://www.ninerbikes.com/ 757 | 1176 Nirve Frame manufacturer 10 http://www.nirve.com/ 758 | 243 Nishiki Frame manufacturer 100 http://nishiki.com/ 759 | 673 Nite Ize Manufacturer 10 760 | 674 NiteRider Manufacturer 10 761 | 675 Nitto Manufacturer 10 762 | 676 Nokon Manufacturer 10 763 | 244 Norco Bikes Frame manufacturer 100 http://www.norco.com/ 764 | 245 Norman Cycles Frame manufacturer 10 http://www.normanmotorcycles.org.uk/ 765 | 677 North Shore Billet Manufacturer 10 766 | 1021 Northrock Frame manufacturer 10 http://www.northrockbikes.com/ 767 | 246 Novara Frame manufacturer 500 768 | 679 NuVinci Manufacturer 10 769 | 1282 Nukeproof Frame manufacturer 10 http://nukeproof.com/ 770 | 248 Nymanbolagen Frame manufacturer 10 771 | 680 O-Stand Manufacturer 10 772 | 681 O2 Manufacturer 10 773 | 682 ODI Manufacturer 10 774 | 1262 OHM Frame manufacturer 10 http://ohmcycles.com/ 775 | 683 Odyssey Manufacturer 10 776 | 684 Ohio Travel Bag Manufacturer 10 777 | 1211 Olmo Frame manufacturer 10 http://www.olmobikes.com/ 778 | 1384 Omnium Frame manufacturer 10 http://omniumcargo.dk/ 779 | 1226 On-One (On One) Frame manufacturer 10 http://www.on-one.co.uk/ 780 | 686 OnGuard Manufacturer 10 781 | 685 One Way Manufacturer 10 782 | 249 Opel Frame manufacturer 10 http://opelbikes.com/ 783 | 687 Optic Nerve Manufacturer 10 784 | 688 Optimus Manufacturer 10 785 | 1074 Opus Frame manufacturer 10 http://opusbike.com/en/ 786 | 250 Orange Frame manufacturer 10 http://www.orangebikes.co.uk/ 787 | 689 Orange Seal Manufacturer 10 788 | 251 Orbea Frame manufacturer 10 http://www.orbea.com/us-en/ 789 | 980 Orbit Frame manufacturer 10 http://www.orbit-cycles.co.uk/ 790 | 252 Orient Bikes Frame manufacturer 10 http://www.orient-bikes.gr/en 791 | 948 Origin8 (Origin-8) Frame manufacturer 10 http://www.origin-8.com/ 792 | 690 Ortlieb Manufacturer 10 793 | 100 Other Frame manufacturer 500 794 | 1347 Otis Guy Frame manufacturer 10 http://www.otisguycycles.com/ 795 | 691 Oury Manufacturer 10 796 | 692 OutGo Manufacturer 10 797 | 693 Owl 360 Manufacturer 10 798 | 1033 Oyama Frame manufacturer 10 http://www.oyama.eu/ 799 | 694 Ozone Manufacturer 10 800 | 702 PDW Manufacturer 10 801 | 715 POC Manufacturer 10 802 | 974 PUBLIC bikes Frame manufacturer 100 http://publicbikes.com/ 803 | 695 Pace Sportswear Manufacturer 10 804 | 696 Paceline Products Manufacturer 10 805 | 115 Pacific Cycle Frame manufacturer 10 http://www.pacific-cycles.com/ 806 | 697 PackTowl Manufacturer 10 807 | 365 Pake Frame manufacturer 10 http://www.pakebikes.com 808 | 698 Panaracer Manufacturer 10 809 | 239 Panasonic Frame manufacturer 10 810 | 1147 Paper Bicycle Frame manufacturer 10 http://www.paper-bicycle.com/ 811 | 699 Park Manufacturer 10 812 | 1023 Parkpre Frame manufacturer 10 http://www.parkpre.com/ 813 | 700 Parlee Frame manufacturer 10 http://www.parleecycles.com https://files.bikeindex.org/uploads/Ma/700/wwwparleecyclescom.png 814 | 256 Pashley Cycles Frame manufacturer 10 http://www.pashley.co.uk/ 815 | 257 Patria Frame manufacturer 10 http://www.patria.net/en/bicycles/ 816 | 701 Paul Manufacturer 10 http://www.paulcomp.com/ 817 | 703 Pearl Izumi Manufacturer 10 818 | 704 Pedco Manufacturer 10 819 | 1114 Pedego Frame manufacturer 10 http://www.pedegoelectricbikes.com/ 820 | 258 Pedersen bicycle Frame manufacturer 10 http://www.pedersenbicycles.com/ 821 | 705 Pedro's Manufacturer 10 822 | 1142 Pegoretti Frame manufacturer 10 http://www.gitabike.com/cgi-bin/shop/pegoretti_loadhome.cgi?file=pegoretti.html 823 | 706 Penguin Brands Manufacturer 10 824 | 1189 Pereira Frame manufacturer 10 http://www.pereiracycles.com/ 825 | 1061 Performance Frame manufacturer 10 http://www.performancebike.com/bikes 826 | 102 Peugeot Frame manufacturer 250 http://www.peugeot.com/en/products-services/cycles 827 | 1062 Phat Cycles Frame manufacturer 10 http://www.phatcycles.com/ 828 | 707 Phil Wood Manufacturer 10 829 | 708 Philips Manufacturer 10 830 | 260 Phillips Cycles Frame manufacturer 10 http://www.phillipscycles.co.uk/ 831 | 261 Phoenix Frame manufacturer 10 http://www.cccme.org.cn/ 832 | 709 Phorm Manufacturer 10 833 | 262 Pierce-Arrow Frame manufacturer 10 http://www.pierce-arrow.org 834 | 1202 Pilen Frame manufacturer 10 http://www.pilencykel.se/site/en/home 835 | 263 Pinarello Frame manufacturer 10 http://www.racycles.com/ 836 | 710 Pinhead Manufacturer 10 http://www.pinheadcomponents.com/ 837 | 992 Pitlock Manufacturer 10 http://www.pitlock.com/ 838 | 1105 Pivot Frame manufacturer 10 http://www.pivotcycles.com/ 839 | 711 Planet Bike Manufacturer 10 840 | 264 Planet X Frame manufacturer 10 http://www.planet-x-bikes.co.uk/ 841 | 712 Platypus Manufacturer 10 842 | 713 Pletscher Manufacturer 10 843 | 714 Po Campo Manufacturer 10 844 | 265 Pocket Bicycles Frame manufacturer 10 845 | 266 Pogliaghi Frame manufacturer 10 http://en.wikipedia.org/wiki/Pogliaghi 846 | 716 Polar Manufacturer 10 847 | 717 Polar Bottles Manufacturer 10 848 | 1104 Polygon Frame manufacturer 10 http://www.polygonbikes.com/ 849 | 267 Pope Manufacturing Company Frame manufacturer 10 850 | 718 Power Grips Manufacturer 10 851 | 719 PowerBar Manufacturer 10 852 | 720 PowerTap Manufacturer 10 853 | 1141 Premium Frame manufacturer 10 http://www.premiumbmx.com/ 854 | 1375 Price Frame manufacturer 10 http://www.price-bikes.ch/ 855 | 721 Primal Wear Manufacturer 10 856 | 722 Primo Manufacturer 10 857 | 1340 Primus Mootry (PM Cycle Fabrication) Frame manufacturer 10 http://www.primusmootry.com/ 858 | 723 Princeton Tec Manufacturer 10 859 | 975 Principia Frame manufacturer 10 http://www.principia.dk/gb/ 860 | 1390 Priority Bicycles Frame manufacturer 10 http://www.prioritybicycles.com/ 861 | 211 Private label Frame manufacturer 10 http://www.fujibikes.com/ 862 | 724 Pro-tec Manufacturer 10 863 | 725 ProBar Manufacturer 10 864 | 729 ProGold Manufacturer 10 865 | 726 Problem Solvers Manufacturer 10 866 | 269 Procycle Group Frame manufacturer 10 http://www.procycle.com/en/default.asp 867 | 1160 Prodeco Frame manufacturer 10 http://prodecotech.com/ 868 | 727 Profile Design Manufacturer 10 869 | 728 Profile Racing Manufacturer 10 870 | 730 Prologo Manufacturer 10 871 | 731 Promax Manufacturer 10 872 | 272 Prophete Frame manufacturer 10 http://www.prophete.de/ 873 | 88 Puch Frame manufacturer 10 http://www.puch.at/ 874 | 1394 Pure City Frame manufacturer 250 http://purecitycycles.com/ 875 | 947 Pure Fix Frame manufacturer 10 http://purefixcycles.com/ 876 | 1045 Python Frame manufacturer 10 http://www.pythonbikes.com/ 877 | 1298 Python Pro Frame manufacturer 10 http://pythonpro.dk/ 878 | 732 Q-Outdoor Manufacturer 10 879 | 733 Q-Tubes Manufacturer 10 880 | 734 QBP Manufacturer 10 881 | 273 Quadrant Cycle Company Frame manufacturer 10 882 | 736 Quest Manufacturer 10 883 | 737 Quik Stik Manufacturer 10 884 | 275 Quintana Roo Frame manufacturer 10 http://www.quintanarootri.com/ 885 | 738 R12 Manufacturer 10 886 | 1001 RIH Frame manufacturer 10 http://www.rih.nl 887 | 760 RPM Manufacturer 10 888 | 945 RRB (Rat Rod Bikes) Frame manufacturer 10 https://www.facebook.com/ratrodbikescom 889 | 761 RST Manufacturer 10 890 | 1296 Rabeneick Frame manufacturer 10 http://www.rabeneick.de/bikes/ 891 | 739 RaceFace Manufacturer 10 892 | 740 Racktime Manufacturer 10 893 | 1388 Radio Bike Co Frame manufacturer 10 http://www.radiobikes.com/ 894 | 276 Radio Flyer Frame manufacturer 10 http://www.radioflyer.com/trikes.html 895 | 277 Raleigh Frame manufacturer 500 http://www.raleighusa.com/ 896 | 997 Ram Frame manufacturer 10 http://www.ram-bikes.com/eng/ 897 | 278 Rambler Frame manufacturer 10 http://en.wikipedia.org/wiki/Rambler_(bicycle) 898 | 279 Rans Designs Frame manufacturer 10 http://www.rans.com/ 899 | 1078 Rawland Cycles Frame manufacturer 10 https://www.rawlandcycles.com/ 900 | 280 Razor Frame manufacturer 10 http://www.razor.com/ 901 | 745 ReTale Manufacturer 10 902 | 955 Redline Frame manufacturer 250 http://www.redlinebicycles.com https://files.bikeindex.org/uploads/Ma/955/wwwredlinebicyclescom.png 903 | 1041 Redlof Frame manufacturer 10 904 | 741 Reflect Sports Manufacturer 10 905 | 1076 Regina Frame manufacturer 10 http://www.reginabikes.it/ 906 | 742 Rema Manufacturer 10 907 | 743 Renthal Manufacturer 10 908 | 170 René Herse Frame manufacturer 10 http://www.renehersebicycles.com/ 909 | 971 Republic Frame manufacturer 10 http://www.republicbike.com/ 910 | 254 Republic of China Frame manufacturer 10 911 | 744 Resist Manufacturer 10 912 | 1180 Retrospec Frame manufacturer 10 http://www.retrospecbicycles.com/ 913 | 746 Revelate Designs Manufacturer 10 914 | 1227 Revolights Manufacturer 10 http://revolights.com/ 915 | 747 Rhythm Manufacturer 10 916 | 1046 Ribble Frame manufacturer 10 http://www.ribblecycles.co.uk/ 917 | 748 Ride2 Manufacturer 10 918 | 281 Ridgeback Frame manufacturer 10 http://www.ridgeback.co.uk/ 919 | 749 Ridley Frame manufacturer 10 http://www.ridley-bikes.com/be/nl/intro 920 | 283 Riese und Müller Frame manufacturer 10 http://www.en.r-m.de/ 921 | 750 Ritchey Frame manufacturer 10 http://ritcheylogic.com/ 922 | 1051 Ritte Frame manufacturer 10 http://rittecycles.com/ 923 | 285 Rivendell Bicycle Works Frame manufacturer 10 http://www.rivbike.com/ 924 | 30 Roadmaster Frame manufacturer 10 925 | 286 Roberts Cycles Frame manufacturer 10 http://www.robertscycles.com/ 926 | 287 Robin Hood Frame manufacturer 10 http://www.robinhoodcycles.com/ 927 | 1135 Rock Lobster Frame manufacturer 10 http://www.rocklobstercycles.com/ 928 | 751 Rock-N-Roll Manufacturer 10 929 | 752 RockShox Manufacturer 10 930 | 270 Rocky Mountain Bicycles Frame manufacturer 100 931 | 753 Rocky Mounts Manufacturer 10 932 | 1124 Rodriguez Frame manufacturer 10 http://www.rodbikes.com/ 933 | 754 Rohloff Manufacturer 10 934 | 755 Rokform Manufacturer 10 935 | 756 Rola Manufacturer 10 936 | 288 Ross Frame manufacturer 10 http://www.randyrrross.com/ 937 | 757 Rossignol Manufacturer 10 938 | 1069 Rossin Frame manufacturer 10 http://rossinbikes.it/ 939 | 289 Rover Company Frame manufacturer 10 http://www.randyrrross.com/ 940 | 290 Rowbike Frame manufacturer 10 http://www.rowbike.com/ 941 | 758 Rox Manufacturer 10 942 | 759 Royal Manufacturer 10 943 | 1000 Royce Union Frame manufacturer 10 http://royceunionbikes.com/ 944 | 291 Rudge-Whitworth Frame manufacturer 10 945 | 361 S and M (S&M) Frame manufacturer 10 http://www.sandmbikes.com https://files.bikeindex.org/uploads/Ma/361/wwwsandmbikescom.png 946 | 762 S and S Manufacturer 10 947 | 296 SCOTT Frame manufacturer 500 http://www.scott-sports.com/global/en/ 948 | 770 SDG Manufacturer 10 949 | 363 SE Bikes (SE Racing) Frame manufacturer 250 http://www.sebikes.com https://files.bikeindex.org/uploads/Ma/363/wwwsebikescom.png 950 | 788 SKS Manufacturer 10 951 | 790 SLS3 Manufacturer 10 952 | 806 SR Suntour Manufacturer 10 953 | 807 SRAM Manufacturer 10 http://www.sram.com https://files.bikeindex.org/uploads/Ma/807/wwwsramcom.png 954 | 808 SST Manufacturer 10 955 | 811 START Manufacturer 10 956 | 831 SWEAT GUTR Manufacturer 10 957 | 763 Salomon Manufacturer 10 958 | 764 Salsa Frame manufacturer 250 http://salsacycles.com/ 959 | 766 SaltStick Manufacturer 10 960 | 292 Samchuly Frame manufacturer 10 http://www.samchuly.co.kr/main/main.html 961 | 1186 Sancineto Frame manufacturer 10 962 | 1038 Sanderson Frame manufacturer 10 http://sanderson-cycles.com 963 | 965 Santa Cruz Frame manufacturer 100 http://www.santacruzbicycles.com/en 964 | 293 Santana Cycles Frame manufacturer 10 http://www.santanatandem.com/ 965 | 294 Saracen Cycles Frame manufacturer 10 http://www.saracen.co.uk/ 966 | 767 Saris Manufacturer 10 967 | 295 Scania AB Frame manufacturer 10 http://scania.com/ 968 | 942 Scattante Frame manufacturer 100 http://www.performancebike.com/webapp/wcs/stores/servlet/SubCategory_10052_10551_400759_-1_400345_400345 969 | 1228 Schindelhauer Frame manufacturer 10 http://www.schindelhauerbikes.com/ 970 | 768 Schwalbe Manufacturer 10 971 | 117 Schwinn Frame manufacturer 500 http://www.schwinnbikes.com/ 972 | 769 Scotty Manufacturer 10 973 | 771 Seal Line Manufacturer 10 974 | 1027 Sears Roebuck Frame manufacturer 10 975 | 1020 Season Frame manufacturer 10 http://seasonbikesbmx.com/ 976 | 772 Seattle Sports Company Manufacturer 10 977 | 1143 Sekai Frame manufacturer 10 978 | 1058 Sekine Frame manufacturer 10 979 | 1289 Selle Anatomica Manufacturer 10 http://selleanatomica.com https://files.bikeindex.org/uploads/Ma/1289/selleanatomicacom.png 980 | 773 Selle Italia Manufacturer 10 981 | 774 Selle Royal Manufacturer 10 982 | 775 Selle San Marco Manufacturer 10 983 | 297 Serotta Frame manufacturer 10 http://serotta.com/ 984 | 1297 Sette Frame manufacturer 10 http://www.settebikes.com/ 985 | 298 Seven Cycles Frame manufacturer 10 http://www.sevencycles.com/ 986 | 845 Shadow Conspiracy Frame manufacturer 10 http://www.theshadowconspiracy.com/ 987 | 299 Shelby Cycle Company Frame manufacturer 10 988 | 776 Sherpani Manufacturer 10 989 | 366 Shimano Manufacturer 10 http://bike.shimano.com https://files.bikeindex.org/uploads/Ma/366/bikeshimanocom.png 990 | 1096 Shinola Frame manufacturer 10 http://www.shinola.com/ 991 | 962 Shogun Frame manufacturer 10 992 | 1010 Shredder Frame manufacturer 10 http://lilshredder.com/ 993 | 777 Sidi Manufacturer 10 994 | 778 Sierra Designs Manufacturer 10 995 | 779 Sigma Manufacturer 10 996 | 780 Silca Manufacturer 10 997 | 1392 Simcoe Frame manufacturer 10 http://simcoebicycles.com/ 998 | 781 Simple Green Manufacturer 10 999 | 1270 Simplon Frame manufacturer 10 http://www.simplon.com https://files.bikeindex.org/uploads/Ma/1270/wwwsimploncom.png 1000 | 300 Simson Frame manufacturer 10 1001 | 301 Sinclair Research Frame manufacturer 10 http://www.sinclairzx.com/ 1002 | 782 Singletrack Solutions Manufacturer 10 1003 | 783 Sinz Manufacturer 10 1004 | 1353 Six-Eleven Frame manufacturer 10 http://sixelevenbicycleco.com/ 1005 | 784 SixSixOne Manufacturer 10 1006 | 785 Skadi Manufacturer 10 1007 | 786 Skinz Manufacturer 10 1008 | 787 Skratch Labs Manufacturer 10 1009 | 999 Skyway Frame manufacturer 10 1010 | 789 Slime Manufacturer 10 1011 | 791 Smartwool Manufacturer 10 1012 | 792 SockGuy Manufacturer 10 1013 | 303 Sohrab Cycles Frame manufacturer 10 http://www.sohrab-cycles.com/index.php 1014 | 305 Solex Frame manufacturer 10 http://www.solexworld.com/en/ 1015 | 794 Solio Manufacturer 10 1016 | 304 Solé (Sole bicycles) Frame manufacturer 10 http://www.solebicycles.com/ 1017 | 368 Soma Frame manufacturer 100 http:// www.somafab.com 1018 | 306 Somec Frame manufacturer 10 http://www.somec.com/ 1019 | 1197 Sonoma Frame manufacturer 10 http://sonomabike.com/ 1020 | 1267 Soulcraft Frame manufacturer 10 http://www.soulcraftbikes.com 1021 | 795 Source Manufacturer 10 1022 | 364 Spalding Bicycles Frame manufacturer 10 1023 | 21 Sparta B.V. Frame manufacturer 10 1024 | 307 Specialized Frame manufacturer 500 http://www.specialized.com/us/en/home/ 1025 | 1276 Spectrum Frame manufacturer 10 http://www.spectrum-cycles.com/ 1026 | 797 Speedfil Manufacturer 10 1027 | 308 Speedwell bicycles Frame manufacturer 10 1028 | 798 Spenco Manufacturer 10 1029 | 1207 Spicer Frame manufacturer 10 http://www.spicercycles.com/ 1030 | 799 SpiderTech Manufacturer 10 1031 | 1030 Spike Manufacturer 10 http://spikeparts.com/ 1032 | 800 Spinskins Manufacturer 10 1033 | 953 Spooky Frame manufacturer 10 http://www.spookybikes.com 1034 | 803 SportRack Manufacturer 10 1035 | 801 Sportlegs Manufacturer 10 1036 | 802 Sportourer Manufacturer 10 1037 | 1053 Spot Frame manufacturer 10 http://spotbrand.com/ 1038 | 804 Sprintech Manufacturer 10 1039 | 805 Squeal Out Manufacturer 10 1040 | 110 Squire Manufacturer 10 http://www.squirelocks.co.uk/security_advice/secure_your_bicycle.html 1041 | 1018 St. Tropez Frame manufacturer 10 1042 | 1360 Stages cycling (Power meters) Frame manufacturer 10 http://www.stagescycling.com/stagespower 1043 | 12 Staiger Frame manufacturer 10 http://www.staiger-fahrrad.de/ 1044 | 809 Stan's No Tubes Manufacturer 10 1045 | 1144 Standard Byke Frame manufacturer 10 http://www.standardbyke.com/ 1046 | 810 Stanley Manufacturer 10 1047 | 1154 Stanridge Speed Frame manufacturer 10 http://www.stanridgespeed.com/ 1048 | 961 State Bicycle Co. Frame manufacturer 10 http://www.statebicycle.com/ 1049 | 812 Steadyrack Manufacturer 10 1050 | 1357 Steelman Cycles Frame manufacturer 10 http://www.steelmancycles.com/ 1051 | 813 Stein Manufacturer 10 1052 | 979 Stein Trikes Frame manufacturer 10 http://www.steintrikes.com/index.php 1053 | 311 Stelber Cycle Corp Frame manufacturer 10 1054 | 312 Stella Frame manufacturer 10 1055 | 814 Stem CAPtain Manufacturer 10 1056 | 313 Sterling Bicycle Co. Frame manufacturer 10 1057 | 983 Steve Potts Frame manufacturer 10 http://www.stevepottsbicycles.com 1058 | 1108 Stevens Frame manufacturer 10 http://www.stevensbikes.de/2014/index.php 1059 | 1229 Stevenson Custom Bicycles Frame manufacturer 10 http://stevensoncustombikes.com/ 1060 | 960 Stoemper Frame manufacturer 10 http://stoemper.com/ 1061 | 352 Stolen Bicycle Co. Frame manufacturer 10 1062 | 817 Stop Flats 2 Manufacturer 10 1063 | 939 Strada Customs Frame manufacturer 10 http://www.stradacustoms.com 1064 | 1210 Stradalli Cycles Frame manufacturer 10 http://www.carbonroadbikebicyclecycling.com/ 1065 | 818 Straitline Manufacturer 10 1066 | 1382 Strawberry Bicycle Frame manufacturer 10 http://www.strawberrybicycle.com/ 1067 | 314 Strida Frame manufacturer 10 1068 | 819 Strider Frame manufacturer 10 http://www.striderbikes.com/ 1069 | 1243 Stromer Frame manufacturer 10 http://www.stromerbike.com/en/us 1070 | 1177 Strong Frames Frame manufacturer 10 http://www.strongframes.com/ 1071 | 820 Sturmey-Archer Manufacturer 10 1072 | 1072 Stålhästen Frame manufacturer 10 http://www.stalhasten.eu/st%C3%A5lh%C3%A4sten 1073 | 821 Subrosa Frame manufacturer 10 http://subrosabrand.com/ 1074 | 822 Suelo Manufacturer 10 1075 | 823 Sugino Manufacturer 10 1076 | 315 Sun Frame manufacturer 10 1077 | 824 Sun Ringle Manufacturer 10 1078 | 825 SunRace Frame manufacturer 10 http://www.sunrace.com/ 1079 | 355 Sunday Frame manufacturer 10 http://www.sundaybikes.com https://files.bikeindex.org/uploads/Ma/355/wwwsundaybikescom.png 1080 | 1086 Sunn Frame manufacturer 10 https://www.facebook.com/sunn.bicycle 1081 | 826 Suomi Manufacturer 10 1082 | 827 Superfeet Manufacturer 10 1083 | 828 Supernova Manufacturer 10 1084 | 112 Surly Frame manufacturer 500 http://surlybikes.com https://files.bikeindex.org/uploads/Ma/112/surlybikescom.png 1085 | 1191 Surrey Frame manufacturer 10 http://www.internationalsurreyco.com 1086 | 829 Sutherlands Manufacturer 10 1087 | 830 Suunto Manufacturer 10 1088 | 318 Suzuki Frame manufacturer 10 1089 | 1252 Sweatpea Bicycles Frame manufacturer 10 http://www.sweetpeabicycles.com/ 1090 | 1275 Swingset Frame manufacturer 10 http://www.swingsetbicycles.com/ 1091 | 832 Swix Manufacturer 10 1092 | 963 Swobo Frame manufacturer 10 http://shop.swobo.com/ 1093 | 1234 SyCip Frame manufacturer 10 http://sycip.com/ 1094 | 833 Syntace Manufacturer 10 1095 | 834 T Mat Pro Manufacturer 10 1096 | 1232 TET Cycles (Tom Teesdale Bikes) Frame manufacturer 10 http://tetcycles.com/ 1097 | 842 TH Industries Manufacturer 10 1098 | 323 TI Cycles of India Frame manufacturer 10 1099 | 864 TRP Manufacturer 10 1100 | 870 TYR Manufacturer 10 1101 | 835 Tacx Manufacturer 10 https://www.tacx.com/ 1102 | 949 Takara Frame manufacturer 10 http://takarabikes.com/ 1103 | 1037 Talisman Frame manufacturer 10 1104 | 1370 Tallac Manufacturer 10 http://tallachouse.com/ 1105 | 836 Tamer Manufacturer 10 1106 | 837 Tange-Seiki Manufacturer 10 1107 | 838 Tangent Products Manufacturer 10 1108 | 1209 Tati Cycles Frame manufacturer 10 http://taticycles.com/ https://files.bikeindex.org/uploads/Ma/1209/tati.jpg 1109 | 1294 Taylor Bicycles (Paul Taylor) Frame manufacturer 10 http://taylorbicycles.blogspot.com/ 1110 | 839 Tec Labs Manufacturer 10 1111 | 840 Tektro Manufacturer 10 1112 | 976 Tern Frame manufacturer 10 http://www.ternbicycles.com/us/ 1113 | 1306 Terra Trike Frame manufacturer 10 http://www.terratrike.com/ 1114 | 1299 Terrible One Frame manufacturer 10 http://www.terribleone.com 1115 | 319 Terrot Frame manufacturer 10 1116 | 841 Terry Frame manufacturer 10 http://www.terrybicycles.com/ 1117 | 37 The Arthur Pequegnat Clock Company Frame manufacturer 10 1118 | 1080 The Bicycle Forge Frame manufacturer 10 http://www.bicycleforge.com/ 1119 | 844 The Hive Manufacturer 10 1120 | 846 Thinksport Manufacturer 10 1121 | 847 Thomson Manufacturer 10 1122 | 321 Thorn Cycles Frame manufacturer 10 1123 | 1386 Throne Cycles Frame manufacturer 10 http://thronecycles.com/ 1124 | 1161 Thruster Frame manufacturer 10 http://walmart.com https://files.bikeindex.org/uploads/Ma/1161/walmartcom.png 1125 | 848 Thule Frame manufacturer 10 http://www.thule.com 1126 | 985 Ti Cycles Frame manufacturer 10 http://ticycles.com/ 1127 | 111 Tigr Manufacturer 10 http://tigrlock.com https://files.bikeindex.org/uploads/Ma/111/tigrlockcom.png 1128 | 849 Timbuk2 Manufacturer 10 1129 | 850 Time Frame manufacturer 10 http://www.time-sport.com/ 1130 | 851 Timex Manufacturer 10 1131 | 852 Tioga Manufacturer 10 1132 | 991 Titan Frame manufacturer 10 http://www.titanracingbikes.com/ 1133 | 1043 Titus Frame manufacturer 10 http://www.titusti.com https://files.bikeindex.org/uploads/Ma/1043/wwwtitusticom.png 1134 | 853 Toko Manufacturer 10 1135 | 1380 Tomac Frame manufacturer 10 http://www.tomac.com.au/ 1136 | 1162 Tommasini Frame manufacturer 10 http://tommasinibicycle.com/ 1137 | 970 Tommaso Frame manufacturer 10 http://tommasobikes.com/ 1138 | 1164 Tony Hawk Frame manufacturer 10 http://www.toysrus.com/ 1139 | 854 Topeak Manufacturer 10 1140 | 855 TorHans Manufacturer 10 1141 | 1145 Torelli Frame manufacturer 10 http://www.torelli.com/ 1142 | 324 Torker Frame manufacturer 250 1143 | 1163 Tour de France Frame manufacturer 10 http://cyclefg.com/ 1144 | 1342 Toyo Frame manufacturer 10 http://toyoframe.com/ 1145 | 1271 Traitor Frame manufacturer 10 http://www.traitorcycles.com 1146 | 1273 Transit Manufacturer 10 http://www.performancebike.com/bikes/CategoryDisplay?catalogId=10551&storeId=10052&categoryId=400763&langId=-1&parent_category_rn=400345&top_category=400345&pageView= 1147 | 1019 Transition Bikes Frame manufacturer 10 http://www.transitionbikes.com/ 1148 | 856 Tranz-X Manufacturer 10 1149 | 857 Tree Manufacturer 10 1150 | 47 Trek Frame manufacturer 500 http://www.trekbikes.com/us/en/ 1151 | 858 Tressostar Manufacturer 10 1152 | 859 TriFlow Manufacturer 10 1153 | 862 TriSlide Manufacturer 10 1154 | 863 TriSwim Manufacturer 10 1155 | 1393 Tribe Bicycle Co Frame manufacturer 10 http://tribebicycles.com/ 1156 | 860 Trigger Point Manufacturer 10 1157 | 861 Trik Topz Manufacturer 10 1158 | 1287 Trinx Frame manufacturer 10 http://www.trinx.com/ 1159 | 326 Triumph Cycle Frame manufacturer 10 1160 | 865 TruVativ Manufacturer 10 1161 | 866 Tubasti Manufacturer 10 1162 | 867 Tufo Manufacturer 10 1163 | 14 Tunturi Frame manufacturer 10 1164 | 1341 Turin Frame manufacturer 10 http://www.turinbicycle.com/ 1165 | 328 Turner Bicycles Frame manufacturer 10 http://www.turnerbikes.com/ 1166 | 868 Twin Six Manufacturer 10 1167 | 869 TwoFish Manufacturer 10 1168 | 871 UCLEAR Manufacturer 10 1169 | 872 UCO Manufacturer 10 1170 | 873 Uline Manufacturer 10 1171 | 874 Ultimate Survival Technologies Manufacturer 10 1172 | 875 UltraPaws Manufacturer 10 1173 | 1004 Umberto Dei Frame manufacturer 10 http://umbertodei.it/index.htm 1174 | 876 Unior Manufacturer 10 1175 | 329 Univega Frame manufacturer 100 1176 | 877 Unknown Frame manufacturer 250 1177 | 1198 Upland Frame manufacturer 10 http://www.uplandbicycles.com/ 1178 | 330 Urago Frame manufacturer 10 1179 | 331 Utopia Frame manufacturer 10 1180 | 891 VP Components Manufacturer 10 1181 | 1248 VSF Fahrradmanufaktur Frame manufacturer 10 http://www.fahrradmanufaktur.de 1182 | 332 Valdora Frame manufacturer 10 1183 | 1272 Van Dessel Frame manufacturer 10 http://www.vandesselsports.com/ 1184 | 1047 Van Herwerden Frame manufacturer 10 http://www.vanherwerden.nl/ 1185 | 1251 Vanilla Frame manufacturer 10 http://www.thevanillaworkshop.com/ 1186 | 1231 Vanmoof Frame manufacturer 10 http://vanmoof.com/ 1187 | 878 Vargo Manufacturer 10 1188 | 1055 Vassago Frame manufacturer 10 http://www.vassagocycles.com/ 1189 | 880 Vee Rubber Manufacturer 10 1190 | 881 Velo Manufacturer 10 1191 | 882 Velo Orange Frame manufacturer 10 http://www.velo-orange.com/ 1192 | 883 Velo Press Manufacturer 10 1193 | 335 Velo Vie Frame manufacturer 10 1194 | 884 Velocity Manufacturer 10 1195 | 333 Velomotors Frame manufacturer 10 1196 | 982 Velorbis Frame manufacturer 10 http://www.velorbis.com/velorbis-collections/velorbis-bicycles 1197 | 885 Velox Manufacturer 10 1198 | 968 Verde Frame manufacturer 10 http://verdebmx.com/2013completes/ 1199 | 886 Versa Manufacturer 10 1200 | 981 Vilano Frame manufacturer 10 http://www.vilanobikes.com https://files.bikeindex.org/uploads/Ma/981/wwwvilanobikescom.png 1201 | 337 Villy Customs Frame manufacturer 10 1202 | 887 Vincero Design Manufacturer 10 1203 | 338 Vindec High Riser Frame manufacturer 10 1204 | 956 Virtue Frame manufacturer 10 http://www.virtuebike.com 1205 | 1082 Viscount Frame manufacturer 10 1206 | 888 Vision Frame manufacturer 10 http://www.visiontechusa.com/ 1207 | 889 Vittoria Manufacturer 10 1208 | 339 Vitus Frame manufacturer 10 1209 | 1188 Viva Frame manufacturer 10 http://www.vivabikes.com/ 1210 | 1192 Vivente Frame manufacturer 10 http://www.viventebikes.com/ 1211 | 1249 Volae Frame manufacturer 10 1212 | 1106 Volagi Frame manufacturer 10 http://www.volagi.com/ 1213 | 890 Volume Frame manufacturer 10 1214 | 1089 Voodoo Frame manufacturer 10 http://voodoocycles.net/ 1215 | 1075 Vortrieb Frame manufacturer 10 http://www.vortrieb.com/ 1216 | 334 VéloSoleX Frame manufacturer 10 1217 | 895 WD-40 Bike Manufacturer 10 1218 | 913 WTB Manufacturer 10 1219 | 996 Wabi Cycles Frame manufacturer 10 http://www.wabicycles.com/index.html 1220 | 892 Wahoo Fitness Manufacturer 10 1221 | 893 Wald Manufacturer 10 1222 | 894 Walking Bird Manufacturer 10 1223 | 341 Waterford Frame manufacturer 10 http://waterfordbikes.com/w/ 1224 | 342 WeThePeople Frame manufacturer 10 1225 | 1039 WeeRide Frame manufacturer 10 http://www.weeride.com/ 1226 | 1118 Weehoo Frame manufacturer 10 http://rideweehoo.com/ 1227 | 896 Wellgo Manufacturer 10 1228 | 897 Wheels Manufacturing Manufacturer 10 1229 | 898 Wheelsmith Manufacturer 10 1230 | 899 Where to Bike Manufacturer 10 1231 | 900 Whisky Parts Co Manufacturer 10 1232 | 901 Whispbar Manufacturer 10 1233 | 902 White Bros Manufacturer 10 1234 | 903 White Lightning Manufacturer 10 1235 | 904 Wigwam Manufacturer 10 1236 | 343 Wilderness Trail Bikes Frame manufacturer 10 1237 | 344 Wilier Triestina Frame manufacturer 10 1238 | 905 Williams Manufacturer 10 1239 | 906 Willworx Manufacturer 10 1240 | 907 Win Manufacturer 10 1241 | 946 Windsor Frame manufacturer 10 http://www.windsorbicycles.com/ 1242 | 932 Winora Frame manufacturer 10 http://www.winora.de/ 1243 | 1052 Winter Bicycles Frame manufacturer 10 http://www.winterbicycles.com/ 1244 | 908 Wippermann Manufacturer 10 1245 | 345 Witcomb Cycles Frame manufacturer 10 1246 | 909 Witz Manufacturer 10 1247 | 910 Wooden Bike Coffee Manufacturer 10 1248 | 1254 WordLock Frame manufacturer 10 http://wordlock.com/ 1249 | 987 WorkCycles Frame manufacturer 10 http://www.workcycles.com/ 1250 | 346 Worksman Cycles Frame manufacturer 10 http://www.worksmancycles.com/ 1251 | 912 World Jerseys Manufacturer 10 1252 | 347 Wright Cycle Company Frame manufacturer 10 1253 | 914 X-Fusion Manufacturer 10 1254 | 915 X-Lab Manufacturer 10 1255 | 1077 X-Treme Frame manufacturer 10 http://www.x-tremescooters.com 1256 | 1343 Xds Frame manufacturer 10 http://www.xdsbicycles.com/ 1257 | 348 Xootr Frame manufacturer 10 1258 | 916 Xpedo Manufacturer 10 1259 | 1007 Xtracycle Frame manufacturer 10 http://www.xtracycle.com/ 1260 | 920 YST Manufacturer 10 1261 | 917 Yakima Manufacturer 10 1262 | 918 Yaktrax Manufacturer 10 1263 | 349 Yamaguchi Bicycles Frame manufacturer 10 http://www.yamaguchibike.com/content/Index 1264 | 350 Yamaha Frame manufacturer 10 1265 | 919 Yankz Manufacturer 10 1266 | 1091 Yeti Frame manufacturer 100 http://www.yeticycles.com https://files.bikeindex.org/uploads/Ma/1091/wwwyeticyclescom.png 1267 | 1003 Yuba Frame manufacturer 10 http://yubabikes.com/ 1268 | 921 Yurbuds Manufacturer 10 1269 | 922 Zensah Manufacturer 10 1270 | 351 Zigo Frame manufacturer 10 1271 | 1215 Zinn Cycles Frame manufacturer 10 http://zinncycles.com 1272 | 923 Zipp Speed Weaponry Manufacturer 10 1273 | 924 Zoic Manufacturer 10 1274 | 925 Zoom Manufacturer 10 1275 | 926 Zoot Manufacturer 10 1276 | 1182 Zycle Fix Frame manufacturer 10 http://zyclefix.com/ 1277 | 1073 b'Twin Frame manufacturer 10 http://www.btwin.com/en/home 1278 | 1368 beixo Frame manufacturer 10 http://www.beixo.com/ 1279 | 1122 de Fietsfabriek Frame manufacturer 10 http://www.defietsfabriek.nl/ 1280 | 1119 di Florino Frame manufacturer 10 1281 | 502 e*thirteen Manufacturer 10 1282 | 507 eGear Manufacturer 10 1283 | 1170 eZip Frame manufacturer 10 http://www.currietech.com/ 1284 | 1280 eflow (Currietech) Frame manufacturer 10 http://www.currietech.com/ 1285 | 509 elete Manufacturer 10 1286 | 518 epicRIDES Manufacturer 10 1287 | 678 nuun Manufacturer 10 1288 | 1006 sixthreezero Frame manufacturer 10 http://www.sixthreezero.com/ 1289 | 1121 van Andel/Bakfiets Frame manufacturer 10 http://www.bakfiets.nl/ 1290 | --------------------------------------------------------------------------------