emojidex 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -10
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +11 -0
  5. data/.travis.yml +17 -0
  6. data/Gemfile +16 -10
  7. data/Guardfile +12 -0
  8. data/README.md +27 -5
  9. data/Rakefile +6 -32
  10. data/emoji/categories.json +64 -0
  11. data/emojidex.gemspec +13 -20
  12. data/lib/emojidex.rb +9 -4
  13. data/lib/emojidex/api/categories.rb +16 -0
  14. data/lib/emojidex/api/emoji.rb +26 -0
  15. data/lib/emojidex/api/search/emoji.rb +16 -0
  16. data/lib/emojidex/cache.rb +69 -0
  17. data/lib/emojidex/categories.rb +32 -0
  18. data/lib/emojidex/category.rb +14 -0
  19. data/lib/emojidex/client.rb +60 -0
  20. data/lib/emojidex/collection.rb +119 -0
  21. data/lib/emojidex/defaults.rb +13 -0
  22. data/lib/emojidex/emoji.rb +74 -0
  23. data/lib/emojidex/error.rb +15 -0
  24. data/lib/emojidex/extended.rb +15 -0
  25. data/lib/emojidex/service.rb +32 -0
  26. data/lib/emojidex/utf.rb +15 -0
  27. data/spec/api/categories_spec.rb +49 -0
  28. data/spec/api/emoji_spec.rb +89 -0
  29. data/spec/api/search/emoji_spec.rb +30 -0
  30. data/spec/categories_spec.rb +18 -0
  31. data/spec/client_spec.rb +24 -0
  32. data/spec/emoji_spec.rb +63 -0
  33. data/spec/extended_spec.rb +107 -0
  34. data/spec/spec_helper.rb +64 -0
  35. data/spec/support/Genshin.svg +126 -0
  36. data/spec/support/couple_kiss/0.svg +177 -0
  37. data/spec/support/couple_kiss/1.svg +177 -0
  38. data/spec/support/couple_kiss/10.svg +293 -0
  39. data/spec/support/couple_kiss/11.svg +235 -0
  40. data/spec/support/couple_kiss/12.svg +235 -0
  41. data/spec/support/couple_kiss/13.svg +235 -0
  42. data/spec/support/couple_kiss/14.svg +177 -0
  43. data/spec/support/couple_kiss/15.svg +177 -0
  44. data/spec/support/couple_kiss/2.svg +177 -0
  45. data/spec/support/couple_kiss/3.svg +235 -0
  46. data/spec/support/couple_kiss/4.svg +235 -0
  47. data/spec/support/couple_kiss/5.svg +235 -0
  48. data/spec/support/couple_kiss/6.svg +293 -0
  49. data/spec/support/couple_kiss/7.svg +235 -0
  50. data/spec/support/couple_kiss/8.svg +235 -0
  51. data/spec/support/couple_kiss/9.svg +235 -0
  52. data/spec/support/couple_kiss/animation.json +14 -0
  53. data/spec/support/fixtures/categories.json +14 -0
  54. data/spec/support/fixtures/category.json +5 -0
  55. data/spec/support/fixtures/emoji.json +28 -0
  56. data/spec/support/fixtures/emoji_detailed.json +41 -0
  57. data/spec/support/fixtures/search_emoji.json +21 -0
  58. data/spec/support/fixtures/single_emoji.json +19 -0
  59. data/spec/support/fixtures/single_emoji_detailed.json +30 -0
  60. data/spec/support/test1/animation.json +6 -0
  61. data/spec/support/test2/animation.json +6 -0
  62. data/spec/support/test3/animation.json +5 -0
  63. data/spec/utf_spec.rb +66 -0
  64. metadata +82 -104
  65. data/app/assets/images/emojidex/.keep +0 -0
  66. data/app/assets/images/emojidex/glyphicons-halflings-white.png +0 -0
  67. data/app/assets/images/emojidex/glyphicons-halflings.png +0 -0
  68. data/app/assets/javascripts/emojidex/application.js +0 -14
  69. data/app/assets/javascripts/emojidex/bootstrap.min.js +0 -7
  70. data/app/assets/javascripts/emojidex/cheat_sheet.js +0 -12
  71. data/app/assets/javascripts/emojidex/poe_pallet.js +0 -71
  72. data/app/assets/stylesheets/emojidex/application.css +0 -15
  73. data/app/assets/stylesheets/emojidex/bootstrap-responsive.min.css +0 -9
  74. data/app/assets/stylesheets/emojidex/bootstrap.min.css +0 -9
  75. data/app/assets/stylesheets/emojidex/cheat_sheet.css +0 -41
  76. data/app/controllers/emojidex/application_controller.rb +0 -7
  77. data/app/controllers/emojidex/cheat_sheet_controller.rb +0 -50
  78. data/app/helpers/emojidex/application_helper.rb +0 -4
  79. data/app/helpers/emojidex/cheat_sheet_helper.rb +0 -4
  80. data/app/views/emojidex/cheat_sheet/index.html.erb +0 -58
  81. data/app/views/layouts/emojidex/application.html.erb +0 -14
  82. data/bin/rails +0 -8
  83. data/config/routes.rb +0 -5
  84. data/lib/emojidex/engine.rb +0 -5
  85. data/lib/emojidex/version.rb +0 -3
  86. data/lib/generators/emojidex/install/install_generator.rb +0 -35
  87. data/lib/tasks/emojidex_tasks.rake +0 -4
  88. data/test/controllers/emojidex/cheat_sheet_controller_test.rb +0 -11
  89. data/test/dummy/README.rdoc +0 -28
  90. data/test/dummy/Rakefile +0 -6
  91. data/test/dummy/app/assets/images/.keep +0 -0
  92. data/test/dummy/app/assets/javascripts/application.js +0 -13
  93. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  94. data/test/dummy/app/controllers/application_controller.rb +0 -5
  95. data/test/dummy/app/controllers/concerns/.keep +0 -0
  96. data/test/dummy/app/helpers/application_helper.rb +0 -2
  97. data/test/dummy/app/mailers/.keep +0 -0
  98. data/test/dummy/app/models/.keep +0 -0
  99. data/test/dummy/app/models/concerns/.keep +0 -0
  100. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  101. data/test/dummy/bin/bundle +0 -3
  102. data/test/dummy/bin/rails +0 -4
  103. data/test/dummy/bin/rake +0 -4
  104. data/test/dummy/config.ru +0 -4
  105. data/test/dummy/config/application.rb +0 -23
  106. data/test/dummy/config/boot.rb +0 -5
  107. data/test/dummy/config/database.yml +0 -25
  108. data/test/dummy/config/environment.rb +0 -5
  109. data/test/dummy/config/environments/development.rb +0 -29
  110. data/test/dummy/config/environments/production.rb +0 -80
  111. data/test/dummy/config/environments/test.rb +0 -36
  112. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  113. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  114. data/test/dummy/config/initializers/inflections.rb +0 -16
  115. data/test/dummy/config/initializers/mime_types.rb +0 -5
  116. data/test/dummy/config/initializers/secret_token.rb +0 -12
  117. data/test/dummy/config/initializers/session_store.rb +0 -3
  118. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  119. data/test/dummy/config/locales/en.yml +0 -23
  120. data/test/dummy/config/routes.rb +0 -4
  121. data/test/dummy/lib/assets/.keep +0 -0
  122. data/test/dummy/log/.keep +0 -0
  123. data/test/dummy/public/404.html +0 -58
  124. data/test/dummy/public/422.html +0 -58
  125. data/test/dummy/public/500.html +0 -57
  126. data/test/dummy/public/favicon.ico +0 -0
  127. data/test/emojidex_test.rb +0 -7
  128. data/test/helpers/emojidex/cheat_sheet_helper_test.rb +0 -6
  129. data/test/integration/navigation_test.rb +0 -10
  130. data/test/test_helper.rb +0 -15
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ module Emojidex
4
+ # Holds a master list of categories
5
+ class Categories
6
+ attr_accessor :categories
7
+
8
+ def initialize(categories_json = nil)
9
+ if categories_json
10
+ load_categories(categories_json)
11
+ else
12
+ load_standard_categories
13
+ end
14
+ end
15
+
16
+ def load_categories(json)
17
+ raw = JSON.parse(json, symbolize_names: true)
18
+ raw = raw[:categories]
19
+
20
+ @categories ||= {}
21
+ raw.each do |category_info|
22
+ category = Emojidex::Category.new category_info
23
+ @categories[category.code.to_sym] = category
24
+ end
25
+ end
26
+
27
+ def load_standard_categories
28
+ load_categories(IO.read(
29
+ File.expand_path('../../../emoji/categories.json', __FILE__)))
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+
3
+ module Emojidex
4
+ # Category information
5
+ class Category
6
+ attr_accessor :code, :en, :ja
7
+
8
+ def initialize(details = {})
9
+ @code = details[:code]
10
+ @en = details[:en]
11
+ @ja = details[:ja]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,60 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+
4
+ require 'emojidex/api/categories'
5
+ require 'emojidex/api/emoji'
6
+ require 'emojidex/api/search/emoji'
7
+
8
+ module Emojidex
9
+ # get the data from emojidex.com
10
+ class Client
11
+ attr_accessor :api_key, :api_username
12
+ attr_reader :host
13
+
14
+ include Emojidex::API::Categories
15
+ include Emojidex::API::Emoji
16
+ include Emojidex::API::Search::Emoji
17
+
18
+ def initialize(opts = {})
19
+ @api_key = opts[:api_key]
20
+ @api_username = opts[:api_username]
21
+ @host = opts[:host] || 'https://www.emojidex.com/'
22
+ end
23
+
24
+ def connection_options
25
+ @connection_options ||= {
26
+ url: @host,
27
+ headers: {
28
+ accept: 'application/json',
29
+ user_agent: user_agent
30
+ }
31
+ }
32
+ end
33
+
34
+ def user_agent
35
+ @user_agent ||= 'Emojidex Toolkit Client'
36
+ end
37
+
38
+ def get(path, params = {})
39
+ request(:get, path, params)
40
+ end
41
+
42
+ private
43
+
44
+ def connection
45
+ @connection ||= Faraday.new connection_options do |conn|
46
+ conn.request :url_encoded
47
+ conn.response :json
48
+ # conn.response :logger
49
+ conn.adapter Faraday.default_adapter
50
+ end
51
+ end
52
+
53
+ def request(method, path, params = {})
54
+ response = connection.send(method.to_sym, path, params)
55
+ response.env
56
+ rescue Faraday::Error::ClientError, JSON::ParserError
57
+ raise Emojidex::Error
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,119 @@
1
+ # encoding: utf-8
2
+
3
+ require 'json'
4
+ require_relative 'emoji'
5
+ require_relative 'categories'
6
+ require_relative 'cache'
7
+
8
+ module Emojidex
9
+ # listing and search of standard UTF emoji
10
+ class Collection
11
+ include Emojidex::Cache
12
+ attr_accessor :emoji, :categories
13
+ attr_reader :source_path
14
+ # Initialize Collection. You can pass a list of emoji to seed the collection
15
+ def initialize(emoji_list = nil)
16
+ @emoji = {}
17
+ add_emoji(emoji_list) unless emoji_list.nil?
18
+ end
19
+
20
+ # Loads an emoji collection on local storage
21
+ def load_local_collection(path)
22
+ @source_path = File.expand_path(path)
23
+ json = IO.read(@source_path + '/emoji.json')
24
+ list = JSON.parse(json, symbolize_names: true)
25
+ add_emoji(list)
26
+ end
27
+
28
+ # each override to map each functionality to the emoji hash values
29
+ def each
30
+ return @emoji.values.each unless block_given?
31
+ @emoji.values.each { |emoji| yield emoji }
32
+ end
33
+
34
+ # select override to map select functionality to the emoji hash values
35
+ def select
36
+ return @emoji.values.select unless block_given?
37
+ @emoji.values.select { |emoji| yield emoji }
38
+ end
39
+
40
+ # Retreives an Emoji object by the actual moji code/character code
41
+ # Will likely only return moji from UTF collection
42
+ def find_by_moji(moji)
43
+ result = nil
44
+ each do |emoji|
45
+ result = emoji if emoji[:moji] == moji
46
+ end
47
+ result
48
+ end
49
+
50
+ alias_method :文字検索, :find_by_moji
51
+
52
+ # Gets the emoji with the specified code
53
+ # Returns the Emoji object or nil if no emoji with that code is found
54
+ def find_by_code(code)
55
+ @emoji[code.gsub(/\s/, '_').to_sym]
56
+ end
57
+
58
+ # Locates emoji by Japanese code (original Japanese emoji name [絵文字名])
59
+ # Only applies to collections that contain JA codes, this function is mapped to
60
+ # find_by_code for all other implementations (such as client)
61
+ def find_by_code_ja(code_ja)
62
+ each do |emoji|
63
+ return emoji if emoji[:code_ja] == code_ja
64
+ end
65
+ end
66
+
67
+ alias_method :コード検索, :find_by_code_ja
68
+
69
+ def search(criteria = {})
70
+ Emojidex::Collection.new _sub_search(@emoji.values.dup, criteria)
71
+ end
72
+
73
+ # Get all emoji from this collection that are part of the specified category
74
+ # Returns a new collection of only emoji in the specified category
75
+ def category(category_code)
76
+ categorized = @emoji.values.select { |moji| moji.category == category_code }
77
+ Emojidex::Collection.new categorized
78
+ end
79
+
80
+ # Check to see if there are emoji in this collection which have the specified categories
81
+ # Returns true if there are emoji for all secified categories within this collection
82
+ def category?(*category_codes)
83
+ (category_codes.uniq - @categories).empty?
84
+ end
85
+
86
+ # Adds emojis to the collection
87
+ # After add categories are updated
88
+ def add_emoji(list)
89
+ list.each do |moji_info|
90
+ if moji_info.instance_of? Emojidex::Emoji
91
+ @emoji[moji_info.code.to_sym] = moji_info.dup
92
+ else
93
+ emoji = Emojidex::Emoji.new moji_info
94
+ @emoji[emoji.code.to_sym] = emoji
95
+ end
96
+ end
97
+ categorize
98
+ @emoji
99
+ end
100
+
101
+ alias_method :<<, :add_emoji
102
+
103
+ private
104
+
105
+ # Makes a list of all categories which contain emoji in this collection
106
+ def categorize
107
+ @categories = @emoji.values.map { |moji| moji.category }
108
+ @categories.uniq!
109
+ end
110
+
111
+ def _sub_search(list, criteria = {})
112
+ cr = criteria.shift
113
+ return list if cr.nil?
114
+
115
+ list = list.select { |moji| moji if moji[cr[0]] =~ /#{cr[1]}/ }
116
+ _sub_search(list, criteria)
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,13 @@
1
+ module Emojidex
2
+ # Global defines for emojidex
3
+ class Defaults
4
+ def self.sizes
5
+ { ldpi: 9, mdpi: 18, hdpi: 27, xhdpi: 36, px8: 8,
6
+ px16: 16, px32: 32, px64: 64, px128: 128, px256: 256 }
7
+ end
8
+
9
+ def self.formats
10
+ [':svg', ':png']
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,74 @@
1
+ #
2
+ # Emojidex::Emoji
3
+ #
4
+ module Emojidex
5
+ # emoji base class
6
+ class Emoji
7
+ attr_accessor :moji, :category, :code, :unicode,
8
+ :tags, :frames, :delays
9
+
10
+ def initialize(details = {})
11
+ @moji = details[:moji]
12
+ @code, @code_ja = details[:code], details[:code_ja]
13
+ @unicode = details[:unicode]
14
+ @category = details[:category] ? details[:category].to_sym : :other
15
+ @tags = details[:tags].map { |tag| tag.to_sym } unless details[:tags].nil?
16
+ @frames = details[:frames] || [@code]
17
+ @delays = details[:delays] || [100]
18
+ @loops = details[:loops]
19
+ @link = details[:link]
20
+ @is_wide = details[:is_wide]
21
+ end
22
+
23
+ def to_s
24
+ @moji || ':' + @code + ':'
25
+ end
26
+
27
+ def to_json(*args)
28
+ to_hash.to_json(*args)
29
+ end
30
+
31
+ def to_hash
32
+ hash = {}
33
+ instance_variables.each do |key|
34
+ hash[key.to_s.delete('@')] = instance_variable_get(key)
35
+ end
36
+ hash
37
+ end
38
+
39
+ def [](key)
40
+ instance_variable_get(key.to_s.delete(':').insert(0, '@'))
41
+ end
42
+
43
+ def []=(key, val)
44
+ instance_variable_set(key.to_s.delete(':').insert(0, '@'), val)
45
+ end
46
+
47
+ def set_animation_data(params)
48
+ set_frames(params)
49
+ set_delays(params)
50
+ end
51
+
52
+ def set_frames(params)
53
+ return if params[:frames].nil?
54
+
55
+ @frames = params[:frames].clone
56
+ params[:frames].each_with_index do |frame, i|
57
+ @frames[i] = frame.keys.first.to_s if frame.is_a? Hash
58
+ end
59
+ end
60
+
61
+ def set_delays(params)
62
+ default_delay = params[:default_delay] || 100
63
+
64
+ @delays = params[:delays] unless params[:delays].nil?
65
+ if @delays.length < @frames.length
66
+ @delays << default_delay until @delays.length == @frames.length
67
+ end
68
+ end
69
+
70
+ def animated?
71
+ @frames.count > 1
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ module Emojidex
2
+ # emojidex error class
3
+ class Error < StandardError
4
+ attr_reader :wrapped_exception
5
+
6
+ def initialize(exception = $ERROR_INFO)
7
+ @wrapped_exception = exception
8
+ if exception.respond_to?(:message)
9
+ super(exception.message)
10
+ else
11
+ super(exception.to_s)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'collection'
2
+
3
+ module Emojidex
4
+ # listing and search of extended emoji from the emojidex set
5
+ class Extended < Collection
6
+ def initialize
7
+ super
8
+ if defined? Emojidex::Vectors
9
+ load_local_collection Emojidex::Vectors.path + '/extended'
10
+ else
11
+ # TODO load from service
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ require_relative 'collection'
2
+ require_relative 'client'
3
+
4
+ module Emojidex
5
+ # listing and search of emoji from the online service/emojidex.com
6
+ class Service < Collection
7
+ attr_accessor :client
8
+ def initialize(emoji_list = nil, client_opts = {})
9
+ super emoji_list
10
+ @client = Emojidex::Client.new client_opts
11
+ end
12
+
13
+ # sends an API search, adding results with add_emoji
14
+ # returns a collection, and adds results to the @emoji array
15
+ def search(criteria = {})
16
+ # TODO *NOTE try and replicate regex search functionality by passing regex to server
17
+ end
18
+
19
+ # directly retrieves the emoji with the given code
20
+ def find_by_code(code)
21
+ # TODO
22
+ end
23
+
24
+ # emoji on the emojidex service make no language distinctions
25
+ # find_by_code_ja is simply remapped to find_by_code
26
+ def find_by_code_ja(code)
27
+ find_by_code(code)
28
+ end
29
+
30
+ # TODO override or add caching functionality to retrieve sized png or svg from service
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'collection'
2
+
3
+ module Emojidex
4
+ # listing and search of standard UTF emoji
5
+ class UTF < Collection
6
+ def initialize
7
+ super
8
+ if defined? Emojidex::Vectors
9
+ load_local_collection Emojidex::Vectors.path + '/utf'
10
+ else
11
+ # TODO load from service
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe Emojidex::API::Categories do
4
+
5
+ subject { Emojidex::Client.new(host: 'http://localhost') }
6
+ let!(:api_url) { 'http://localhost/api/v1' }
7
+
8
+ describe '#categories' do
9
+ before do
10
+ stub_get("#{api_url}/categories.json")
11
+ .to_return(
12
+ body: fixture('categories.json'),
13
+ headers: { content_type: 'application/json' }
14
+ )
15
+ end
16
+
17
+ it 'requests the correct resource' do
18
+ subject.categories
19
+ expect(a_get("#{api_url}/categories.json")).to have_been_made
20
+ end
21
+
22
+ it 'returns the requested categories' do
23
+ categories = subject.categories
24
+ expect(categories).to be_an Array
25
+ expect(categories.first).to be_a Hash
26
+ end
27
+ end
28
+
29
+ describe '#category' do
30
+ before do
31
+ stub_get("#{api_url}/categories/category.json")
32
+ .to_return(
33
+ body: fixture('category.json'),
34
+ headers: { content_type: 'application/json' }
35
+ )
36
+ end
37
+
38
+ it 'requests the correct resource' do
39
+ subject.category
40
+ expect(a_get("#{api_url}/categories/category.json")).to have_been_made
41
+ end
42
+
43
+ it 'returns the requested category' do
44
+ category = subject.category
45
+ expect(category).to be_a Hash
46
+ end
47
+ end
48
+
49
+ end