diff --git a/doc/default/x.md b/doc/default/x.md index 7ba3aae4d0..f64a0f6f64 100644 --- a/doc/default/x.md +++ b/doc/default/x.md @@ -1,5 +1,3 @@ -`Faker::Twitter` has been deprecated in favor of `Faker::X`. While it's still maintained, its docs can be found at [Faker::Twitter](#fakertwitter). - # Faker::X Generates approximate X (previously Twitter) user and tweet objects, based on X's API v2 responses. @@ -58,9 +56,9 @@ Produces a random X tweet with default attributes. Available extensions can be r ```ruby # Keyword arguments: include_user, include_media -Faker::Twitter.tweet #=> { data: [{:id=>"8821452687517076614", :text=>"Ea et laboriosam vel non.",... -Faker::Twitter.tweet(include_user: true) # Includes user attributes -Faker::Twitter.tweet(include_media: true) # Includes media (photo) attributes +Faker::X.tweet #=> { data: [{:id=>"8821452687517076614", :text=>"Ea et laboriosam vel non.",... +Faker::X.tweet(include_user: true) # Includes user attributes +Faker::X.tweet(include_media: true) # Includes media (photo) attributes ``` Example outputs: @@ -194,35 +192,3 @@ Produces a random screen_name: ```ruby Faker::X.screen_name #=> "audreanne_hackett" ``` - -# Faker::Twitter - -This generator has been deprecated. Please use `Faker::X` instead. Note that some attributes have been deprecated by [X's API](https://docs.x.com/x-api/migrate/data-format-migration). - -Available since version 1.7.3. - -Generate realistic Twitter user and status objects similar to what you would get back from the API. - -```json -{ - "created_at": "Mon Dec 10 00:00:00 +0000 2012", - "id": 8821452687517076614, - "id_str": "8821452687517076614", - "text": "Ea et laboriosam vel non.", - // ... -} -``` - -```ruby -# Keyword arguments: include_status, include_email -Faker::Twitter.user #=> {:id=>8821452687517076614, :name=>"Lincoln Paucek", :screen_name=>"cody"... -Faker::Twitter.user(include_status: false) # Just get a user object with no embed status -Faker::Twitter.user(include_email: true) # Simulate an authenticated user with the email permission - -# Keyword arguments: include_user, include_photo -Faker::Twitter.status #=> {:id=>8821452687517076614, :text=>"Ea et laboriosam vel non."... -Faker::Twitter.status(include_user: false) # Just get a status object with no embed user -Faker::Twitter.status(include_photo: true) # Includes entities for an attached image - -Faker::Twitter.screen_name #=> "audreanne_hackett" -``` diff --git a/lib/faker/default/twitter.rb b/lib/faker/default/twitter.rb deleted file mode 100644 index 02c5d3f0f6..0000000000 --- a/lib/faker/default/twitter.rb +++ /dev/null @@ -1,401 +0,0 @@ -# frozen_string_literal: true - -module Faker - class Twitter < Base - class << self - ## - # Produces a random Twitter user. - # - # @param include_status [Boolean] Include or exclude user status details - # @param include_email [Boolean] Include or exclude user email details - # @return [Hash] - # - # @example - # Faker::Twitter.user #=> {:id=>8821452687517076614, :name=>"Lincoln Paucek", :screen_name=>"cody"... - # Faker::Twitter.user(include_status: false) # Just get a user object with no embed status - # Faker::Twitter.user(include_email: true) # Simulate an authenticated user with the email permission - # - # @faker.version 1.7.3 - def user(include_status: true, include_email: false) - warn('DEPRECATION WARNING: Faker::Twitter is deprecated. Use Faker::X instead. Some return attributes \ - will be removed, check the docs for more details.') - - user_id = id - background_image_url = Faker::LoremFlickr.image(size: '600x400') - profile_image_url = Faker::Avatar.image(slug: user_id, size: '48x48') - user = { - id: user_id, - id_str: user_id.to_s, - contributors_enabled: Faker::Boolean.boolean(true_ratio: 0.1), - created_at: created_at, - default_profile_image: Faker::Boolean.boolean(true_ratio: 0.1), - default_profile: Faker::Boolean.boolean(true_ratio: 0.1), - description: Faker::Lorem.sentence, - entities: user_entities, - favourites_count: Faker::Number.between(to: 1, from: 100_000), - follow_request_sent: false, - followers_count: Faker::Number.between(to: 1, from: 10_000_000), - following: false, - friends_count: Faker::Number.between(to: 1, from: 100_000), - geo_enabled: Faker::Boolean.boolean(true_ratio: 0.1), - is_translation_enabled: Faker::Boolean.boolean(true_ratio: 0.1), - is_translator: Faker::Boolean.boolean(true_ratio: 0.1), - lang: Faker::Address.country_code, - listed_count: Faker::Number.between(to: 1, from: 1000), - location: "#{Faker::Address.city}, #{Faker::Address.state_abbr}, #{Faker::Address.country_code}", - name: Faker::Name.name, - notifications: false, - profile_background_color: Faker::Color.hex_color, - profile_background_image_url_https: background_image_url, - profile_background_image_url: background_image_url.sub('https://', 'http://'), - profile_background_tile: Faker::Boolean.boolean(true_ratio: 0.1), - profile_banner_url: Faker::LoremFlickr.image(size: '1500x500'), - profile_image_url_https: profile_image_url, - profile_image_url: profile_image_url.sub('https://', 'http://'), - profile_link_color: Faker::Color.hex_color, - profile_sidebar_border_color: Faker::Color.hex_color, - profile_sidebar_fill_color: Faker::Color.hex_color, - profile_text_color: Faker::Color.hex_color, - profile_use_background_image: Faker::Boolean.boolean(true_ratio: 0.4), - protected: Faker::Boolean.boolean(true_ratio: 0.1), - screen_name: screen_name, - statuses_count: Faker::Number.between(to: 1, from: 100_000), - time_zone: Faker::Address.time_zone, - url: Faker::Internet.url(host: 'example.com'), - utc_offset: utc_offset, - verified: Faker::Boolean.boolean(true_ratio: 0.1) - } - user[:status] = Faker::Twitter.status(include_user: false) if include_status - user[:email] = Faker::Internet.email if include_email - user - end - - ## - # Produces a random Twitter user. - # - # @param include_user [Boolean] Include or exclude user details - # @param include_photo [Boolean] Include or exclude user photo - # @return [Hash] - # - # @example - # Faker::Twitter.status #=> {:id=>8821452687517076614, :text=>"Ea et laboriosam vel non."... - # Faker::Twitter.status(include_user: false) # Just get a status object with no embed user - # Faker::Twitter.status(include_photo: true) # Includes entities for an attached image - # - # @faker.version 1.7.3 - def status(include_user: true, include_photo: false) - warn('DEPRECATION WARNING: Faker::Twitter is deprecated. Use Faker::X instead. Some return attributes \ - will be removed, check the docs for more details.') - - status_id = id - status = { - id: status_id, - id_str: status_id.to_s, - contributors: nil, - coordinates: nil, - created_at: created_at, - entities: status_entities(include_photo: include_photo), - favorite_count: Faker::Number.between(to: 1, from: 10_000), - favorited: false, - geo: nil, - in_reply_to_screen_name: nil, - in_reply_to_status_id: nil, - in_reply_to_user_id_str: nil, - in_reply_to_user_id: nil, - is_quote_status: false, - lang: Faker::Address.country_code, - nil: nil, - place: nil, - possibly_sensitive: Faker::Boolean.boolean(true_ratio: 0.1), - retweet_count: Faker::Number.between(to: 1, from: 10_000), - retweeted_status: nil, - retweeted: false, - source: "#{Faker::Company.name}", - text: Faker::Lorem.sentence, - truncated: false - } - status[:user] = Faker::Twitter.user(include_status: false) if include_user - status[:text] = "#{status[:text]} #{status[:entities][:media].first[:url]}" if include_photo - status - end - - ## - # Produces a random screen name. - # - # @return [String] - # - # @example - # Faker::Twitter.screen_name #=> "audreanne_hackett" - # - # @faker.version 1.7.3 - def screen_name - warn('DEPRECATION WARNING: Faker::Twitter is deprecated. Use Faker::X instead.') - - Faker::Internet.username(specifier: nil, separators: ['_'])[0...20] - end - - private - - def id - Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807) - end - - def created_at - Faker::Date.between(from: '2006-03-21', to: ::Date.today).strftime('%a %b %d %H:%M:%S %z %Y') - end - - def utc_offset - Faker::Number.between(to: -43_200, from: 50_400) - end - - def user_entities - { - url: { - urls: [] - }, - description: { - urls: [] - } - } - end - - def status_entities(include_photo: false) - entities = { - hashtags: [], - symbols: [], - user_mentions: [], - urls: [] - } - entities[:media] = [photo_entity] if include_photo - entities - end - - def photo_entity - media_url = Faker::LoremFlickr.image(size: '1064x600') - media_id = id - { - id: media_id, - id_str: media_id.to_s, - indices: [ - 103, - 126 - ], - media_url: media_url.sub('https://', 'http://'), - media_url_https: media_url, - url: Faker::Internet.url(host: 'example.com'), - display_url: 'example.com', - expanded_url: Faker::Internet.url(host: 'example.com'), - type: 'photo', - sizes: { - medium: { - w: 1064, - h: 600, - resize: 'fit' - }, - large: { - w: 1064, - h: 600, - resize: 'fit' - }, - small: { - w: 680, - h: 383, - resize: 'fit' - }, - thumb: { - w: 150, - h: 150, - resize: 'crop' - } - } - } - end - end - end - - class X < Base - class << self - ## - # Produces a random X user based on X's v2 API. - # - # @return [Hash] - # - # @example - # Faker::X.user #=> { data: [{:id=>"8821452687517076614", :name=>"Lincoln Paucek", :screen_name=>"cody"... - # - # @faker.version 1.7.3 - def user - author_id = Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807) - - { - data: [ - { - author_id: author_id.to_s, - id: id.to_s, - text: Faker::Lorem.sentence - } - ], - includes: { - users: [ - { - public_metrics: { - followers_count: Faker::Number.between(to: 1, from: 1_000), - following_count: Faker::Number.between(to: 1, from: 200), - tweet_count: Faker::Number.between(to: 1, from: 10_000), - listed_count: Faker::Number.between(to: 1, from: 1_000) - }, - username: screen_name, - pinned_tweet_id: Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807).to_s, - entities: user_entities, - description: Faker::Lorem.sentence, - name: Faker::Name.name, - verified: Faker::Boolean.boolean(true_ratio: 0.1), - location: Faker::Internet.public_ip_v4_address, - id: author_id.to_s, - protected: Faker::Boolean.boolean(true_ratio: 0.1), - url: url, - profile_image_url: Faker::Avatar.image(slug: id, size: '48x48'), - created_at: created_at - } - ] - } - } - end - - ## - # Produces a random X tweet with default attributes. - # - # @param include_user [Boolean] Include user details - # @param include_media [Boolean] Include user media (photo) details - # @return [Hash] - # - # @example - # Faker::X.tweet #=> { data: [{:id=>"8821452687517076614", :text=>"Ea et laboriosam vel non."... - # Faker::X.tweet(include_media: true) # Get a tweet object with a photo media attachment - # Faker::X.tweet(include_user: true) # Get a tweet object with an user details - # - # @faker.version 1.7.3 - def tweet(include_media: false, include_user: false) - tweet = {} - tweet_object = tweet_item - includes = {} - - if include_media - media_key = Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807).to_s - - includes[:media] = media(media_key) - tweet_object[:attachments] = { media_keys: [media_key] } - end - - includes[:users] = user[:includes][:users] if include_user - - tweet[:data] = [ - tweet_object - ] - - unless includes.empty? - tweet[:includes] = includes - end - - tweet - end - - ## - # Produces a random screen_name. - # - # @return [String] - # - # @example - # Faker::X.screen_name #=> "audreanne_hackett" - # - # @faker.version 1.7.3 - def screen_name - Faker::Internet.username(specifier: nil, separators: ['_'])[0...20] - end - - private - - def id - Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807) - end - - def created_at - Faker::Date.between(from: '2006-03-21', to: ::Date.today).to_time.utc.iso8601(3) - end - - def url - "https://t.co/#{Faker::Lorem.characters(number: 10)}" - end - - def user_entities - entities = tweet_entities - - { - url: { - urls: entities[:urls] - }, - description: { - hashtags: entities[:hashtags] - } - } - end - - def tweet_entities - display_url = Faker::Internet.url(host: 'example.com') - - { - urls: [ - { - start: 0, - end: 5, - url: url, - expanded_url: display_url, - display_url: display_url.sub('http://', '') - } - ], - hashtags: [ - { - start: 0, - end: 5, - tag: Faker::Lorem.word.capitalize - } - ] - } - end - - def media(media_key) - expanded_url = Faker::LoremFlickr.image(size: '1064x600') - - [{ - height: Faker::Number.between(to: 1, from: 1000), - media_key: media_key, - type: 'photo', - preview_image_url: expanded_url, - width: Faker::Number.between(to: 1, from: 2000), - alt_text: Faker::Lorem.sentence - }] - end - - def tweet_item - conversation_id = id.to_s - - { - id: conversation_id, - text: Faker::Lorem.sentence, - lang: sample(%w[en fr es pt it ja]), - conversation_id: conversation_id, - created_at: created_at, - author_id: Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807).to_s, - public_metrics: { - retweet_count: Faker::Number.between(to: 1, from: 100), - reply_count: Faker::Number.between(to: 1, from: 20), - like_count: Faker::Number.between(to: 1, from: 25), - quote_count: Faker::Number.between(to: 1, from: 10) - }, - possibly_sensitive: Faker::Boolean.boolean(true_ratio: 0.1), - entities: tweet_entities - } - end - end - end -end diff --git a/lib/faker/default/x.rb b/lib/faker/default/x.rb new file mode 100644 index 0000000000..685f3e9117 --- /dev/null +++ b/lib/faker/default/x.rb @@ -0,0 +1,189 @@ +# frozen_string_literal: true + +module Faker + class X < Base + class << self + ## + # Produces a random X user based on X's v2 API. + # + # @return [Hash] + # + # @example + # Faker::X.user #=> { data: [{:id=>"8821452687517076614", :name=>"Lincoln Paucek", :screen_name=>"cody"... + # + # @faker.version 1.7.3 + def user + author_id = Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807) + + { + data: [ + { + author_id: author_id.to_s, + id: id.to_s, + text: Faker::Lorem.sentence + } + ], + includes: { + users: [ + { + public_metrics: { + followers_count: Faker::Number.between(to: 1, from: 1_000), + following_count: Faker::Number.between(to: 1, from: 200), + tweet_count: Faker::Number.between(to: 1, from: 10_000), + listed_count: Faker::Number.between(to: 1, from: 1_000) + }, + username: screen_name, + pinned_tweet_id: Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807).to_s, + entities: user_entities, + description: Faker::Lorem.sentence, + name: Faker::Name.name, + verified: Faker::Boolean.boolean(true_ratio: 0.1), + location: Faker::Internet.public_ip_v4_address, + id: author_id.to_s, + protected: Faker::Boolean.boolean(true_ratio: 0.1), + url: url, + profile_image_url: Faker::Avatar.image(slug: id, size: '48x48'), + created_at: created_at + } + ] + } + } + end + + ## + # Produces a random X tweet with default attributes. + # + # @param include_user [Boolean] Include user details + # @param include_media [Boolean] Include user media (photo) details + # @return [Hash] + # + # @example + # Faker::X.tweet #=> { data: [{:id=>"8821452687517076614", :text=>"Ea et laboriosam vel non."... + # Faker::X.tweet(include_media: true) # Get a tweet object with a photo media attachment + # Faker::X.tweet(include_user: true) # Get a tweet object with an user details + # + # @faker.version 1.7.3 + def tweet(include_media: false, include_user: false) + tweet = {} + tweet_object = tweet_item + includes = {} + + if include_media + media_key = Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807).to_s + + includes[:media] = media(media_key) + tweet_object[:attachments] = { media_keys: [media_key] } + end + + includes[:users] = user[:includes][:users] if include_user + + tweet[:data] = [ + tweet_object + ] + + unless includes.empty? + tweet[:includes] = includes + end + + tweet + end + + ## + # Produces a random screen_name. + # + # @return [String] + # + # @example + # Faker::X.screen_name #=> "audreanne_hackett" + # + # @faker.version 1.7.3 + def screen_name + Faker::Internet.username(specifier: nil, separators: ['_'])[0...20] + end + + private + + def id + Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807) + end + + def created_at + Faker::Date.between(from: '2006-03-21', to: ::Date.today).to_time.utc.iso8601(3) + end + + def url + "https://t.co/#{Faker::Lorem.characters(number: 10)}" + end + + def user_entities + entities = tweet_entities + + { + url: { + urls: entities[:urls] + }, + description: { + hashtags: entities[:hashtags] + } + } + end + + def tweet_entities + display_url = Faker::Internet.url(host: 'example.com') + + { + urls: [ + { + start: 0, + end: 5, + url: url, + expanded_url: display_url, + display_url: display_url.sub('http://', '') + } + ], + hashtags: [ + { + start: 0, + end: 5, + tag: Faker::Lorem.word.capitalize + } + ] + } + end + + def media(media_key) + expanded_url = Faker::LoremFlickr.image(size: '1064x600') + + [{ + height: Faker::Number.between(to: 1, from: 1000), + media_key: media_key, + type: 'photo', + preview_image_url: expanded_url, + width: Faker::Number.between(to: 1, from: 2000), + alt_text: Faker::Lorem.sentence + }] + end + + def tweet_item + conversation_id = id.to_s + + { + id: conversation_id, + text: Faker::Lorem.sentence, + lang: sample(%w[en fr es pt it ja]), + conversation_id: conversation_id, + created_at: created_at, + author_id: Faker::Number.between(from: 1, to: 9_223_372_036_854_775_807).to_s, + public_metrics: { + retweet_count: Faker::Number.between(to: 1, from: 100), + reply_count: Faker::Number.between(to: 1, from: 20), + like_count: Faker::Number.between(to: 1, from: 25), + quote_count: Faker::Number.between(to: 1, from: 10) + }, + possibly_sensitive: Faker::Boolean.boolean(true_ratio: 0.1), + entities: tweet_entities + } + end + end + end +end diff --git a/lib/faker/music/bossa_nova.rb b/lib/faker/music/bossa_nova.rb index f0bf81a5d4..29dc8ea4f7 100644 --- a/lib/faker/music/bossa_nova.rb +++ b/lib/faker/music/bossa_nova.rb @@ -34,8 +34,4 @@ def song end end end - - include Faker::Deprecator - - deprecate_generator('BossaNova', Music::BossaNova) end diff --git a/test/faker/default/test_twitter.rb b/test/faker/default/test_twitter.rb deleted file mode 100644 index a17127ffc9..0000000000 --- a/test/faker/default/test_twitter.rb +++ /dev/null @@ -1,118 +0,0 @@ -# frozen_string_literal: true - -require_relative '../../test_helper' - -class TestFakerTwitter < Test::Unit::TestCase - def setup - @tester = Faker::Twitter - end - - def test_user - user = @tester.user - - assert_kind_of Hash, user - assert_equal(41, user.keys.count) - assert_kind_of Hash, user[:status] - assert_nil user[:status][:user] - end - - def test_user_with_email - user = @tester.user(include_email: true) - - assert_kind_of Hash, user - assert_equal(42, user.keys.count) - assert_kind_of String, user[:email] - end - - def test_user_without_status - user = @tester.user(include_status: false) - - assert_kind_of Hash, user - assert_equal(40, user.keys.count) - assert_nil user[:status] - end - - def test_status - status = @tester.status - - assert_kind_of Hash, status - assert_equal(25, status.keys.count) - assert_kind_of Hash, status[:entities] - assert_kind_of Hash, status[:user] - assert_nil status[:user][:status] - end - - def test_status_without_user - status = @tester.status(include_user: false) - - assert_kind_of Hash, status - assert_equal(24, status.keys.count) - assert_nil status[:user] - end - - def test_status_with_photo - status = @tester.status(include_photo: true) - - assert_kind_of Hash, status - assert_equal(25, status.keys.count) - assert_kind_of Hash, status[:entities] - assert_equal(1, status[:entities][:media].count) - assert_equal(10, status[:entities][:media].first.keys.count) - end - - def test_screen_name - assert_kind_of String, @tester.screen_name - end -end - -class TestFakerX < Test::Unit::TestCase - def setup - @tester = Faker::X - end - - def test_user - user = @tester.user - - assert_kind_of Hash, user - assert_kind_of Array, user[:data] - assert_kind_of Hash, user[:includes] - assert_kind_of Array, user[:includes][:users] - end - - def test_tweet - tweet = @tester.tweet - - assert_kind_of Hash, tweet - assert_kind_of Array, tweet[:data] - assert_nil tweet[:includes] - end - - def test_tweet_with_include_media - tweet = @tester.tweet(include_media: true) - - assert_kind_of Hash, tweet - assert_kind_of Array, tweet[:data] - assert_kind_of Array, tweet[:includes][:media] - end - - def test_tweet_with_include_user - tweet = @tester.tweet(include_user: true) - - assert_kind_of Hash, tweet - assert_kind_of Array, tweet[:data] - assert_kind_of Array, tweet[:includes][:users] - end - - def test_tweet_with_include_user_and_include_media - tweet = @tester.tweet(include_user: true, include_media: true) - - assert_kind_of Hash, tweet - assert_kind_of Array, tweet[:data] - assert_kind_of Array, tweet[:includes][:users] - assert_kind_of Array, tweet[:includes][:media] - end - - def test_screen_name - assert_kind_of String, @tester.screen_name - end -end diff --git a/test/faker/default/test_x.rb b/test/faker/default/test_x.rb new file mode 100644 index 0000000000..877a137192 --- /dev/null +++ b/test/faker/default/test_x.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require_relative '../../test_helper' + +class TestFakerX < Test::Unit::TestCase + def setup + @tester = Faker::X + end + + def test_user + user = @tester.user + + assert_kind_of Hash, user + assert_kind_of Array, user[:data] + assert_kind_of Hash, user[:includes] + assert_kind_of Array, user[:includes][:users] + end + + def test_tweet + tweet = @tester.tweet + + assert_kind_of Hash, tweet + assert_kind_of Array, tweet[:data] + assert_nil tweet[:includes] + end + + def test_tweet_with_include_media + tweet = @tester.tweet(include_media: true) + + assert_kind_of Hash, tweet + assert_kind_of Array, tweet[:data] + assert_kind_of Array, tweet[:includes][:media] + end + + def test_tweet_with_include_user + tweet = @tester.tweet(include_user: true) + + assert_kind_of Hash, tweet + assert_kind_of Array, tweet[:data] + assert_kind_of Array, tweet[:includes][:users] + end + + def test_tweet_with_include_user_and_include_media + tweet = @tester.tweet(include_user: true, include_media: true) + + assert_kind_of Hash, tweet + assert_kind_of Array, tweet[:data] + assert_kind_of Array, tweet[:includes][:users] + assert_kind_of Array, tweet[:includes][:media] + end + + def test_screen_name + assert_kind_of String, @tester.screen_name + end +end diff --git a/test/faker/music/test_faker_bossa_nova.rb b/test/faker/music/test_faker_bossa_nova.rb index 02cc30f722..59f0ac97cd 100644 --- a/test/faker/music/test_faker_bossa_nova.rb +++ b/test/faker/music/test_faker_bossa_nova.rb @@ -14,17 +14,4 @@ def test_artists def test_songs assert_match(/\w+/, @tester.song) end - - def test_deprecation - assert_deprecated do - Faker::BossaNova.artist - end - - assert_deprecated do - Faker::BossaNova.song - end - - assert_match(/\w+/, Faker::BossaNova.artist) - assert_match(/\w+/, Faker::BossaNova.song) - end end