├── 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 [](https://travis-ci.org/sethherr/soulheart) [](https://codeclimate.com/github/sethherr/soulheart) [](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 | [](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 [](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 |
--------------------------------------------------------------------------------