Full Code of DanielaSfregola/twitter4s for AI

main ea764e6f9e3a cached
590 files
3.7 MB
1.0M tokens
1 requests
Download .txt
Showing preview only (4,070K chars total). Download the full file or copy to clipboard to get everything.
Repository: DanielaSfregola/twitter4s
Branch: main
Commit: ea764e6f9e3a
Files: 590
Total size: 3.7 MB

Directory structure:
gitextract_z8tpb3no/

├── .circleci/
│   └── config.yml
├── .gitignore
├── .mergify.yml
├── .scalafmt.conf
├── LICENSE
├── README.md
├── build.sbt
├── project/
│   ├── build.properties
│   └── plugins.sbt
├── sonatype.sbt
└── src/
    ├── main/
    │   ├── resources/
    │   │   └── reference.conf
    │   └── scala/
    │       └── com/
    │           └── danielasfregola/
    │               └── twitter4s/
    │                   ├── TwitterAuthenticationClient.scala
    │                   ├── TwitterRestClient.scala
    │                   ├── TwitterRestV2Client.scala
    │                   ├── TwitterStreamingClient.scala
    │                   ├── entities/
    │                   │   ├── AccessToken.scala
    │                   │   ├── Accuracy.scala
    │                   │   ├── Area.scala
    │                   │   ├── Banners.scala
    │                   │   ├── Category.scala
    │                   │   ├── Configuration.scala
    │                   │   ├── ConsumerToken.scala
    │                   │   ├── Contributor.scala
    │                   │   ├── Coordinate.scala
    │                   │   ├── Coordinates.scala
    │                   │   ├── DirectMessage.scala
    │                   │   ├── DirectMessageEvent.scala
    │                   │   ├── DirectMessageEventList.scala
    │                   │   ├── Entities.scala
    │                   │   ├── ExtendedTweet.scala
    │                   │   ├── Geo.scala
    │                   │   ├── GeoBoundingBox.scala
    │                   │   ├── GeoCode.scala
    │                   │   ├── GeoPlace.scala
    │                   │   ├── GeoSearch.scala
    │                   │   ├── HashTag.scala
    │                   │   ├── Image.scala
    │                   │   ├── LanguageDetails.scala
    │                   │   ├── Location.scala
    │                   │   ├── LocationTrends.scala
    │                   │   ├── LookupEntities.scala
    │                   │   ├── LookupMapped.scala
    │                   │   ├── LookupRelationship.scala
    │                   │   ├── LookupTweet.scala
    │                   │   ├── LookupUser.scala
    │                   │   ├── Media.scala
    │                   │   ├── MediaDetails.scala
    │                   │   ├── MediaUpload.scala
    │                   │   ├── OEmbedTweet.scala
    │                   │   ├── PrivacyPolicy.scala
    │                   │   ├── ProfileImage.scala
    │                   │   ├── ProfileUpdate.scala
    │                   │   ├── RateLimit.scala
    │                   │   ├── RateLimits.scala
    │                   │   ├── RatedData.scala
    │                   │   ├── Relationship.scala
    │                   │   ├── SavedSearch.scala
    │                   │   ├── Settings.scala
    │                   │   ├── SettingsOptions.scala
    │                   │   ├── Size.scala
    │                   │   ├── StatusMediaDetails.scala
    │                   │   ├── Suggestions.scala
    │                   │   ├── Symbol.scala
    │                   │   ├── TermsOfService.scala
    │                   │   ├── Tweet.scala
    │                   │   ├── TweetId.scala
    │                   │   ├── TweetSearch.scala
    │                   │   ├── TweetUpdate.scala
    │                   │   ├── TwitterList.scala
    │                   │   ├── TwitterListUpdate.scala
    │                   │   ├── TwitterLists.scala
    │                   │   ├── UploadedMedia.scala
    │                   │   ├── Url.scala
    │                   │   ├── User.scala
    │                   │   ├── UserIds.scala
    │                   │   ├── UserMention.scala
    │                   │   ├── UserStringifiedIds.scala
    │                   │   ├── Users.scala
    │                   │   ├── Variant.scala
    │                   │   ├── Video.scala
    │                   │   ├── VideoInfo.scala
    │                   │   ├── Webhook.scala
    │                   │   ├── authentication/
    │                   │   │   ├── OAuthAccessToken.scala
    │                   │   │   └── OAuthRequestToken.scala
    │                   │   ├── enums/
    │                   │   │   ├── AccessType.scala
    │                   │   │   ├── Alignment.scala
    │                   │   │   ├── ContributorType.scala
    │                   │   │   ├── DisconnectionCode.scala
    │                   │   │   ├── EventCode.scala
    │                   │   │   ├── FilterLevel.scala
    │                   │   │   ├── Granularity.scala
    │                   │   │   ├── Hour.scala
    │                   │   │   ├── Language.scala
    │                   │   │   ├── Measure.scala
    │                   │   │   ├── MediaType.scala
    │                   │   │   ├── Mode.scala
    │                   │   │   ├── Resource.scala
    │                   │   │   ├── ResultType.scala
    │                   │   │   ├── TimeZone.scala
    │                   │   │   ├── TweetMode.scala
    │                   │   │   ├── WidgetType.scala
    │                   │   │   └── WithFilter.scala
    │                   │   ├── streaming/
    │                   │   │   ├── StreamingUpdate.scala
    │                   │   │   ├── common/
    │                   │   │   │   ├── DisconnectMessage.scala
    │                   │   │   │   ├── LimitNotice.scala
    │                   │   │   │   ├── LocationDeletionNotice.scala
    │                   │   │   │   ├── StatusDeletionNotice.scala
    │                   │   │   │   ├── StatusWithheldNotice.scala
    │                   │   │   │   ├── UserWithheldNotice.scala
    │                   │   │   │   └── WarningMessage.scala
    │                   │   │   ├── site/
    │                   │   │   │   ├── ControlMessage.scala
    │                   │   │   │   └── UserEnvelop.scala
    │                   │   │   └── user/
    │                   │   │       ├── Event.scala
    │                   │   │       └── FriendsLists.scala
    │                   │   └── v2/
    │                   │       ├── Error.scala
    │                   │       ├── Media.scala
    │                   │       ├── Meta.scala
    │                   │       ├── Place.scala
    │                   │       ├── Poll.scala
    │                   │       ├── Tweet.scala
    │                   │       ├── TweetEntities.scala
    │                   │       ├── TweetIncludes.scala
    │                   │       ├── User.scala
    │                   │       ├── UserEntities.scala
    │                   │       ├── UserIncludes.scala
    │                   │       ├── Withheld.scala
    │                   │       ├── enums/
    │                   │       │   ├── CoordinatesType.scala
    │                   │       │   ├── MediaType.scala
    │                   │       │   ├── ReferencedTweetType.scala
    │                   │       │   ├── TweetReplySetting.scala
    │                   │       │   ├── WithheldScope.scala
    │                   │       │   ├── expansions/
    │                   │       │   │   ├── TweetExpansions.scala
    │                   │       │   │   └── UserExpansions.scala
    │                   │       │   ├── fields/
    │                   │       │   │   ├── MediaFields.scala
    │                   │       │   │   ├── PlaceFields.scala
    │                   │       │   │   ├── PollFields.scala
    │                   │       │   │   ├── TweetFields.scala
    │                   │       │   │   └── UserFields.scala
    │                   │       │   └── rest/
    │                   │       │       └── TimelineExclude.scala
    │                   │       └── responses/
    │                   │           ├── TweetResponse.scala
    │                   │           ├── TweetsResponse.scala
    │                   │           ├── UserResponse.scala
    │                   │           └── UsersResponse.scala
    │                   ├── exceptions/
    │                   │   └── TwitterException.scala
    │                   ├── http/
    │                   │   ├── clients/
    │                   │   │   ├── Client.scala
    │                   │   │   ├── CommonClient.scala
    │                   │   │   ├── OAuthClient.scala
    │                   │   │   ├── authentication/
    │                   │   │   │   ├── AuthenticationClient.scala
    │                   │   │   │   └── oauth/
    │                   │   │   │       ├── TwitterOAuthClient.scala
    │                   │   │   │       └── parameters/
    │                   │   │   │           ├── AccessTokenParameters.scala
    │                   │   │   │           └── RequestTokenParameters.scala
    │                   │   │   ├── rest/
    │                   │   │   │   ├── RestClient.scala
    │                   │   │   │   ├── account/
    │                   │   │   │   │   ├── TwitterAccountClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── CredentialsParameters.scala
    │                   │   │   │   ├── accountactivity/
    │                   │   │   │   │   ├── TwitterAccountActivityClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── WebhooksParameters.scala
    │                   │   │   │   ├── application/
    │                   │   │   │   │   ├── TwitterApplicationClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── RatesParameters.scala
    │                   │   │   │   ├── blocks/
    │                   │   │   │   │   ├── TwitterBlockClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── BlockParameters.scala
    │                   │   │   │   │       ├── BlockedUserIdsParameters.scala
    │                   │   │   │   │       └── BlockedUsersParameters.scala
    │                   │   │   │   ├── directmessages/
    │                   │   │   │   │   ├── TwitterDirectMessageClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── CreateEventParameters.scala
    │                   │   │   │   │       ├── CreateParameters.scala
    │                   │   │   │   │       ├── DestroyParameters.scala
    │                   │   │   │   │       ├── EventListParameters.scala
    │                   │   │   │   │       ├── ReceivedParameters.scala
    │                   │   │   │   │       ├── SentParameters.scala
    │                   │   │   │   │       └── ShowParameters.scala
    │                   │   │   │   ├── favorites/
    │                   │   │   │   │   ├── TwitterFavoriteClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── FavoriteParameters.scala
    │                   │   │   │   │       └── FavoritesParameters.scala
    │                   │   │   │   ├── followers/
    │                   │   │   │   │   ├── TwitterFollowerClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── FollowersParameters.scala
    │                   │   │   │   │       └── FollowingParameters.scala
    │                   │   │   │   ├── friends/
    │                   │   │   │   │   ├── TwitterFriendClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── FriendParameters.scala
    │                   │   │   │   │       └── FriendsParameters.scala
    │                   │   │   │   ├── friendships/
    │                   │   │   │   │   ├── TwitterFriendshipClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── BlockedParameters.scala
    │                   │   │   │   │       ├── FollowParameters.scala
    │                   │   │   │   │       ├── FriendshipParameters.scala
    │                   │   │   │   │       ├── NotificationParameters.scala
    │                   │   │   │   │       ├── RelationshipParameters.scala
    │                   │   │   │   │       ├── RelationshipsParameters.scala
    │                   │   │   │   │       └── UnfollowParameters.scala
    │                   │   │   │   ├── geo/
    │                   │   │   │   │   ├── TwitterGeoClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── GeoSearchParameters.scala
    │                   │   │   │   │       └── ReverseGeoCodeParameters.scala
    │                   │   │   │   ├── help/
    │                   │   │   │   │   └── TwitterHelpClient.scala
    │                   │   │   │   ├── lists/
    │                   │   │   │   │   ├── TwitterListClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── AddMemberParameters.scala
    │                   │   │   │   │       ├── CreateListParameters.scala
    │                   │   │   │   │       ├── ListMembersParameters.scala
    │                   │   │   │   │       ├── ListParameters.scala
    │                   │   │   │   │       ├── ListTimelineParameters.scala
    │                   │   │   │   │       ├── ListsParameters.scala
    │                   │   │   │   │       ├── MemberParameters.scala
    │                   │   │   │   │       ├── MembersParameters.scala
    │                   │   │   │   │       ├── MembershipsParameters.scala
    │                   │   │   │   │       ├── OwnershipsParameters.scala
    │                   │   │   │   │       ├── RemoveMemberParameters.scala
    │                   │   │   │   │       ├── RemoveMembersParameters.scala
    │                   │   │   │   │       ├── SubscribersParameters.scala
    │                   │   │   │   │       ├── SubscriptionsParameters.scala
    │                   │   │   │   │       └── UpdateListParameters.scala
    │                   │   │   │   ├── media/
    │                   │   │   │   │   ├── TwitterMediaClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── MediaAppendParameters.scala
    │                   │   │   │   │       ├── MediaFinalizeParameters.scala
    │                   │   │   │   │       ├── MediaInitParameters.scala
    │                   │   │   │   │       ├── MediaMetadataCreation.scala
    │                   │   │   │   │       └── MediaStatusParameters.scala
    │                   │   │   │   ├── mutes/
    │                   │   │   │   │   ├── TwitterMuteClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── MuteParameters.scala
    │                   │   │   │   │       ├── MutedUsersIdsParameters.scala
    │                   │   │   │   │       └── MutedUsersParameters.scala
    │                   │   │   │   ├── savedsearches/
    │                   │   │   │   │   ├── TwitterSavedSearchClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── SaveSearchParameters.scala
    │                   │   │   │   ├── search/
    │                   │   │   │   │   ├── TwitterSearchClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── TweetSearchParameters.scala
    │                   │   │   │   ├── statuses/
    │                   │   │   │   │   ├── TwitterStatusClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── HomeTimelineParameters.scala
    │                   │   │   │   │       ├── LookupParameters.scala
    │                   │   │   │   │       ├── MentionsParameters.scala
    │                   │   │   │   │       ├── OEmbedParameters.scala
    │                   │   │   │   │       ├── PostParameters.scala
    │                   │   │   │   │       ├── RetweetersIdsParameters.scala
    │                   │   │   │   │       ├── RetweetsOfMeParameters.scala
    │                   │   │   │   │       ├── RetweetsParameters.scala
    │                   │   │   │   │       ├── ShowParameters.scala
    │                   │   │   │   │       └── UserTimelineParameters.scala
    │                   │   │   │   ├── suggestions/
    │                   │   │   │   │   ├── TwitterSuggestionClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── SuggestionsParameters.scala
    │                   │   │   │   ├── trends/
    │                   │   │   │   │   ├── TwitterTrendClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── LocationParameters.scala
    │                   │   │   │   │       └── TrendsParameters.scala
    │                   │   │   │   ├── users/
    │                   │   │   │   │   ├── TwitterUserClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── BannersParameters.scala
    │                   │   │   │   │       ├── UserParameters.scala
    │                   │   │   │   │       ├── UserSearchParameters.scala
    │                   │   │   │   │       └── UsersParameters.scala
    │                   │   │   │   └── v2/
    │                   │   │   │       ├── tweets/
    │                   │   │   │       │   ├── TwitterSearchTweetsClient.scala
    │                   │   │   │       │   ├── TwitterTimelinesClient.scala
    │                   │   │   │       │   ├── TwitterTweetLookupClient.scala
    │                   │   │   │       │   └── paramaters/
    │                   │   │   │       │       ├── SearchTweetsParameters.scala
    │                   │   │   │       │       ├── TimelineMentionsParameters.scala
    │                   │   │   │       │       ├── TimelineTweetsParameters.scala
    │                   │   │   │       │       ├── TweetParameters.scala
    │                   │   │   │       │       └── TweetsParameters.scala
    │                   │   │   │       └── users/
    │                   │   │   │           ├── TwitterUserLookupClient.scala
    │                   │   │   │           └── parameters/
    │                   │   │   │               ├── UserByUsernameParameters.scala
    │                   │   │   │               ├── UserParameters.scala
    │                   │   │   │               ├── UsersByUsernamesParameters.scala
    │                   │   │   │               └── UsersParameters.scala
    │                   │   │   └── streaming/
    │                   │   │       ├── ErrorHandler.scala
    │                   │   │       ├── StreamingClient.scala
    │                   │   │       ├── TwitterStream.scala
    │                   │   │       ├── sites/
    │                   │   │       │   ├── TwitterSiteClient.scala
    │                   │   │       │   └── parameters/
    │                   │   │       │       └── SiteParameters.scala
    │                   │   │       ├── statuses/
    │                   │   │       │   ├── TwitterStatusClient.scala
    │                   │   │       │   └── parameters/
    │                   │   │       │       ├── StatusFilters.scala
    │                   │   │       │       ├── StatusFirehoseParameters.scala
    │                   │   │       │       └── StatusSampleParameters.scala
    │                   │   │       └── users/
    │                   │   │           ├── TwitterUserClient.scala
    │                   │   │           └── parameters/
    │                   │   │               └── UserParameters.scala
    │                   │   ├── marshalling/
    │                   │   │   ├── BodyEncoder.scala
    │                   │   │   └── Parameters.scala
    │                   │   ├── oauth/
    │                   │   │   └── OAuth1Provider.scala
    │                   │   ├── package.scala
    │                   │   └── serializers/
    │                   │       ├── CustomFormats.scala
    │                   │       ├── EnumFormats.scala
    │                   │       ├── FormSupport.scala
    │                   │       ├── FormatsComposer.scala
    │                   │       ├── JsonSupport.scala
    │                   │       └── StreamingMessageFormats.scala
    │                   ├── processors/
    │                   │   └── TwitterProcessor.scala
    │                   ├── providers/
    │                   │   ├── ExecutionContextProvider.scala
    │                   │   └── TokenProvider.scala
    │                   └── util/
    │                       ├── Configurations.scala
    │                       ├── Encoder.scala
    │                       ├── MediaReader.scala
    │                       ├── SystemShutdown.scala
    │                       └── UriHelpers.scala
    └── test/
        ├── resources/
        │   ├── fixtures/
        │   │   ├── rest/
        │   │   │   ├── account/
        │   │   │   │   ├── settings.json
        │   │   │   │   └── user.json
        │   │   │   ├── accountactivity/
        │   │   │   │   └── webhook.json
        │   │   │   ├── application/
        │   │   │   │   └── rate_limits.json
        │   │   │   ├── blocks/
        │   │   │   │   ├── blocked_users.json
        │   │   │   │   ├── ids.json
        │   │   │   │   ├── stringified_ids.json
        │   │   │   │   └── user.json
        │   │   │   ├── directmessages/
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── event.json
        │   │   │   │   ├── list.json
        │   │   │   │   ├── new.json
        │   │   │   │   ├── received.json
        │   │   │   │   ├── sent.json
        │   │   │   │   └── show.json
        │   │   │   ├── favorites/
        │   │   │   │   ├── favorite.json
        │   │   │   │   ├── favorites.json
        │   │   │   │   └── unfavorite.json
        │   │   │   ├── followers/
        │   │   │   │   ├── followers.json
        │   │   │   │   ├── followers_ids.json
        │   │   │   │   └── followers_ids_stringified.json
        │   │   │   ├── friends/
        │   │   │   │   ├── friends_ids.json
        │   │   │   │   ├── friends_ids_stringified.json
        │   │   │   │   └── users.json
        │   │   │   ├── friendships/
        │   │   │   │   ├── blocked_users.json
        │   │   │   │   ├── blocked_users_stringified.json
        │   │   │   │   ├── follow.json
        │   │   │   │   ├── incoming_friendships_ids.json
        │   │   │   │   ├── incoming_friendships_ids_stringified.json
        │   │   │   │   ├── outgoing_friendships_ids.json
        │   │   │   │   ├── outgoing_friendships_ids_stringified.json
        │   │   │   │   ├── relationship.json
        │   │   │   │   ├── relationships.json
        │   │   │   │   ├── unfollow.json
        │   │   │   │   └── update.json
        │   │   │   ├── geo/
        │   │   │   │   ├── advanced_search.json
        │   │   │   │   ├── geo_place.json
        │   │   │   │   ├── reverse_geocode.json
        │   │   │   │   └── search.json
        │   │   │   ├── help/
        │   │   │   │   ├── configuration.json
        │   │   │   │   ├── languages.json
        │   │   │   │   ├── privacy.json
        │   │   │   │   └── tos.json
        │   │   │   ├── lists/
        │   │   │   │   ├── create.json
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── lists.json
        │   │   │   │   ├── member.json
        │   │   │   │   ├── members.json
        │   │   │   │   ├── memberships.json
        │   │   │   │   ├── ownerships.json
        │   │   │   │   ├── show.json
        │   │   │   │   ├── subscribers.json
        │   │   │   │   ├── subscriptions.json
        │   │   │   │   └── timeline.json
        │   │   │   ├── media/
        │   │   │   │   ├── img_media_details.json
        │   │   │   │   └── media_details.json
        │   │   │   ├── mutes/
        │   │   │   │   ├── muted_users_ids.json
        │   │   │   │   ├── user.json
        │   │   │   │   └── users.json
        │   │   │   ├── savedsearches/
        │   │   │   │   ├── create.json
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── list.json
        │   │   │   │   └── show.json
        │   │   │   ├── search/
        │   │   │   │   └── tweets.json
        │   │   │   ├── statuses/
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── direct_message.json
        │   │   │   │   ├── home_timeline.json
        │   │   │   │   ├── lookup.json
        │   │   │   │   ├── lookup_extended.json
        │   │   │   │   ├── lookup_mapped.json
        │   │   │   │   ├── lookup_mapped_extended.json
        │   │   │   │   ├── mentions_timeline.json
        │   │   │   │   ├── oembed.json
        │   │   │   │   ├── retweet.json
        │   │   │   │   ├── retweeters_ids.json
        │   │   │   │   ├── retweeters_ids_stringified.json
        │   │   │   │   ├── retweets.json
        │   │   │   │   ├── retweets_of_me.json
        │   │   │   │   ├── show.json
        │   │   │   │   ├── update.json
        │   │   │   │   └── user_timeline.json
        │   │   │   ├── suggestions/
        │   │   │   │   ├── categories.json
        │   │   │   │   ├── slug_suggestions.json
        │   │   │   │   └── suggestions_members.json
        │   │   │   ├── trends/
        │   │   │   │   ├── available_locations.json
        │   │   │   │   ├── closest_locations.json
        │   │   │   │   └── trends.json
        │   │   │   └── users/
        │   │   │       ├── profile_banner.json
        │   │   │       ├── user.json
        │   │   │       └── users.json
        │   │   └── streaming/
        │   │       ├── common/
        │   │       │   ├── disconnect_messages.json
        │   │       │   ├── limit_notices.json
        │   │       │   ├── location_deletion_notices.json
        │   │       │   ├── status_deletion_notices.json
        │   │       │   ├── status_withheld_notices.json
        │   │       │   ├── tweets.json
        │   │       │   ├── user_withheld_notices.json
        │   │       │   └── warning_messages.json
        │   │       ├── site/
        │   │       │   ├── control_messages.json
        │   │       │   ├── user_envelop_direct_message.json
        │   │       │   ├── user_envelop_direct_message_stringified.json
        │   │       │   ├── user_envelop_simple_event.json
        │   │       │   ├── user_envelop_simple_event_stringified.json
        │   │       │   ├── user_envelop_tweet.json
        │   │       │   ├── user_envelop_tweet_event.json
        │   │       │   ├── user_envelop_tweet_event_stringified.json
        │   │       │   ├── user_envelop_tweet_stringified.json
        │   │       │   ├── user_envelop_twitter_list_event.json
        │   │       │   ├── user_envelop_twitter_list_event_stringified.json
        │   │       │   ├── user_envelop_warning_message.json
        │   │       │   ├── user_envelop_warning_message_stringified.json
        │   │       │   ├── user_envelops_friends_list.json
        │   │       │   └── user_envelops_friends_list_stringified.json
        │   │       └── user/
        │   │           ├── direct_messages.json
        │   │           ├── events.json
        │   │           ├── friends_lists.json
        │   │           └── friends_lists_stringified.json
        │   └── twitter/
        │       ├── authentication/
        │       │   ├── access_token.txt
        │       │   └── request_token.txt
        │       ├── rest/
        │       │   ├── account/
        │       │   │   ├── settings.json
        │       │   │   └── user.json
        │       │   ├── accountactivity/
        │       │   │   └── webhook.json
        │       │   ├── application/
        │       │   │   └── rate_limits.json
        │       │   ├── blocks/
        │       │   │   ├── blocked_users.json
        │       │   │   ├── ids.json
        │       │   │   ├── stringified_ids.json
        │       │   │   └── user.json
        │       │   ├── directmessages/
        │       │   │   ├── destroy.json
        │       │   │   ├── event.json
        │       │   │   ├── list.json
        │       │   │   ├── new.json
        │       │   │   ├── received.json
        │       │   │   ├── sent.json
        │       │   │   └── show.json
        │       │   ├── favorites/
        │       │   │   ├── favorite.json
        │       │   │   ├── favorites.json
        │       │   │   └── unfavorite.json
        │       │   ├── followers/
        │       │   │   ├── followers.json
        │       │   │   ├── followers_ids.json
        │       │   │   └── followers_ids_stringified.json
        │       │   ├── friends/
        │       │   │   ├── friends_ids.json
        │       │   │   ├── friends_ids_stringified.json
        │       │   │   └── users.json
        │       │   ├── friendships/
        │       │   │   ├── blocked_users.json
        │       │   │   ├── blocked_users_stringified.json
        │       │   │   ├── follow.json
        │       │   │   ├── incoming_friendships_ids.json
        │       │   │   ├── incoming_friendships_ids_stringified.json
        │       │   │   ├── outgoing_friendships_ids.json
        │       │   │   ├── outgoing_friendships_ids_stringified.json
        │       │   │   ├── relationship.json
        │       │   │   ├── relationships.json
        │       │   │   ├── unfollow.json
        │       │   │   └── update.json
        │       │   ├── geo/
        │       │   │   ├── advanced_search.json
        │       │   │   ├── geo_place.json
        │       │   │   ├── reverse_geocode.json
        │       │   │   └── search.json
        │       │   ├── help/
        │       │   │   ├── configuration.json
        │       │   │   ├── languages.json
        │       │   │   ├── privacy.json
        │       │   │   └── tos.json
        │       │   ├── lists/
        │       │   │   ├── create.json
        │       │   │   ├── destroy.json
        │       │   │   ├── lists.json
        │       │   │   ├── member.json
        │       │   │   ├── members.json
        │       │   │   ├── memberships.json
        │       │   │   ├── ownerships.json
        │       │   │   ├── show.json
        │       │   │   ├── subscribers.json
        │       │   │   ├── subscriptions.json
        │       │   │   └── timeline.json
        │       │   ├── media/
        │       │   │   └── media_details.json
        │       │   ├── mutes/
        │       │   │   ├── muted_users_ids.json
        │       │   │   ├── user.json
        │       │   │   └── users.json
        │       │   ├── savedsearches/
        │       │   │   ├── create.json
        │       │   │   ├── destroy.json
        │       │   │   ├── list.json
        │       │   │   └── show.json
        │       │   ├── search/
        │       │   │   └── tweets.json
        │       │   ├── statuses/
        │       │   │   ├── destroy.json
        │       │   │   ├── direct_message.json
        │       │   │   ├── home_timeline.json
        │       │   │   ├── lookup.json
        │       │   │   ├── lookup_extended.json
        │       │   │   ├── lookup_mapped.json
        │       │   │   ├── lookup_mapped_extended.json
        │       │   │   ├── mentions_timeline.json
        │       │   │   ├── oembed.json
        │       │   │   ├── retweet.json
        │       │   │   ├── retweeters_ids.json
        │       │   │   ├── retweeters_ids_stringified.json
        │       │   │   ├── retweets.json
        │       │   │   ├── retweets_of_me.json
        │       │   │   ├── show.json
        │       │   │   ├── update.json
        │       │   │   └── user_timeline.json
        │       │   ├── suggestions/
        │       │   │   ├── categories.json
        │       │   │   ├── slug_suggestions.json
        │       │   │   └── suggestions_members.json
        │       │   ├── trends/
        │       │   │   ├── available_locations.json
        │       │   │   ├── closest_locations.json
        │       │   │   └── trends.json
        │       │   ├── users/
        │       │   │   ├── empty-user-profile-url.json
        │       │   │   ├── profile_banner.json
        │       │   │   ├── user.json
        │       │   │   └── users.json
        │       │   └── v2/
        │       │       ├── tweets/
        │       │       │   ├── tweet.json
        │       │       │   └── tweets.json
        │       │       └── users/
        │       │           ├── user.json
        │       │           └── users.json
        │       └── streaming/
        │           ├── common/
        │           │   ├── disconnect_messages.json
        │           │   ├── limit_notices.json
        │           │   ├── location_deletion_notices.json
        │           │   ├── status_deletion_notices.json
        │           │   ├── status_withheld_notices.json
        │           │   ├── tweets.json
        │           │   ├── user_withheld_notices.json
        │           │   └── warning_messages.json
        │           ├── site/
        │           │   ├── control_messages.json
        │           │   ├── user_envelop_direct_message.json
        │           │   ├── user_envelop_direct_message_stringified.json
        │           │   ├── user_envelop_simple_event.json
        │           │   ├── user_envelop_simple_event_stringified.json
        │           │   ├── user_envelop_tweet.json
        │           │   ├── user_envelop_tweet_event.json
        │           │   ├── user_envelop_tweet_event_stringified.json
        │           │   ├── user_envelop_tweet_stringified.json
        │           │   ├── user_envelop_twitter_list_event.json
        │           │   ├── user_envelop_twitter_list_event_stringified.json
        │           │   ├── user_envelop_warning_message.json
        │           │   ├── user_envelop_warning_message_stringified.json
        │           │   ├── user_envelops_friends_list.json
        │           │   └── user_envelops_friends_list_stringified.json
        │           └── user/
        │               ├── direct_messages.json
        │               ├── events.json
        │               ├── friends_lists.json
        │               └── friends_lists_stringified.json
        └── scala/
            └── com/
                └── danielasfregola/
                    └── twitter4s/
                        ├── entities/
                        │   ├── DeserializationRoundtripSpec.scala
                        │   ├── ProfileImageSpec.scala
                        │   ├── RateLimitSpec.scala
                        │   └── SerializationRoundtripSpec.scala
                        ├── helpers/
                        │   ├── AwaitableFuture.scala
                        │   ├── ClientSpec.scala
                        │   ├── FixturesSupport.scala
                        │   ├── JsonDiffSupport.scala
                        │   ├── RequestDSL.scala
                        │   ├── Spec.scala
                        │   ├── TestActorSystem.scala
                        │   └── TestExecutionContext.scala
                        ├── http/
                        │   ├── clients/
                        │   │   ├── authentication/
                        │   │   │   └── oauth/
                        │   │   │       └── TwitterOAuthClientSpec.scala
                        │   │   ├── rest/
                        │   │   │   ├── RestClientSpec.scala
                        │   │   │   ├── account/
                        │   │   │   │   └── TwitterAccountClientSpec.scala
                        │   │   │   ├── accountactivity/
                        │   │   │   │   └── TwitterAccountActivityClientSpec.scala
                        │   │   │   ├── application/
                        │   │   │   │   └── TwitterApplicationClientSpec.scala
                        │   │   │   ├── blocks/
                        │   │   │   │   └── TwitterBlockClientSpec.scala
                        │   │   │   ├── directmessages/
                        │   │   │   │   └── TwitterDirectMessageClientSpec.scala
                        │   │   │   ├── favorites/
                        │   │   │   │   └── TwitterFavoriteClientSpec.scala
                        │   │   │   ├── followers/
                        │   │   │   │   └── TwitterFollowerClientSpec.scala
                        │   │   │   ├── friends/
                        │   │   │   │   └── TwitterFriendClientSpec.scala
                        │   │   │   ├── friendships/
                        │   │   │   │   └── TwitterFriendshipClientSpec.scala
                        │   │   │   ├── geo/
                        │   │   │   │   └── TwitterGeoClientSpec.scala
                        │   │   │   ├── help/
                        │   │   │   │   └── TwitterHelpClientSpec.scala
                        │   │   │   ├── lists/
                        │   │   │   │   └── TwitterListClientSpec.scala
                        │   │   │   ├── media/
                        │   │   │   │   └── TwitterMediaClientSpec.scala
                        │   │   │   ├── mutes/
                        │   │   │   │   └── TwitterMuteClientSpec.scala
                        │   │   │   ├── savedsearches/
                        │   │   │   │   └── TwitterSavedSearchClientSpec.scala
                        │   │   │   ├── search/
                        │   │   │   │   └── TwitterSearchClientSpec.scala
                        │   │   │   ├── statuses/
                        │   │   │   │   ├── TwitterStatusClientSpec.scala
                        │   │   │   │   └── parameters/
                        │   │   │   │       ├── HomeTimelineParametersSpec.scala
                        │   │   │   │       ├── LookupParametersSpec.scala
                        │   │   │   │       ├── MentionsParametersSpec.scala
                        │   │   │   │       ├── OEmbedParametersSpec.scala
                        │   │   │   │       ├── PostParametersSpec.scala
                        │   │   │   │       ├── RetweetersIdsParametersSpec.scala
                        │   │   │   │       ├── RetweetsOfMeParametersSpec.scala
                        │   │   │   │       ├── RetweetsParametersSpec.scala
                        │   │   │   │       ├── ShowParametersSpec.scala
                        │   │   │   │       └── UserTimelineParametersSpec.scala
                        │   │   │   ├── suggestions/
                        │   │   │   │   └── TwitterSuggestionClientSpec.scala
                        │   │   │   ├── trends/
                        │   │   │   │   └── TwitterTrendClientSpec.scala
                        │   │   │   ├── users/
                        │   │   │   │   └── TwitterUserClientSpec.scala
                        │   │   │   └── v2/
                        │   │   │       ├── tweets/
                        │   │   │       │   ├── TwitterSearchTweetsClientSpec.scala
                        │   │   │       │   ├── TwitterTimelinesClientSpec.scala
                        │   │   │       │   ├── TwitterTweetLookupClientSpec.scala
                        │   │   │       │   └── deserialization/
                        │   │   │       │       ├── TweetsDeserializationSpec.scala
                        │   │   │       │       └── fixtures/
                        │   │   │       │           ├── TweetResponseFixture.scala
                        │   │   │       │           └── TweetsResponseFixture.scala
                        │   │   │       ├── users/
                        │   │   │       │   ├── TwitterUserLookupClientSpec.scala
                        │   │   │       │   └── deserialization/
                        │   │   │       │       ├── UsersResponseDeserializationSpec.scala
                        │   │   │       │       └── fixtures/
                        │   │   │       │           ├── UserResponseFixture.scala
                        │   │   │       │           └── UsersResponseFixture.scala
                        │   │   │       └── utils/
                        │   │   │           └── V2SpecQueryHelper.scala
                        │   │   └── streaming/
                        │   │       ├── StreamingClientSpec.scala
                        │   │       ├── sites/
                        │   │       │   └── TwitterSiteClientSpec.scala
                        │   │       ├── statuses/
                        │   │       │   └── TwitterStatusClientSpec.scala
                        │   │       └── users/
                        │   │           └── TwitterUserClientSpec.scala
                        │   ├── marshalling/
                        │   │   └── BodyEncoderSpec.scala
                        │   ├── oauth/
                        │   │   └── OAuth1ProviderSpec.scala
                        │   ├── packageHttpSpec.scala
                        │   └── serializers/
                        │       └── FormSupportSpec.scala
                        └── util/
                            ├── ConfigurationDetectorSpec.scala
                            ├── EncoderSpec.scala
                            └── UriHelpersSpec.scala

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
# Scala CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/sample-config/ for more details
#
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/openjdk:15-jdk-buster

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/postgres:9.4

    working_directory: ~/repo

    environment:
      # Customize the JVM maximum heap limit
      JVM_OPTS: -Xmx3200m
      TERM: dumb

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "build.sbt" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-

      - run:
          name:
            Check Formatting
          command:
            cat /dev/null | sbt scalafmt::test test:scalafmt::test sbt:scalafmt::test
      - run:
          name:
            Compile
          command:
            cat /dev/null | sbt test:compile

      - save_cache:
          paths:
            - ~/.m2
          key: v1-dependencies--{{ checksum "build.sbt" }}

      # run tests!
      - run:
          name:
            Test
          command:
            cat /dev/null | sbt test:test    


================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### SBT template
# Simple Build Tool
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control

target/
lib_managed/
src_managed/
project/boot/
.history
.cache


### Scala template
*.class
*.log

# sbt specific
.cache
.history
.lib/
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/

# Scala-IDE specific
.scala_dependencies
.worksheet
.idea

.bsp



================================================
FILE: .mergify.yml
================================================
pull_request_rules:
  - name: automatically merge scala-steward's PRs
    conditions:
      - author=scala-steward
      - "status-success=ci/circleci: validate"
    actions:
      merge:
        method: merge
      comment:
        message: "Thank you Scala Steward! :heart:"


================================================
FILE: .scalafmt.conf
================================================
maxColumn = 120


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.



================================================
FILE: README.md
================================================
twitter4s
=========

[![twitter4s Scala version support](https://index.scala-lang.org/danielasfregola/twitter4s/twitter4s/latest-by-scala-version.svg)](https://index.scala-lang.org/danielasfregola/twitter4s/twitter4s)
[![CircleCI](https://circleci.com/gh/DanielaSfregola/twitter4s/tree/main.svg?style=svg)](https://circleci.com/gh/DanielaSfregola/twitter4s/tree/main) [![codecov.io](http://codecov.io/github/DanielaSfregola/twitter4s/coverage.svg?branch=master)](http://codecov.io/github/DanielaSfregola/twitter4s?branch=master) [![License](http://img.shields.io/:license-Apache%202-red.svg)](http://www.apache.org/licenses/LICENSE-2.0.txt)  [![Scala Steward badge](https://img.shields.io/badge/Scala_Steward-helping-brightgreen.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAMAAAARSr4IAAAAVFBMVEUAAACHjojlOy5NWlrKzcYRKjGFjIbp293YycuLa3pYY2LSqql4f3pCUFTgSjNodYRmcXUsPD/NTTbjRS+2jomhgnzNc223cGvZS0HaSD0XLjbaSjElhIr+AAAAAXRSTlMAQObYZgAAAHlJREFUCNdNyosOwyAIhWHAQS1Vt7a77/3fcxxdmv0xwmckutAR1nkm4ggbyEcg/wWmlGLDAA3oL50xi6fk5ffZ3E2E3QfZDCcCN2YtbEWZt+Drc6u6rlqv7Uk0LdKqqr5rk2UCRXOk0vmQKGfc94nOJyQjouF9H/wCc9gECEYfONoAAAAASUVORK5CYII=)](https://scala-steward.org) [![Chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/twitter4s/Lobby)

An asynchronous non-blocking Scala Twitter Client, implemented using Akka-Http and json4s.

Prerequisites
-------------
 * JDK 8
 * Scala 2.12+

- Go to https://developer.twitter.com/, login with your twitter account and register your application to get a consumer key and a consumer secret.
- Once the app has been created, generate a access key and access secret with the desired permission level.

NOTE: v1.1 endpoints are unaccessible for new users. More information at https://twittercommunity.com/t/ushering-in-a-new-era-for-the-twitter-developer-platform-with-the-twitter-api-v2/162087

Rate Limits
-----------
Be aware that the Twitter REST Api has rate limits specific to each endpoint. For more information, please have a look at the Twitter developers website [here](https://developer.twitter.com/en/docs/basics/rate-limiting).

For all the endpoints that are affected these limitations, information on the current rates together with the requested data is provided by the [RatedData](http://danielasfregola.github.io/twitter4s/5.5/api/com/danielasfregola/twitter4s/entities/RatedData.html) case class.

Setup
-----
If you don't have it already, make sure you add the Maven Central as resolver in your SBT settings:

```scala
resolvers += Resolver.sonatypeRepo("releases")
```

Also, you need to include the library as your dependency:
```scala
libraryDependencies += "com.danielasfregola" %% "twitter4s" % "8.0"
```

Giter8
------

If you are starting from scratch, you can use [`twitter4s.g8`](https://github.com/DanielaSfregola/twitter4s.g8) template to start your project. This template contains examples for both REST and Streaming client.

```bash
> sbt new DanielaSfregola/twitter4s.g8
```

Usage
-----

Add your consumer and access token as either environment variables or as part of your configuration.
Twitter4s will look for the following environment variables:
```bash
export TWITTER_CONSUMER_TOKEN_KEY='my-consumer-key'
export TWITTER_CONSUMER_TOKEN_SECRET='my-consumer-secret'
export TWITTER_ACCESS_TOKEN_KEY='my-access-key'
export TWITTER_ACCESS_TOKEN_SECRET='my-access-secret'
```
You can also add them to your configuration file, usually called `application.conf`:
```scala
twitter {
  consumer {
    key = "my-consumer-key"
    secret = "my-consumer-secret"
  }
  access {
    key = "my-access-key"
    secret = "my-access-secret"
  }
}
```
These configurations will be automatically loaded when creating a twitter client, so all you have to do is to initialize your clients as following:
```scala
import com.danielasfregola.twitter4s.TwitterRestClient
import com.danielasfregola.twitter4s.TwitterStreamingClient

val restClient = TwitterRestClient()
val streamingClient = TwitterStreamingClient()
```

Alternatively, you can also specify your tokens directly when creating the client:
```scala
import com.danielasfregola.twitter4s.TwitterRestClient
import com.danielasfregola.twitter4s.TwitterStreamingClient
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}

val consumerToken = ConsumerToken(key = "my-consumer-key", secret = "my-consumer-secret")
val accessToken = AccessToken(key = "my-access-key", secret = "my-access-secret")  

val restClient = TwitterRestClient(consumerToken, accessToken)
val streamingClient = TwitterStreamingClient(consumerToken, accessToken)
```

Once you have instantiated your client you are ready to use it! :smile:

Twitter Streaming Client
-----------------------
[TwitterStreamingClient](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterStreamingClient) is the client to support stream connections offered by the Twitter Streaming Api.

You can initialize the client as follows:
```scala
import com.danielasfregola.twitter4s.TwitterStreamingClient

val client = TwitterStreamingClient()
```

There are three types of streams, each with different streaming message types: [Public Stream](https://github.com/DanielaSfregola/twitter4s#public-stream), [User Stream](https://github.com/DanielaSfregola/twitter4s#user-stream), [Site Stream](https://github.com/DanielaSfregola/twitter4s#site-stream).

Each stream requires a partial function that indicates how to process messages. If a message type is not specified, it is ignored. See the section of each stream for more information.

For example, you can create the following function to print the text of a tweet:
```scala
import com.danielasfregola.twitter4s.entities.Tweet
import com.danielasfregola.twitter4s.entities.streaming.StreamingMessage

def printTweetText: PartialFunction[StreamingMessage, Unit] = {
    case tweet: Tweet => println(tweet.text)
}
```
All  you need to do is attach your processing function to the stream:
```scala
client.sampleStatuses(stall_warnings = true)(printTweetText)
```
...and you are done, happy days! :dancers:

Have a look at [TwitterProcessor](https://github.com/DanielaSfregola/twitter4s/blob/master/src/main/scala/com/danielasfregola/twitter4s/processors/TwitterProcessor.scala) for some predefined processing functions.

### Close or Replace a Stream
Each stream function returns a `Future[TwitterStream]`.
`TwitterStream` represents the stream received by Twitter and it can be used to close or replace the current stream.

For example, consider the following snippet:

```scala
  // TERRIBLE CODE! NEVER BLOCK! Code for demo purposes only!
  def simulateNextActionAfterMillis(millis: Long): Future[Unit] = Future{ Thread.sleep(millis); println() }

  for {
    streamA <- client.sampleStatuses(languages = Seq(Language.English)){ case t: Tweet => print("o")}
    _ <- simulateNextActionAfterMillis(10000)
    streamB <- streamA.sampleStatuses(languages = Seq(Language.Spanish)){ case t: Tweet => print("+")}
    _ <- simulateNextActionAfterMillis(10000)
  } yield streamB.close()
```

The above code can output something similar to the following:

 ```bash
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 +++++++++++++++
 ```
In this example, we can see that there are more English tweets than Spanish tweets.

### Public Stream
Have a look at the complete scaladoc for the [Public Stream Client](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/streaming/statuses/TwitterStatusClient).

#### Available streams
- filterStatusesFilter
- sampleStatusesSample
- firehoseStatuses

#### CommonStreamingMessage types:
- [Tweet](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/Tweet)
- [DisconnectMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/DisconnectMessage)
- [LimitNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/LimitNotice)
- [LocationDeletionNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/LocationDeletionNotice)
- [StatusDeletionNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/StatusDeletionNotice)
- [StatusWithheldNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/StatusWithheldNotice)
- [UserWithheldNotice](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/UserWithheldNotice)
- [WarningMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/common/WarningMessage)

### User Stream
Have a look at the complete scaladoc for the [User Stream Client](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/streaming/users/TwitterUserClient).

#### Available streams
- userEvents

#### UserStreamingMessage types:
- All the instances of `CommonStreamingMessage` -- see the [Public Stream Section](https://github.com/DanielaSfregola/twitter4s#public-stream)
- [FriendsLists](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/FriendsLists) and [FriendsListsStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/FriendsListsStringified)
- [SimpleEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/SimpleEvent)
- [TweetEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/TweetEvent)
- [TwitterListEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/user/TwitterListEvent)

### Site Stream
Have a look at the complete scaladoc for the [Site Stream Client](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/streaming/sites/TwitterSiteClient).

#### Available streams
- siteEvents

#### SiteStreamingMessage types:
- All the `CommonStreamingMessage`s -- see the [Public Stream Section](https://github.com/DanielaSfregola/twitter4s#public-stream)
- [ControlMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/ControlMessage)
- [UserEnvelopTweet](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweet) and [UserEnvelopTweetStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweetStringified)
- [UserEnvelopDirectMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopDirectMessage) and [UserEnvelopDirectMessageStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopDirectMessageStringified)
- [UserEnvelopSimpleEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopSimpleEvent) and [UserEnvelopSimpleEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopSimpleEventStringified)
- [UserEnvelopTweetEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweetEvent) and [UserEnvelopTweetEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTweetEventStringified)
- [UserEnvelopTwitterListEvent](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTwitterListEvent) and [UserEnvelopTwitterListEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopTwitterListEventStringified)
- [UserEnvelopFriendsLists](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopFriendsLists) and [UserEnvelopFriendsListsEventStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopFriendsListsStringified)
- [UserEnvelopWarningMessage](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopWarningMessage) and [UserEnvelopWarningMessageStringified](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelopWarningMessageStringified)

### Documentation
The complete scaladoc with all the available streams for the `TwitterStreamingClient` can be found [here](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterStreamingClient).


Twitter REST Client
-------------------

[TwitterRestClient](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterRestClient) is the client for the REST endpoints offered by the Twitter REST Api.

Once you have configured your consumer and access token, you can initialize an instance of `TwitterRestClient` as follows:
```scala
import com.danielasfregola.twitter4s.TwitterRestClient

val client = TwitterRestClient()
```

For example, you can get the home timeline of the authenticated user:
```scala
client.homeTimeline()
```

or you can get the timeline of a specific user:
```scala
client.userTimelineForUser("DanielaSfregola")
```

You can also update your tweet status:
```scala
client.tweet(status = "Test")
```
Asynchronous upload of images or short videos is also supported:
```scala
for {
  upload <- client.uploadMediaFromPath("/path/to/file.png")
  tweet <- client.tweet(status = "Test with media", media_ids = Seq(upload.media_id))
} yield tweet
```

### Documentation
The complete scaladoc with all the available functionalities for the `TwitterRestClient` can be found [here](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterRestClient).

[TwitterRestClient](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/TwitterRestClient) is composed by several traits. A list of the supported resources is following:
- [account](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/account/TwitterAccountClient)
- [application](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/application/TwitterApplicationClient)
- [blocks](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/blocks/TwitterBlockClient)
- [direct_messages](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/directmessages/TwitterDirectMessageClient)
- [favorites](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/favorites/TwitterFavoriteClient)
- [followers](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/followers/TwitterFollowerClient)
- [friends](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/friends/TwitterFriendClient)
- [friendships](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/friendships/TwitterFriendshipClient)
- [geo](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/geo/TwitterGeoClient)
- [help](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/help/TwitterHelpClient)
- [lists](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/lists/TwitterListClient)
- [mutes](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/mutes/TwitterMuteClient)
- [saved_searches](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/savedsearches/TwitterSavedSearchClient)
- [searches](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/search/TwitterSearchClient)
- [statuses](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/statuses/TwitterStatusClient)
- [suggestions](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/suggestions/TwitterSuggestionClient)
- [users](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/users/TwitterUserClient)
- [trends](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/trends/TwitterTrendClient)
- [media](http://danielasfregola.github.io/twitter4s/8.0/api/com/danielasfregola/twitter4s/http/clients/rest/media/TwitterMediaClient)

Proxy Support
-------------
If needed, you can redefine the domain used for each of the twitter api by overriding the following settings in your configuration file:
```scala
twitter {

  rest {
    api = "https://api.twitter.com"
    media = "https://upload.twitter.com"
  }

  streaming {
    public = "https://stream.twitter.com"
    user = "https://userstream.twitter.com"
    site = "https://sitestream.twitter.com"
  }
}
```

Logging
-------
Twitter4s uses [scala-logging](https://github.com/typesafehub/scala-logging) and can be used in your `twitter4s` application.

In your application you will need a logging backend (logback, logstash). [logback-classic](https://github.com/qos-ch/logback) is easy to use and will suit most needs.
You can find a sample configuration in [twitter4s-demo](https://github.com/DanielaSfregola/twitter4s-demo) and in the Giter8 template [twitter4s.g8](https://github.com/DanielaSfregola/twitter4s.g8)

Examples
--------
Have a look at the repository [twitter4s-demo](https://github.com/DanielaSfregola/twitter4s-demo) for more examples on how to use `twitter4s`.

Snapshot Versions
-----------------
To use a snapshot version of this library, make sure you have the resolver for maven central (snapshot repositories) in your SBT settings:
```scala
resolvers += Resolver.sonatypeRepo("snapshots")
```

Then, add the library as your dependency:
```scala
libraryDependencies += "com.danielasfregola" %% "twitter4s" % "8.1-SNAPSHOT"
```

Coming up Features
---------------
- OAuth1 support
- Advanced query support
- Support for dump to file
- ...

How to Contribute
-----------------
Contributions and feature requests are always welcome!

- Fork the repo and checkout the code
- Make sure to run sbt with jdk8+
- Run the tests with `sbt test`
- ...you can now do your magic and submit a PR when you are ready! :dancers:


================================================
FILE: build.sbt
================================================
import com.typesafe.sbt.SbtGit.{GitKeys => git}

enablePlugins(GhpagesPlugin, SiteScaladocPlugin)

name := "twitter4s"
version := "8.1-SNAPSHOT"

scalaVersion := "2.13.6"

resolvers ++= Seq(
  Resolver.sonatypeRepo("releases"),
  Resolver.jcenterRepo
)

libraryDependencies ++= {
  val Typesafe = "1.4.2"
  val Akka = "2.6.19"
  val AkkaHttp = "10.2.9"
  val AkkaHttpJson4s = "1.39.2"
  val Json4s = "4.0.5"
  val Specs2 = "4.15.0"
  val ScalaLogging = "3.9.4"
  val RandomDataGenerator = "2.8"

  Seq(
    "com.typesafe" % "config" % Typesafe,
    "com.typesafe.akka" %% "akka-actor" % Akka,
    "com.typesafe.akka" %% "akka-stream" % Akka,
    "com.typesafe.akka" %% "akka-http" % AkkaHttp,
    "de.heikoseeberger" %% "akka-http-json4s" % AkkaHttpJson4s,
    "org.json4s" %% "json4s-native" % Json4s,
    "org.json4s" %% "json4s-ext" % Json4s,
    "com.typesafe.scala-logging" %% "scala-logging" % ScalaLogging,
    "org.specs2" %% "specs2-core" % Specs2 % "test",
    "org.specs2" %% "specs2-mock" % Specs2 % "test",
    "com.typesafe.akka" %% "akka-testkit" % Akka % "test",
    "com.danielasfregola" %% "random-data-generator" % RandomDataGenerator % "test"
  )
}

ThisBuild / scalacOptions ++= Seq("-language:postfixOps",
                                  "-language:implicitConversions",
                                  "-language:existentials",
                                  "-Xfatal-warnings",
                                  "-feature",
                                  "-deprecation:false")

lazy val standardSettings = Seq(
  organization := "com.danielasfregola",
  licenses += ("Apache-2.0", url("http://www.apache.org/licenses/LICENSE-2.0.html")),
  homepage := Some(url("https://github.com/DanielaSfregola/twitter4s")),
  scmInfo := Some(
    ScmInfo(url("https://github.com/DanielaSfregola/twitter4s"),
            "scm:git:git@github.com:DanielaSfregola/twitter4s.git")),
  apiURL := Some(url("http://DanielaSfregola.github.io/twitter4s/latest/api/")),
  crossScalaVersions := Seq(scalaVersion.value, "2.12.15"),
  pomExtra :=
    <developers>
        <developer>
          <id>DanielaSfregola</id>
          <name>Daniela Sfregola</name>
          <url>http://danielasfregola.com/</url>
        </developer>
      </developers>,
  publishMavenStyle := true,
  publishTo := {
    if (version.value.trim.endsWith("SNAPSHOT")) Some(Opts.resolver.sonatypeSnapshots)
    else Some(Opts.resolver.sonatypeStaging)
  },
  git.gitRemoteRepo := "git@github.com:DanielaSfregola/twitter4s.git",
  scalacOptions ++= Seq(
    "-encoding",
    "UTF-8",
    "-Xlint",
    "-deprecation:false",
    "-Xfatal-warnings",
    "-feature",
    "-language:postfixOps",
    "-unchecked"
  ),
  Compile / doc / scalacOptions ++= Seq("-sourcepath", baseDirectory.value.getAbsolutePath),
  autoAPIMappings := true,
  Compile / doc / scalacOptions ++= {
    val branch = if (version.value.trim.endsWith("SNAPSHOT")) "master" else version.value
    Seq(
      "-doc-source-url",
      "https://github.com/DanielaSfregola/twitter4s/tree/" + branch + "€{FILE_PATH}.scala"
    )
  }
)

lazy val coverageSettings = Seq(
  coverageExcludedPackages := "com.danielasfregola.twitter4s.processors.*;com.danielasfregola.twitter4s.Twitter*Client",
  coverageMinimum := 85
)

ThisBuild / scalafmtOnCompile := true
ThisBuild / scalafmtTestOnCompile := true

SiteScaladoc / siteSubdirName := version + "/api"

lazy val root = (project in file("."))
  .settings(standardSettings ++ coverageSettings)
  .settings(
    name := "twitter4s"
  )


================================================
FILE: project/build.properties
================================================
sbt.version = 1.6.2


================================================
FILE: project/plugins.sbt
================================================
addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.4.1")

addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.3")

addSbtPlugin("com.github.sbt" % "sbt-unidoc" % "0.5.0")

resolvers += Classpaths.sbtPluginReleases

addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.0")

addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.2")

addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.12")

addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")

addSbtPlugin("com.lucidchart" % "sbt-scalafmt-coursier" % "1.16")

Test / parallelExecution := false


================================================
FILE: sonatype.sbt
================================================
sonatypeProfileName := "com.danielasfregola"


================================================
FILE: src/main/resources/reference.conf
================================================
twitter {

  rest {
    api = "https://api.twitter.com"
    media = "https://upload.twitter.com"
  }

  streaming {
    public = "https://stream.twitter.com"
    user = "https://userstream.twitter.com"
    site = "https://sitestream.twitter.com"
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterAuthenticationClient.scala
================================================
package com.danielasfregola.twitter4s

import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.ConsumerToken
import com.danielasfregola.twitter4s.http.clients.authentication.AuthenticationClient
import com.danielasfregola.twitter4s.http.clients.authentication.oauth.TwitterOAuthClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown

/** Represents the functionalities offered by the Twitter REST API for authentication
  */
class TwitterAuthenticationClient private (val consumerToken: ConsumerToken)(implicit _system: ActorSystem =
                                                                               ActorSystem("twitter4s-auth"))
    extends TwitterAuthClients
    with SystemShutdown {

  protected val system = _system

  protected val authenticationClient = new AuthenticationClient(consumerToken)

}

trait TwitterAuthClients extends TwitterOAuthClient

object TwitterAuthenticationClient {

  def apply(): TwitterAuthenticationClient = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    apply(consumerToken)
  }

  def apply(consumerToken: ConsumerToken): TwitterAuthenticationClient =
    new TwitterAuthenticationClient(consumerToken)

  def withActorSystem(system: ActorSystem): TwitterAuthenticationClient = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    withActorSystem(consumerToken)(system)
  }

  def withActorSystem(consumerToken: ConsumerToken)(system: ActorSystem): TwitterAuthenticationClient =
    new TwitterAuthenticationClient(consumerToken)(system)
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterRestClient.scala
================================================
package com.danielasfregola.twitter4s

import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.account.TwitterAccountClient
import com.danielasfregola.twitter4s.http.clients.rest.accountactivity.TwitterAccountActivityClient
import com.danielasfregola.twitter4s.http.clients.rest.application.TwitterApplicationClient
import com.danielasfregola.twitter4s.http.clients.rest.blocks.TwitterBlockClient
import com.danielasfregola.twitter4s.http.clients.rest.directmessages.TwitterDirectMessageClient
import com.danielasfregola.twitter4s.http.clients.rest.favorites.TwitterFavoriteClient
import com.danielasfregola.twitter4s.http.clients.rest.followers.TwitterFollowerClient
import com.danielasfregola.twitter4s.http.clients.rest.friends.TwitterFriendClient
import com.danielasfregola.twitter4s.http.clients.rest.friendships.TwitterFriendshipClient
import com.danielasfregola.twitter4s.http.clients.rest.geo.TwitterGeoClient
import com.danielasfregola.twitter4s.http.clients.rest.help.TwitterHelpClient
import com.danielasfregola.twitter4s.http.clients.rest.lists.TwitterListClient
import com.danielasfregola.twitter4s.http.clients.rest.media.TwitterMediaClient
import com.danielasfregola.twitter4s.http.clients.rest.mutes.TwitterMuteClient
import com.danielasfregola.twitter4s.http.clients.rest.savedsearches.TwitterSavedSearchClient
import com.danielasfregola.twitter4s.http.clients.rest.search.TwitterSearchClient
import com.danielasfregola.twitter4s.http.clients.rest.statuses.TwitterStatusClient
import com.danielasfregola.twitter4s.http.clients.rest.suggestions.TwitterSuggestionClient
import com.danielasfregola.twitter4s.http.clients.rest.trends.TwitterTrendClient
import com.danielasfregola.twitter4s.http.clients.rest.users.TwitterUserClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown

/** Represents the functionalities offered by the Twitter REST API
  */
class TwitterRestClient(val consumerToken: ConsumerToken, val accessToken: AccessToken)(implicit _system: ActorSystem =
                                                                                          ActorSystem("twitter4s-rest"))
    extends RestClients
    with SystemShutdown {

  protected val system = _system

  protected val restClient = new RestClient(consumerToken, accessToken)

}

trait RestClients
    extends TwitterAccountClient
    with TwitterAccountActivityClient
    with TwitterApplicationClient
    with TwitterBlockClient
    with TwitterDirectMessageClient
    with TwitterFavoriteClient
    with TwitterFollowerClient
    with TwitterFriendClient
    with TwitterFriendshipClient
    with TwitterGeoClient
    with TwitterHelpClient
    with TwitterListClient
    with TwitterMediaClient
    with TwitterMuteClient
    with TwitterSavedSearchClient
    with TwitterSearchClient
    with TwitterStatusClient
    with TwitterSuggestionClient
    with TwitterTrendClient
    with TwitterUserClient

object TwitterRestClient {

  def apply(): TwitterRestClient = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
    apply(consumerToken, accessToken)
  }

  def apply(consumerToken: ConsumerToken, accessToken: AccessToken): TwitterRestClient =
    new TwitterRestClient(consumerToken, accessToken)

  def withActorSystem(system: ActorSystem): TwitterRestClient = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
    withActorSystem(consumerToken, accessToken)(system)
  }

  def withActorSystem(consumerToken: ConsumerToken, accessToken: AccessToken)(system: ActorSystem): TwitterRestClient =
    new TwitterRestClient(consumerToken, accessToken)(system)

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterRestV2Client.scala
================================================
package com.danielasfregola.twitter4s

import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.v2.tweets.{
  TwitterSearchTweetsClient,
  TwitterTimelinesClient,
  TwitterTweetLookupClient
}
import com.danielasfregola.twitter4s.http.clients.rest.v2.users.TwitterUserLookupClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown

/** Represents the functionalities offered by the V2 Twitter REST API
  */
class TwitterRestV2Client(val consumerToken: ConsumerToken, val accessToken: AccessToken)(
    implicit _system: ActorSystem = ActorSystem("twitter4s-rest-v2"))
    extends V2RestClients
    with SystemShutdown {

  protected val system = _system

  protected val restClient = new RestClient(consumerToken, accessToken)

}

trait V2RestClients
    extends TwitterTimelinesClient
    with TwitterTweetLookupClient
    with TwitterSearchTweetsClient
    with TwitterUserLookupClient

object TwitterRestV2Client {

  def apply(): TwitterRestV2Client = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
    apply(consumerToken, accessToken)
  }

  def apply(consumerToken: ConsumerToken, accessToken: AccessToken): TwitterRestV2Client =
    new TwitterRestV2Client(consumerToken, accessToken)

  def withActorSystem(system: ActorSystem): TwitterRestV2Client = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
    withActorSystem(consumerToken, accessToken)(system)
  }

  def withActorSystem(consumerToken: ConsumerToken, accessToken: AccessToken)(
      system: ActorSystem): TwitterRestV2Client =
    new TwitterRestV2Client(consumerToken, accessToken)(system)

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/TwitterStreamingClient.scala
================================================
package com.danielasfregola.twitter4s

import akka.actor.ActorSystem
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken}
import com.danielasfregola.twitter4s.http.clients.streaming.StreamingClient
import com.danielasfregola.twitter4s.http.clients.streaming.sites.TwitterSiteClient
import com.danielasfregola.twitter4s.http.clients.streaming.statuses.TwitterStatusClient
import com.danielasfregola.twitter4s.http.clients.streaming.users.TwitterUserClient
import com.danielasfregola.twitter4s.util.Configurations._
import com.danielasfregola.twitter4s.util.SystemShutdown

/** Represents the functionalities offered by the Twitter Streaming API
  */
class TwitterStreamingClient private (val consumerToken: ConsumerToken, val accessToken: AccessToken)(
    implicit _system: ActorSystem = ActorSystem("twitter4s-streaming"))
    extends StreamingClients
    with SystemShutdown {

  protected val system = _system

  protected val streamingClient = new StreamingClient(consumerToken, accessToken)

}

trait StreamingClients extends TwitterStatusClient with TwitterUserClient with TwitterSiteClient

object TwitterStreamingClient {

  def apply(): TwitterStreamingClient = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
    apply(consumerToken, accessToken)
  }

  def apply(consumerToken: ConsumerToken, accessToken: AccessToken): TwitterStreamingClient =
    new TwitterStreamingClient(consumerToken, accessToken)

  def withActorSystem(system: ActorSystem): TwitterStreamingClient = {
    val consumerToken = ConsumerToken(key = consumerTokenKey, secret = consumerTokenSecret)
    val accessToken = AccessToken(key = accessTokenKey, secret = accessTokenSecret)
    withActorSystem(consumerToken, accessToken)(system)
  }

  def withActorSystem(consumerToken: ConsumerToken, accessToken: AccessToken)(
      system: ActorSystem): TwitterStreamingClient =
    new TwitterStreamingClient(consumerToken, accessToken)(system)
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/AccessToken.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class AccessToken(key: String, secret: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Accuracy.scala
================================================
package com.danielasfregola.twitter4s.entities

import com.danielasfregola.twitter4s.entities.enums.Measure
import com.danielasfregola.twitter4s.entities.enums.Measure.Measure

final case class Accuracy(amount: Int, unit: Measure) {
  override def toString = s"$amount$unit"
}

object Accuracy {
  val Default = Accuracy(0, Measure.Meter)
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Area.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Area(coordinates: Seq[Seq[Seq[Double]]], `type`: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Banners.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Banners(sizes: Map[String, Banner] = Map.empty)

final case class Banner(h: Int, w: Int, url: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Category.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Category(name: String, slug: String, size: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Configuration.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Configuration(dm_text_character_limit: Long,
                               characters_reserved_per_media: Int,
                               max_media_per_upload: Int,
                               non_username_paths: Seq[String] = Seq.empty,
                               photo_size_limit: Long,
                               photo_sizes: Map[String, Size] = Map.empty,
                               short_url_length: Int,
                               short_url_length_https: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ConsumerToken.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class ConsumerToken(key: String, secret: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Contributor.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Contributor(id: Long, id_str: String, screen_name: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Coordinate.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Coordinate(longitude: Double, latitude: Double) {
  def toLngLatPair: (Double, Double) =
    (longitude, latitude)
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Coordinates.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Coordinates(coordinates: Seq[Double] = Seq.empty, `type`: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessage.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage

final case class DirectMessage(created_at: Instant,
                               entities: Option[Entities],
                               id: Long,
                               id_str: String,
                               recipient: User,
                               recipient_id: Long,
                               recipient_id_str: String,
                               recipient_screen_name: String,
                               sender: User,
                               sender_id: Long,
                               sender_id_str: String,
                               sender_screen_name: String,
                               text: String)
    extends UserStreamingMessage


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEvent.scala
================================================
package com.danielasfregola.twitter4s.entities
import java.time.Instant

final case class DirectMessageEvent(`type`: String,
                                    id: String,
                                    created_timestamp: Instant,
                                    message_create: MessageCreate)

final case class MessageCreate(target: Target, sender_id: Option[String], message_data: MessageData)

final case class Target(recipient_id: String)

final case class MessageData(text: String, entities: Option[Entities] = None, attachment: Option[Attachment] = None)

final case class Attachment(`type`: String, media: Media)

final case class Apps(id: String, name: String, url: String)

final case class Event(event: DirectMessageEvent, apps: Map[String, App] = Map.empty)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEventList.scala
================================================
package com.danielasfregola.twitter4s.entities
import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage

final case class DirectMessageEventList(events: List[DirectMessageEvent],
                                        apps: Map[String, Apps] = Map.empty,
                                        next_cursor: Option[String])
    extends UserStreamingMessage


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Entities.scala
================================================
package com.danielasfregola.twitter4s.entities

// TODO - conversion to clean this representation? see url vs urls
// unfortunately Twitter is not consistent when representing this entity...

final case class Entities(hashtags: Seq[HashTag] = Seq.empty,
                          media: Seq[Media] = Seq.empty,
                          symbols: Seq[Symbol] = Seq.empty,
                          url: Option[Urls] = None,
                          urls: Seq[UrlDetails] = Seq.empty,
                          user_mentions: Seq[UserMention] = Seq.empty,
                          description: Option[Urls] = None)

final case class Urls(urls: Seq[UrlDetails] = Seq.empty)

final case class UrlDetails(url: String, expanded_url: String, display_url: String, indices: Seq[Int])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ExtendedTweet.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class ExtendedTweet(full_text: String,
                               display_text_range: Seq[Int] = Seq.empty,
                               entities: Option[Entities] = None,
                               extended_entities: Option[Entities] = None)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Geo.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Geo(coordinates: Seq[Double] = Seq.empty, `type`: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoBoundingBox.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class GeoBoundingBox(southwest: Coordinate, northeast: Coordinate) {
  def toLngLatPairs: Seq[(Double, Double)] =
    Seq(southwest.toLngLatPair, northeast.toLngLatPair)
}

object GeoBoundingBox {
  def toLngLatPairs(boundingBoxes: Seq[GeoBoundingBox]): Seq[(Double, Double)] = {
    boundingBoxes.flatMap(_.toLngLatPairs)
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoCode.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class GeoCode(latitude: Double, longitude: Double, radius: Accuracy) {
  override def toString = s"$latitude,$longitude,$radius"
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoPlace.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class GeoPlace(attributes: Map[String, String],
                          bounding_box: Area,
                          country: String,
                          country_code: String,
                          full_name: String,
                          id: String,
                          name: String,
                          place_type: String,
                          url: String,
                          contained_within: Seq[GeoPlace],
                          centroid: Seq[Double] = Seq.empty,
                          polylines: Seq[String] = Seq.empty)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/GeoSearch.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class GeoSearch(query: GeoQuery, result: GeoResult)

final case class GeoQuery(params: GeoParams, `type`: String, url: String)

final case class GeoResult(places: Seq[GeoPlace] = Seq.empty)

final case class GeoParams(accuracy: String,
                           granularity: String,
                           coordinates: Option[Coordinates] = None,
                           query: Option[String] = None,
                           autocomplete: Boolean = false,
                           trim_place: Boolean = false)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/HashTag.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class HashTag(text: String, indices: Seq[Int])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Image.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Image(w: Int, h: Int, image_type: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LanguageDetails.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class LanguageDetails(code: String, status: String, name: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Location.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Location(country: String,
                          countryCode: Option[String],
                          name: String,
                          parentid: Long,
                          placeType: PlaceType,
                          url: String,
                          woeid: Long)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LocationTrends.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class LocationTrends(as_of: String, // TODO - convert to Instant? Different date format here...
                                created_at: String, // TODO - convert to Instant? Different date format here...
                                locations: Seq[LocationOverview] = Seq.empty,
                                trends: Seq[Trend] = Seq.empty)

final case class LocationOverview(name: String, woeid: Long)

// TODO - support 'promoted_content' and 'events'
final case class Trend(name: String, query: String, url: String, tweet_volume: Option[Long])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupEntities.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class LookupEntities(url: LookupUrls, description: LookupUrls)

final case class LookupUrls(urls: Seq[LookupUrl])

final case class LookupUrl(url: String, expanded_url: String, display_url: String, indices: Seq[Int])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupMapped.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class LookupMapped(id: Map[String, Tweet] = Map.empty)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupRelationship.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class LookupRelationship(connections: Seq[String] = Seq.empty,
                                    id: Long,
                                    id_str: String,
                                    name: String,
                                    screen_name: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupTweet.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

final case class LookupTweet(
    contributors: Seq[Contributor],
    coordinates: Seq[Seq[Seq[Double]]] = Seq.empty,
    created_at: Instant,
    entities: Option[Entities],
    favorite_count: Int = 0,
    favorited: Boolean = false,
    id: Long,
    id_str: String,
    in_reply_to_screen_name: Option[String],
    in_reply_to_status_id: Option[Long],
    in_reply_to_status_id_str: Option[String],
    in_reply_to_user_id: Option[Long],
    in_reply_to_user_id_str: Option[String],
    is_quote_status: Boolean = false,
    lang: Option[String],
    place: Option[GeoPlace],
    possibly_sensitive: Boolean = false,
    retweet_count: Long = 0,
    retweeted: Boolean = false,
    source: String,
    text: String,
    truncated: Boolean = false,
    user: Option[LookupUser]
)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/LookupUser.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

final case class LookupUser(
    contributors_enabled: Boolean = false,
    created_at: Instant,
    default_profile: Boolean = false,
    default_profile_image: Boolean = false,
    description: Option[String] = None,
    entities: Option[LookupEntities] = None,
    favourites_count: Int,
    follow_request_sent: Boolean = false,
    following: Boolean = false,
    followers_count: Int,
    friends_count: Int,
    geo_enabled: Boolean = false,
    has_extended_profile: Boolean = false,
    id: Long,
    id_str: String,
    is_translator: Boolean = false,
    is_translation_enabled: Boolean = false,
    lang: String,
    listed_count: Int,
    location: Option[String] = None,
    name: String,
    notifications: Boolean = false,
    profile_background_color: String,
    profile_background_image_url: String,
    profile_background_image_url_https: String,
    profile_background_tile: Boolean = false,
    profile_banner_url: Option[String] = None,
    profile_image_url: Option[ProfileImage],
    profile_image_url_https: Option[ProfileImage],
    profile_link_color: String,
    profile_sidebar_border_color: String,
    profile_sidebar_fill_color: String,
    profile_text_color: String,
    profile_use_background_image: Boolean = false,
    `protected`: Boolean = false,
    screen_name: String,
    statuses_count: Int,
    time_zone: Option[String] = None,
    url: Option[String] = None,
    utc_offset: Option[Int] = None,
    verified: Boolean = false,
    withheld_in_countries: Option[String] = None,
    withheld_scope: Option[String] = None
)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Media.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Media(display_url: String,
                       expanded_url: String,
                       id: Long,
                       id_str: String,
                       indices: Seq[Int],
                       media_url: String,
                       media_url_https: String,
                       sizes: Map[String, Size],
                       source_status_id: Option[Long],
                       source_status_id_str: Option[String],
                       `type`: String,
                       url: String,
                       video_info: Option[VideoInfo])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/MediaDetails.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class MediaDetails(media_id: Long,
                              media_id_string: String,
                              expires_after_secs: Option[Int] = None,
                              size: Option[Long] = None,
                              image: Option[Image] = None,
                              video: Option[Video] = None,
                              processing_info: Option[ProcessingInfo] = None)

final case class ProcessingInfo(state: String,
                                progress_percent: Option[Long],
                                check_after_secs: Option[Int],
                                error: Option[ProcessingError])

final case class ProcessingError(code: Int, name: String, message: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/MediaUpload.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class MediaUpload(media: String, additional_owners: Option[String])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/OEmbedTweet.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class OEmbedTweet(author_name: Option[String],
                             author_url: Option[String],
                             cache_age: Option[String],
                             height: Option[Int],
                             html: String,
                             provider_url: Option[String],
                             provider_name: Option[String],
                             title: Option[String],
                             `type`: String,
                             url: String,
                             version: String,
                             width: Option[Int])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/PrivacyPolicy.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class PrivacyPolicy(privacy: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ProfileImage.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class ProfileImage(mini: String, normal: String, bigger: String, default: String)

object ProfileImage {

  def apply(original: String): ProfileImage = {
    val mini = resize(original, "_mini")
    val normal = resize(original, "_normal")
    val big = resize(original, "_bigger")
    val default = resize(original, "")
    apply(mini, normal, big, default)
  }

  private def resize(original: String, size: String): String = {
    val lastUnderscore = original.lastIndexOf('_')
    val lastDot = original.lastIndexOf('.')
    val prefix = original.substring(0, lastUnderscore)
    val suffix = original.substring(lastDot)
    s"$prefix$size$suffix"
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/ProfileUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class ProfileUpdate(name: Option[String] = None,
                               url: Option[String] = None,
                               description: Option[String] = None,
                               location: Option[String] = None,
                               profile_link_color: Option[String] = None,
                               include_entities: Boolean = true,
                               skip_status: Boolean = false)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/RateLimit.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

import akka.http.scaladsl.model.{HttpHeader, StatusCodes}
import com.danielasfregola.twitter4s.exceptions.TwitterException

final case class RateLimit(limit: Int, remaining: Int, reset: Instant)

object RateLimit {

  def apply(limit: Int, remaining: Int, reset: Long): RateLimit =
    apply(limit, remaining, Instant.ofEpochSecond(reset))

  def apply(headers: Seq[HttpHeader]): RateLimit = {
    val errorMsg =
      s"""Rate Information expected but not found.
         |
         |Please report it at https://github.com/DanielaSfregola/twitter4s/issues/new
         |Headers names were: ${headers.map(_.lowercaseName).mkString(", ")}""".stripMargin

    def extractHeaderValue[T](name: String)(f: String => T): T =
      headers
        .find(_.lowercaseName == name)
        .map(h => f(h.value))
        .getOrElse(throw TwitterException(StatusCodes.InternalServerError, errorMsg))

    val limit = extractHeaderValue("x-rate-limit-limit")(_.toInt)
    val remaining = extractHeaderValue("x-rate-limit-remaining")(_.toInt)
    val reset = extractHeaderValue("x-rate-limit-reset")(_.toLong)
    apply(limit, remaining, reset)
  }

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/RateLimits.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class RateLimits(rate_limit_context: RateLimitContext, resources: Resources)

final case class RateLimitContext(access_token: String)

final case class Resources(lists: Map[String, RateLimit] = Map.empty,
                           application: Map[String, RateLimit] = Map.empty,
                           mutes: Map[String, RateLimit] = Map.empty,
                           friendships: Map[String, RateLimit] = Map.empty,
                           blocks: Map[String, RateLimit] = Map.empty,
                           geo: Map[String, RateLimit] = Map.empty,
                           users: Map[String, RateLimit] = Map.empty,
                           followers: Map[String, RateLimit] = Map.empty,
                           collections: Map[String, RateLimit] = Map.empty,
                           statuses: Map[String, RateLimit] = Map.empty,
                           contacts: Map[String, RateLimit] = Map.empty,
                           moments: Map[String, RateLimit] = Map.empty,
                           help: Map[String, RateLimit] = Map.empty,
                           friends: Map[String, RateLimit] = Map.empty,
                           direct_messages: Map[String, RateLimit] = Map.empty,
                           account: Map[String, RateLimit] = Map.empty,
                           favorites: Map[String, RateLimit] = Map.empty,
                           device: Map[String, RateLimit] = Map.empty,
                           saved_searches: Map[String, RateLimit] = Map.empty,
                           search: Map[String, RateLimit] = Map.empty,
                           trends: Map[String, RateLimit] = Map.empty)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/RatedData.scala
================================================
package com.danielasfregola.twitter4s.entities

/** A wrapper for data that have rate limitation.
  * Have a look at `rate_limit` for more information on current rates usage.
  */
final case class RatedData[T](rate_limit: RateLimit, data: T)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Relationship.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Relationship(relationship: RelationshipOverview)

final case class RelationshipOverview(source: RelationshipSource, target: RelationshipTarget)

final case class RelationshipSource(id: Long,
                                    id_str: String,
                                    screen_name: String,
                                    following: Boolean = false,
                                    followed_by: Boolean = false,
                                    following_received: Boolean = false,
                                    following_requested: Boolean = false,
                                    notifications_enabled: Boolean = false,
                                    can_dm: Boolean = false,
                                    blocking: Boolean = false,
                                    blocked_by: Boolean = false,
                                    muting: Boolean = false,
                                    want_retweets: Boolean = false,
                                    all_replies: Boolean = false,
                                    marked_spam: Boolean = false)

final case class RelationshipTarget(id: Long,
                                    id_str: String,
                                    screen_name: String,
                                    following: Boolean = false,
                                    followed_by: Boolean = false,
                                    following_received: Boolean = false,
                                    following_requested: Boolean = false)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/SavedSearch.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

final case class SavedSearch(created_at: Instant, id: Long, id_str: String, name: String, query: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Settings.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Settings(allow_contributor_request: String,
                          allow_dm_groups_from: String,
                          allow_dms_from: String,
                          always_use_https: Boolean = false,
                          discoverable_by_email: Boolean = false,
                          discoverable_by_mobile_phone: Boolean = false,
                          geo_enabled: Boolean = false,
                          language: String,
                          `protected`: Boolean = false,
                          screen_name: String,
                          sleep_time: SleepTime,
                          show_all_inline_media: Boolean = false,
                          use_cookie_personalization: Boolean = false,
                          time_zone: Option[TimeZoneRecord] = None,
                          trend_location: Seq[Location] = Seq.empty)

final case class SleepTime(enabled: Boolean = false, end_time: Option[String] = None, start_time: Option[String] = None)

final case class TimeZoneRecord(name: String, tzinfo_name: String, utc_offset: Int)

final case class PlaceType(code: String, name: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/SettingsOptions.scala
================================================
package com.danielasfregola.twitter4s.entities

import com.danielasfregola.twitter4s.entities.enums.ContributorType.ContributorType
import com.danielasfregola.twitter4s.entities.enums.Hour.Hour
import com.danielasfregola.twitter4s.entities.enums.Language.Language
import com.danielasfregola.twitter4s.entities.enums.TimeZone.TimeZone

/**
  * woeid: "Where on Earth Identifiers, by Yahoo!! see http://woeid.rosselliot.co.nz/"
  * */
final case class SettingsOptions(allow_contributor_request: Option[ContributorType] = None,
                                 sleep_time_enabled: Option[Boolean] = None,
                                 start_sleep_time: Option[Hour] = None,
                                 end_sleep_time: Option[Hour] = None,
                                 lang: Option[Language] = None,
                                 time_zone: Option[TimeZone] = None,
                                 trend_location_woeid: Option[Long] = None)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Size.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Size(h: Int, resize: String, w: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/StatusMediaDetails.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class StatusMediaDetails(media_id: Long, media_id_string: String, expires_after_secs: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Suggestions.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Suggestions(name: String, slug: String, size: Int, users: Seq[User] = Seq.empty)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Symbol.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Symbol(text: String, indices: Seq[Int])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TermsOfService.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class TermsOfService(tos: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Tweet.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

final case class Tweet(contributors: Seq[Contributor] = Seq.empty,
                       coordinates: Option[Coordinates] = None,
                       created_at: Instant,
                       current_user_retweet: Option[TweetId] = None,
                       entities: Option[Entities] = None,
                       extended_entities: Option[Entities] = None,
                       extended_tweet: Option[ExtendedTweet] = None,
                       favorite_count: Int = 0,
                       favorited: Boolean = false,
                       filter_level: Option[String] = None,
                       geo: Option[Geo] = None,
                       id: Long,
                       id_str: String,
                       in_reply_to_screen_name: Option[String] = None,
                       in_reply_to_status_id: Option[Long] = None,
                       in_reply_to_status_id_str: Option[String] = None,
                       in_reply_to_user_id: Option[Long] = None,
                       in_reply_to_user_id_str: Option[String] = None,
                       is_quote_status: Boolean = false,
                       lang: Option[String] = None,
                       place: Option[GeoPlace] = None,
                       possibly_sensitive: Boolean = false,
                       quoted_status_id: Option[Long] = None,
                       quoted_status_id_str: Option[String] = None,
                       quoted_status: Option[Tweet] = None,
                       scopes: Map[String, Boolean] = Map.empty,
                       retweet_count: Long = 0,
                       retweeted: Boolean = false,
                       retweeted_status: Option[Tweet] = None,
                       source: String,
                       text: String,
                       truncated: Boolean = false,
                       display_text_range: Option[Seq[Int]] = None,
                       user: Option[User] = None,
                       withheld_copyright: Boolean = false,
                       withheld_in_countries: Seq[String] = Seq.empty,
                       withheld_scope: Option[String] = None,
                       metadata: Option[StatusMetadata] = None)
    extends CommonStreamingMessage


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TweetId.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class TweetId(id: Long, id_str: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TweetSearch.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class StatusSearch(statuses: List[Tweet], search_metadata: SearchMetadata)

final case class SearchMetadata(completed_in: Double,
                                max_id: Long,
                                max_id_str: String,
                                next_results: Option[String],
                                query: String,
                                refresh_url: Option[String],
                                count: Int,
                                since_id: Long,
                                since_id_str: String)

final case class StatusMetadata(iso_language_code: String, result_type: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TweetUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class TweetUpdate(status: String,
                             in_reply_to_status_id: Option[Long] = None,
                             possibly_sensitive: Boolean = false,
                             lat: Option[Long] = None,
                             long: Option[Long] = None,
                             place_id: Option[String] = None,
                             display_coordinates: Boolean = false,
                             trim_user: Boolean = false,
                             media_ids: Seq[Long] = Seq.empty)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TwitterList.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

final case class TwitterList(created_at: Instant,
                             description: String,
                             following: Boolean,
                             full_name: String,
                             id: Long,
                             id_str: String,
                             name: String,
                             subscriber_count: Int,
                             uri: String,
                             member_count: Int,
                             mode: String,
                             slug: String,
                             user: User)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TwitterListUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities

import com.danielasfregola.twitter4s.entities.enums.Mode.Mode

final case class TwitterListUpdate(description: Option[String] = None,
                                   mode: Option[Mode] = None,
                                   name: Option[String] = None)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/TwitterLists.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class TwitterLists(lists: Seq[TwitterList] = Seq.empty, next_cursor: Long, previous_cursor: Long)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UploadedMedia.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class UploadedMedia(media_id: Long,
                               media_id_str: String,
                               size: Int,
                               image: Option[Image] = None,
                               video: Option[Video] = None)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Url.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Url(indices: Seq[Int] = Seq.empty, url: String, display_url: String, expanded_url: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/User.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.Instant

final case class User(blocked_by: Boolean = false,
                      blocking: Boolean = false,
                      contributors_enabled: Boolean = false,
                      created_at: Instant,
                      default_profile: Boolean = false,
                      default_profile_image: Boolean = false,
                      description: Option[String] = None,
                      email: Option[String] = None,
                      entities: Option[Entities] = None,
                      favourites_count: Int,
                      follow_request_sent: Boolean = false,
                      following: Boolean = false,
                      followers_count: Int,
                      friends_count: Int,
                      geo_enabled: Boolean = false,
                      has_extended_profile: Boolean = false,
                      id: Long,
                      id_str: String,
                      is_translation_enabled: Boolean = false,
                      is_translator: Boolean = false,
                      lang: String,
                      listed_count: Int,
                      location: Option[String] = None,
                      muting: Boolean = false,
                      name: String,
                      notifications: Boolean = false,
                      profile_background_color: String,
                      profile_background_image_url: String,
                      profile_background_image_url_https: String,
                      profile_background_tile: Boolean = false,
                      profile_banner_url: Option[String] = None,
                      profile_image_url: Option[ProfileImage],
                      profile_image_url_https: Option[ProfileImage],
                      profile_link_color: String,
                      profile_location: Option[String],
                      profile_sidebar_border_color: String,
                      profile_sidebar_fill_color: String,
                      profile_text_color: String,
                      profile_use_background_image: Boolean = false,
                      `protected`: Boolean = false,
                      screen_name: String,
                      show_all_inline_media: Boolean = false,
                      status: Option[Tweet] = None,
                      statuses_count: Int,
                      time_zone: Option[String] = None,
                      translator_type: Option[String] = None,
                      url: Option[String] = None,
                      utc_offset: Option[Int] = None,
                      verified: Boolean = false,
                      withheld_in_countries: Option[String] = None,
                      withheld_scope: Option[String] = None)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UserIds.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class UserIds(ids: Seq[Long] = Seq.empty, next_cursor: Long, previous_cursor: Long)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UserMention.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class UserMention(id: Long, id_str: String, indices: Seq[Int] = Seq.empty, name: String, screen_name: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/UserStringifiedIds.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class UserStringifiedIds(ids: Seq[String] = Seq.empty, next_cursor: Long, previous_cursor: Long)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Users.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Users(users: Seq[User] = Seq.empty, next_cursor: Long, previous_cursor: Long)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Variant.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Variant(bitrate: Option[Long], content_type: String, url: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Video.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class Video(video_type: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/VideoInfo.scala
================================================
package com.danielasfregola.twitter4s.entities

final case class VideoInfo(aspect_ratio: Seq[Int], duration_millis: Option[Long], variants: Seq[Variant])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/Webhook.scala
================================================
package com.danielasfregola.twitter4s.entities

import java.time.ZonedDateTime

final case class Webhook(id: String, url: String, valid: Boolean, created_timestamp: ZonedDateTime)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthAccessToken.scala
================================================
package com.danielasfregola.twitter4s.entities.authentication

import com.danielasfregola.twitter4s.entities.AccessToken
import com.danielasfregola.twitter4s.http.serializers.FromMap

final case class OAuthAccessToken(accessToken: AccessToken, user_id: Long, screen_name: String)

object OAuthAccessToken {

  implicit val oAuthAccessTokenFromMap = new FromMap[OAuthAccessToken] {

    def apply(m: Map[String, String]): Option[OAuthAccessToken] =
      for {
        key <- m.get("oauth_token")
        secret <- m.get("oauth_token_secret")
        userId <- m.get("user_id")
        screenName <- m.get("screen_name")
      } yield OAuthAccessToken(AccessToken(key, secret), userId.toLong, screenName)
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthRequestToken.scala
================================================
package com.danielasfregola.twitter4s.entities.authentication

import com.danielasfregola.twitter4s.http.serializers.FromMap

final case class OAuthRequestToken(token: RequestToken, oauth_callback_confirmed: Boolean)

final case class RequestToken(key: String, secret: String)

object OAuthRequestToken {

  implicit val oAuthRequestTokenFromMap = new FromMap[OAuthRequestToken] {

    def apply(m: Map[String, String]): Option[OAuthRequestToken] =
      for {
        key <- m.get("oauth_token")
        secret <- m.get("oauth_token_secret")
        callbackConfirmed <- m.get("oauth_callback_confirmed")
      } yield OAuthRequestToken(RequestToken(key, secret), toBoolean(callbackConfirmed))
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/AccessType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object AccessType extends Enumeration {
  type AccessType = Value

  val Read = Value("read")
  val Write = Value("write")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Alignment.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Alignment extends Enumeration {
  type Alignment = Value

  val Left = Value("left")
  val Right = Value("right")
  val Center = Value("center")
  val None = Value("none")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/ContributorType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object ContributorType extends Enumeration {
  type ContributorType = Value

  val All = Value("all")
  val Following = Value("following")
  val `None` = Value("none")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/DisconnectionCode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object DisconnectionCode extends Enumeration {
  type DisconnectionCode = Value

  val Shutdown = Value(1)
  val DuplicateStream = Value(2)
  val ControlRequest = Value(3)
  val Stall = Value(4)
  val Normal = Value(5)
  val TokenRevoked = Value(6)
  val AdminLogout = Value(7)
  val Internal = Value(8)
  val MaxMessageLimit = Value(9)
  val StreamException = Value(10)
  val BrokerStall = Value(11)
  val ShedLoad = Value(12)

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/EventCode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

abstract class EventCode extends Enumeration

object SimpleEventCode extends EventCode {
  type SimpleEventCode = Value

  val AccessRevoked = Value("access_revoked")
  val Block = Value("block")
  val Unblock = Value("unblock")
  val Follow = Value("follow")
  val Unfollow = Value("unfollow")
  val UserUpdate = Value("user_update")
}

object TweetEventCode extends EventCode {
  type TweetEventCode = Value

  val Favorite = Value("favorite")
  val FavoritedRetweet = Value("favorited_retweet")
  val Unfavorite = Value("unfavorite")
  val QuotedTweet = Value("quoted_tweet")
}

object TwitterListEventCode extends EventCode {
  type TwitterListEventCode = Value

  val ListCreated = Value("list_created")
  val ListDestroyed = Value("list_destroyed")
  val ListUpdated = Value("list_updated")
  val ListMemberAdded = Value("list_member_added")
  val ListMemberRemoved = Value("list_member_removed")
  val ListUserSubscribed = Value("list_user_subscribed")
  val ListUserUnsubscribed = Value("list_user_unsubscribed")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/FilterLevel.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object FilterLevel extends Enumeration {
  type FilterLevel = Value

  val None = Value("none")
  val Low = Value("low")
  val Medium = Value("medium")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Granularity.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Granularity extends Enumeration {
  type Granularity = Value

  val Admin = Value("admim")
  val City = Value("city")
  val Country = Value("country")
  val Neighborhood = Value("neighborhood")
  val Poi = Value("poi")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Hour.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Hour extends Enumeration {
  type Hour = Value

  val MIDNIGHT = Value("00")
  val ONE_AM = Value("01")
  val TWO_AM = Value("02")
  val THREE_AM = Value("03")
  val FOUR_AM = Value("04")
  val FIVE_AM = Value("05")
  val SIX_AM = Value("06")
  val SEVEN_AM = Value("07")
  val EIGHT_AM = Value("08")
  val NIGHT_AM = Value("09")
  val TEN_AM = Value("10")
  val ELEVEN_AM = Value("11")
  val MIDDAY = Value("12")
  val ONE_PM = Value("13")
  val TWO_PM = Value("14")
  val THREE_PM = Value("15")
  val FOUR_PM = Value("16")
  val FIVE_PM = Value("17")
  val SIX_PM = Value("18")
  val SEVEN_PM = Value("19")
  val EIGHT_PM = Value("20")
  val NIGHT_PM = Value("21")
  val TEN_PM = Value("22")
  val ELEVEN_PM = Value("23")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Language.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Language extends Enumeration {
  type Language = Value

  val English = Value("en")
  val Arabic = Value("ar")
  val Bengali = Value("bn")
  val Czech = Value("cs")
  val Danish = Value("da")
  val German = Value("de")
  val Greek = Value("el")
  val Spanish = Value("es")
  val Persian = Value("fa")
  val Finnish = Value("fi")
  val Filipino = Value("fil")
  val French = Value("fr")
  val Hebrew = Value("he")
  val Hindi = Value("hi")
  val Hungarian = Value("hu")
  val Indonesian = Value("id")
  val Italian = Value("it")
  val Japanese = Value("ja")
  val Korean = Value("ko")
  val Malay = Value("msa")
  val Dutch = Value("nl")
  val Norwegian = Value("no")
  val Polish = Value("pl")
  val Portuguese = Value("pt")
  val Romanian = Value("ro")
  val Russian = Value("ru")
  val Swedish = Value("sv")
  val Thai = Value("th")
  val Turkish = Value("tr")
  val Ukrainian = Value("uk")
  val Urdu = Value("ur")
  val Vietnamese = Value("vi")
  val ChineseSimplified = Value("zh-cn")
  val Chinese = Value("zh-tw")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Measure.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Measure extends Enumeration {
  type Measure = Value

  val Meter = Value("m")
  val Feet = Value("ft")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/MediaType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object MediaType extends Enumeration {
  type MediaType = Value

  val PNG = Value("image/png")
  val JPG = Value("image/jpeg")
  val GIF = Value("image/gif")
  val WEBP = Value("image/webp")

  val MP4 = Value("video/mp4")
  val MOV = Value("video/quicktime")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Mode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Mode extends Enumeration {
  type Mode = Value

  val Private = Value("private")
  val Public = Value("public")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/Resource.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object Resource extends Enumeration {
  type Resource = Value

  val Account = Value("account")
  val Application = Value("application")
  val Blocks = Value("blocks")
  val Collections = Value("collections")
  val Contacts = Value("contacts")
  val Device = Value("device")
  val DirectMessages = Value("direct_messages")
  val Favorites = Value("favorites")
  val Followers = Value("followers")
  val Friends = Value("friends")
  val Friendships = Value("friendships")
  val Geo = Value("geo")
  val Help = Value("help")
  val Lists = Value("lists")
  val Moments = Value("moments")
  val Mutes = Value("mutes")
  val SavedSearches = Value("saved_searches")
  val Search = Value("search")
  val Statuses = Value("statuses")
  val Trends = Value("trends")
  val Users = Value("users")

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/ResultType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object ResultType extends Enumeration {
  type ResultType = Value

  val Mixed = Value("mixed")
  val Recent = Value("recent")
  val Popular = Value("popular")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/TimeZone.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object TimeZone extends Enumeration {
  type TimeZone = Value

  val Africa_Algiers = Value("Africa/Algiers")
  val Africa_Cairo = Value("Africa/Cairo")
  val Africa_Casablanca = Value("Africa/Casablanca")
  val Africa_Harare = Value("Africa/Harare")
  val Africa_Johannesburg = Value("Africa/Johannesburg")
  val Africa_Monrovia = Value("Africa/Monrovia")
  val Africa_Nairobi = Value("Africa/Nairobi")

  val America_Argentina_Buenos_Aires = Value("America/Argentina_Buenos_Aires")
  val America_Bogota = Value("America/Bogota")
  val America_Caracas = Value("America/Caracas")
  val America_Chicago = Value("America/Chicago")
  val America_Chihuahua = Value("America/Chihuahua")
  val America_Denver = Value("America/Denver")
  val America_Godthab = Value("America/Godthab")
  val America_Guatemala = Value("America/Guatemala")
  val America_Guyana = Value("America/Guyana")
  val America_Halifax = Value("America/Halifax")
  val America_Indiana_Indianapolis = Value("America/Indiana_Indianapolis")
  val America_Juneau = Value("America/Juneau")
  val America_La_Paz = Value("America/La_Paz")
  val America_Lima = Value("America/Lima")
  val America_Los_Angeles = Value("America/Los_Angeles")
  val America_Mazatlan = Value("America/Mazatlan")
  val America_Mexico_City = Value("America/Mexico_City")
  val America_Monterrey = Value("America/Monterrey")
  val America_Montevideo = Value("America/Montevideo")
  val America_New_York = Value("America/New_York")
  val America_Phoenix = Value("America/Phoenix")
  val America_Regina = Value("America/Regina")
  val America_Santiago = Value("America/Santiago")
  val America_Sao_Paulo = Value("America/Sao_Paulo")
  val America_St_Johns = Value("America/St_Johns")
  val America_Tijuana = Value("America/Tijuana")

  val Asia_Almaty = Value("Asia/Almaty")
  val Asia_Baghdad = Value("Asia/Baghdad")
  val Asia_Baku = Value("Asia/Baku")
  val Asia_Bangkok = Value("Asia/Bangkok")
  val Asia_Chongqing = Value("Asia/Chongqing")
  val Asia_Colombo = Value("Asia/Colombo")
  val Asia_Dhaka = Value("Asia/Dhaka")
  val Asia_Hong_Kong = Value("Asia/Hong_Kong")
  val Asia_Irkutsk = Value("Asia/Irkutsk")
  val Asia_Jakarta = Value("Asia/Jakarta")
  val Asia_Jerusalem = Value("Asia/Jerusalem")
  val Asia_Kabul = Value("Asia/Kabul")
  val Asia_Kamchatka = Value("Asia/Kamchatka")
  val Asia_Karachi = Value("Asia/Karachi")
  val Asia_Kathmandu = Value("Asia/Kathmandu")
  val Asia_Kolkata = Value("Asia/Kolkata")
  val Asia_Krasnoyarsk = Value("Asia/Krasnoyarsk")
  val Asia_Kuala_Lumpur = Value("Asia/Kuala_Lumpur")
  val Asia_Kuwait = Value("Asia/Kuwait")
  val Asia_Magadan = Value("Asia/Magadan")
  val Asia_Muscat = Value("Asia/Muscat")
  val Asia_Novosibirsk = Value("Asia/Novosibirsk")
  val Asia_Rangoon = Value("Asia/Rangoon")
  val Asia_Riyadh = Value("Asia/Riyadh")
  val Asia_Seoul = Value("Asia/Seoul")
  val Asia_Shanghai = Value("Asia/Shanghai")
  val Asia_Singapore = Value("Asia/Singapore")
  val Asia_Srednekolymsk = Value("Asia/Srednekolymsk")
  val Asia_Taipei = Value("Asia/Taipei")
  val Asia_Tashkent = Value("Asia/Tashkent")
  val Asia_Tbilisi = Value("Asia/Tbilisi")
  val Asia_Tehran = Value("Asia/Tehran")
  val Asia_Tokyo = Value("Asia/Tokyo")
  val Asia_Ulaanbaatar = Value("Asia/Ulaanbaatar")
  val Asia_Urumqi = Value("Asia/Urumqi")
  val Asia_Vladivostok = Value("Asia/Vladivostok")
  val Asia_Yakutsk = Value("Asia/Yakutsk")
  val Asia_Yekaterinburg = Value("Asia/Yekaterinburg")
  val Asia_Yerevan = Value("Asia/Yerevan")

  val Atlantic_Azores = Value("Atlantic/Azores")
  val Atlantic_Cape_Verde = Value("Atlantic/Cape_Verde")
  val Atlantic_South_Georgia = Value("Atlantic/South_Georgia")
  val Australia_Adelaide = Value("Australia_Adelaide")
  val Australia_Brisbane = Value("Australia_Brisbane")
  val Australia_Darwin = Value("Australia_Darwin")
  val Australia_Hobart = Value("Australia_Hobart")
  val Australia_Melbourne = Value("Australia_Melbourne")
  val Australia_Perth = Value("Australia_Perth")
  val Australia_Sydney = Value("Australia_Sydney")

  val Etc_UTC = Value("Etc_UTC")

  val Europe_Amsterdam = Value("Europe/Amsterdam")
  val Europe_Athens = Value("Europe/Athens")
  val Europe_Belgrade = Value("Europe/Belgrade")
  val Europe_Berlin = Value("Europe/Berlin")
  val Europe_Bratislava = Value("Europe/Bratislava")
  val Europe_Brussels = Value("Europe/Brussels")
  val Europe_Bucharest = Value("Europe/Bucharest")
  val Europe_Budapest = Value("Europe/Budapest")
  val Europe_Copenhagen = Value("Europe/Copenhagen")
  val Europe_Dublin = Value("Europe/Dublin")
  val Europe_Helsinki = Value("Europe/Helsinki")
  val Europe_Istanbul = Value("Europe/Istanbul")
  val Europe_Kaliningrad = Value("Europe/Kaliningrad")
  val Europe_Kiev = Value("Europe/Kiev")
  val Europe_Lisbon = Value("Europe/Lisbon")
  val Europe_Ljubljana = Value("Europe/Ljubljana")
  val Europe_London = Value("Europe/London")
  val Europe_Madrid = Value("Europe/Madrid")
  val Europe_Minsk = Value("Europe/Minsk")
  val Europe_Moscow = Value("Europe/Moscow")
  val Europe_Paris = Value("Europe/Paris")
  val Europe_Prague = Value("Europe/Prague")
  val Europe_Riga = Value("Europe/Riga")
  val Europe_Rome = Value("Europe/Rome")
  val Europe_Samara = Value("Europe/Samara")
  val Europe_Sarajevo = Value("Europe/Sarajevo")
  val Europe_Skopje = Value("Europe/Skopje")
  val Europe_Sofia = Value("Europe/Sofia")
  val Europe_Stockholm = Value("Europe/Stockholm")
  val Europe_Tallinn = Value("Europe/Tallinn")
  val Europe_Vienna = Value("Europe/Vienna")
  val Europe_Vilnius = Value("Europe/Vilnius")
  val Europe_Volgograd = Value("Europe/Volgograd")
  val Europe_Warsaw = Value("Europe/Warsaw")
  val Europe_Zagreb = Value("Europe/Zagreb")

  val Pacific_Apia = Value("Pacific/Apia")
  val Pacific_Auckland = Value("Pacific/Auckland")
  val Pacific_Chatham = Value("Pacific/Chatham")
  val Pacific_Fakaofo = Value("Pacific/Fakaofo")
  val Pacific_Fiji = Value("Pacific/Fiji")
  val Pacific_Guadalcanal = Value("Pacific/Guadalcanal")
  val Pacific_Guam = Value("Pacific/Guam")
  val Pacific_Honolulu = Value("Pacific/Honolulu")
  val Pacific_Majuro = Value("Pacific/Majuro")
  val Pacific_Midway = Value("Pacific/Midway")
  val Pacific_Noumea = Value("Pacific/Noumea")
  val Pacific_Pago_Pago = Value("Pacific/Pago_Pago")
  val Pacific_Port_Moresby = Value("Pacific/Port_Moresby")
  val Pacific_Tongatapu = Value("Pacific/Tongatapu")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/TweetMode.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object TweetMode extends Enumeration {
  type TweetMode = Value

  val Extended = Value("extended")
  val Classic = Value("")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/WidgetType.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object WidgetType extends Enumeration {
  type WidgetType = Value

  val Video = Value("video")

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/enums/WithFilter.scala
================================================
package com.danielasfregola.twitter4s.entities.enums

object WithFilter extends Enumeration {
  type WithFilter = Value

  val User = Value("user")
  val Followings = Value("followings")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/StreamingUpdate.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming

final case class StreamingUpdate(streamingEvent: StreamingMessage)

trait StreamingMessage

trait CommonStreamingMessage extends UserStreamingMessage with SiteStreamingMessage
trait UserStreamingMessage extends StreamingMessage
trait SiteStreamingMessage extends StreamingMessage


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/DisconnectMessage.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.enums.DisconnectionCode.DisconnectionCode
import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** Streams may be shut down for a variety of reasons.
  * The streaming API will attempt to deliver a message indicating why a stream was closed.
  * Note that if the disconnect was due to network issues or a client reading too slowly,
  * it is possible that this message will not be received.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class DisconnectMessage(disconnect: DisconnectMessageInfo) extends CommonStreamingMessage

final case class DisconnectMessageInfo(code: DisconnectionCode, stream_name: String, reason: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LimitNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** These messages indicate that a filtered stream has matched more Tweets
  * than its current rate limit allows to be delivered. Limit notices contain
  * a total count of the number of undelivered Tweets since the connection was opened,
  * making them useful for tracking counts of track terms, for example.
  * Note that the counts do not specify which filter predicates undelivered messages matched.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class LimitNotice(limit: LimitTrack) extends CommonStreamingMessage

final case class LimitTrack(track: Long)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LocationDeletionNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** These messages indicate that geolocated data must be stripped from a range of Tweets.
  * Clients must honor these messages by deleting geocoded data from Tweets which fall before
  * the given status ID and belong to the specified user. These messages may also arrive before
  * a Tweet which falls into the specified range, although this is rare.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class LocationDeletionNotice(scrub_geo: LocationDeletionId) extends CommonStreamingMessage

final case class LocationDeletionId(user_id: Long,
                                    user_id_str: String,
                                    up_to_status_id: Long,
                                    up_to_status_id_str: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusDeletionNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** These messages indicate that a given Tweet has been deleted.
  * Client code must honor these messages by clearing the referenced Tweet from memory and any
  * storage or archive, even in the rare case where a deletion message arrives earlier
  * in the stream that the Tweet it references.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class StatusDeletionNotice(delete: StatusDeletionNoticeInfo) extends CommonStreamingMessage

final case class StatusDeletionNoticeInfo(status: StatusDeletionId)

final case class StatusDeletionId(id: Long, id_str: String, user_id: Long, user_id_str: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusWithheldNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** These events contain an id field indicating the status ID, a user_id indicating the user,
  * and a collection of withheld_in_countries uppercase two-letter country codes.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class StatusWithheldNotice(status_withheld: StatusWithheldId) extends CommonStreamingMessage

final case class StatusWithheldId(id: Long, user_id: Long, withheld_in_countries: List[String])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/UserWithheldNotice.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** These events contain an id field indicating the user ID and a collection of
  * withheld_in_countries uppercase two-letter country codes.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class UserWithheldNotice(user_withheld: UserWithheldId) extends CommonStreamingMessage

final case class UserWithheldId(id: Long, withheld_in_countries: List[String])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/WarningMessage.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.common

import com.danielasfregola.twitter4s.entities.streaming.CommonStreamingMessage

/** When connected to a stream using the stall_warnings parameter,
  * you may receive status notices indicating the current health of the connection.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
final case class WarningMessage(warning: WarningMessageInfo) extends CommonStreamingMessage

final case class WarningMessageInfo(code: String,
                                    message: String,
                                    percent_full: Option[Int] = None,
                                    user_id: Option[Long] = None)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/ControlMessage.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.site

import com.danielasfregola.twitter4s.entities.streaming.SiteStreamingMessage

/** New Site Streams connections will receive a control message which may be used to modify the Site Streams connection without reconnecting.
  * See <a href="https://dev.twitter.com/streaming/sitestreams/controlstreams" target="_blank">Control Streams for Site Streams</a> for details. Note that this message will not necessarily be the first message delivered on a Site Streams connection.
  * For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
  */
final case class ControlMessage(control: ControlMessageInfo) extends SiteStreamingMessage

final case class ControlMessageInfo(control_uri: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelop.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.site

import com.danielasfregola.twitter4s.entities.streaming._
import com.danielasfregola.twitter4s.entities.streaming.common.WarningMessage
import com.danielasfregola.twitter4s.entities.streaming.user._
import com.danielasfregola.twitter4s.entities.{DirectMessage, Tweet}

/** Site Streams are sent the same messages as User Streams (including friends lists in the preamble),
  * but for multiple users instead of a single user.The same types of messages are streamed, but to identify the target of each message,
  * an additional wrapper is placed around every message, except for blank keep-alive lines.
  * For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
  */
abstract class UserEnvelop[T <: StreamingMessage](for_user: Long, message: T) extends SiteStreamingMessage

final case class UserEnvelopTweet(for_user: Long, message: Tweet) extends UserEnvelop(for_user, message)

final case class UserEnvelopDirectMessage(for_user: Long, message: DirectMessage) extends UserEnvelop(for_user, message)

final case class UserEnvelopSimpleEvent(for_user: Long, message: SimpleEvent) extends UserEnvelop(for_user, message)

final case class UserEnvelopTweetEvent(for_user: Long, message: TweetEvent) extends UserEnvelop(for_user, message)

final case class UserEnvelopTwitterListEvent(for_user: Long, message: TwitterListEvent)
    extends UserEnvelop(for_user, message)

final case class UserEnvelopFriendsLists(for_user: Long, message: FriendsLists) extends UserEnvelop(for_user, message)

final case class UserEnvelopWarningMessage(for_user: Long, message: WarningMessage)
    extends UserEnvelop(for_user, message)

/** Site Streams are sent the same messages as User Streams (including friends lists in the preamble),
  * but for multiple users instead of a single user.The same types of messages are streamed, but to identify the target of each message,
  * an additional wrapper is placed around every message, except for blank keep-alive lines.
  * For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
  */
abstract class UserEnvelopStringified[T <: StreamingMessage](for_user: String, message: StreamingMessage)
    extends SiteStreamingMessage

final case class UserEnvelopTweetStringified(for_user: String, message: Tweet)
    extends UserEnvelopStringified[Tweet](for_user, message)

final case class UserEnvelopDirectMessageStringified(for_user: String, message: DirectMessage)
    extends UserEnvelopStringified[DirectMessage](for_user, message)

final case class UserEnvelopSimpleEventStringified(for_user: String, message: SimpleEvent)
    extends UserEnvelopStringified[SimpleEvent](for_user, message)

final case class UserEnvelopTweetEventStringified(for_user: String, message: TweetEvent)
    extends UserEnvelopStringified[TweetEvent](for_user, message)

final case class UserEnvelopTwitterListEventStringified(for_user: String, message: TwitterListEvent)
    extends UserEnvelopStringified[TwitterListEvent](for_user, message)

final case class UserEnvelopFriendsListsStringified(for_user: String, message: FriendsLists)
    extends UserEnvelopStringified[FriendsLists](for_user, message)

final case class UserEnvelopWarningMessageStringified(for_user: String, message: WarningMessage)
    extends UserEnvelopStringified[WarningMessage](for_user, message)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/Event.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.user

import java.time.Instant

import com.danielasfregola.twitter4s.entities.enums.EventCode
import com.danielasfregola.twitter4s.entities.enums.SimpleEventCode.SimpleEventCode
import com.danielasfregola.twitter4s.entities.enums.TweetEventCode.TweetEventCode
import com.danielasfregola.twitter4s.entities.enums.TwitterListEventCode.TwitterListEventCode
import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage
import com.danielasfregola.twitter4s.entities.{Tweet, TwitterList, User}

/** Notifications about non-Tweet events are also sent over a user stream.
  * The values present will be different based on the type of event.
  * For more information see
  * <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>.
  */
abstract class Event[T](created_at: Instant,
                        event: EventCode#Value,
                        target: User,
                        source: User,
                        target_object: Option[T])
    extends UserStreamingMessage

final case class SimpleEvent(created_at: Instant,
                             event: SimpleEventCode,
                             target: User,
                             source: User,
                             target_object: Option[String])
    extends Event(created_at, event, target, source, target_object)

final case class TweetEvent(created_at: Instant,
                            event: TweetEventCode,
                            target: User,
                            source: User,
                            target_object: Tweet)
    extends Event(created_at, event, target, source, Some(target_object))

final case class TwitterListEvent(created_at: Instant,
                                  event: TwitterListEventCode,
                                  target: User,
                                  source: User,
                                  target_object: TwitterList)
    extends Event(created_at, event, target, source, Some(target_object))


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/FriendsLists.scala
================================================
package com.danielasfregola.twitter4s.entities.streaming.user

import com.danielasfregola.twitter4s.entities.streaming.UserStreamingMessage

/** Upon establishing a User Stream connection, Twitter will send a preamble before starting regular message delivery.
  * This preamble contains a list of the user’s friends. This is represented as an array of user ids as longs.
  * For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
  */
final case class FriendsLists(friends: Seq[Long]) extends UserStreamingMessage

/** Upon establishing a User Stream connection, Twitter will send a preamble before starting regular message delivery.
  * This preamble contains a list of the user’s friends. This is represented as an array of user ids as strings.
  * For more information see <a href="https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types" target="_blank">
  *   https://developer.twitter.com/en/docs/tweets/filter-realtime/guides/streaming-message-types</a>
  */
final case class FriendsListsStringified(friends: Seq[String]) extends UserStreamingMessage


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Error.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

final case class Error(detail: String,
                       field: Option[String],
                       parameter: Option[String],
                       resource_id: Option[String],
                       resource_type: Option[String],
                       section: Option[String],
                       title: String,
                       `type`: Option[String],
                       value: Option[String])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Media.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

import com.danielasfregola.twitter4s.entities.v2.enums.MediaType.MediaType

final case class Media(media_key: String,
                       `type`: MediaType,
                       duration_ms: Option[Int],
                       height: Option[Int],
                       non_public_metrics: Option[MediaNonPublicMetrics],
                       organic_metrics: Option[MediaOrganicMetrics],
                       preview_image_url: Option[String],
                       promoted_metrics: Option[MediaPromotedMetrics],
                       public_metrics: Option[MediaPublicMetrics],
                       url: Option[String],
                       width: Option[Int])

final case class MediaNonPublicMetrics(playback_0_count: Int,
                                       playback_100_count: Int,
                                       playback_25_count: Int,
                                       playback_50_count: Int,
                                       playback_75_count: Int)

final case class MediaOrganicMetrics(playback_0_count: Int,
                                     playback_100_count: Int,
                                     playback_25_count: Int,
                                     playback_50_count: Int,
                                     playback_75_count: Int,
                                     view_count: Int)

final case class MediaPromotedMetrics(playback_0_count: Int,
                                      playback_100_count: Int,
                                      playback_25_count: Int,
                                      playback_50_count: Int,
                                      playback_75_count: Int,
                                      view_count: Int)

final case class MediaPublicMetrics(view_count: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Meta.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

final case class Meta(result_count: Int,
                      newest_id: Option[String],
                      oldest_id: Option[String],
                      next_token: Option[String],
                      previous_token: Option[String])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Place.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

// https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place
final case class Place(full_name: String,
                       id: String,
                       contained_within: Seq[String],
                       country: Option[String],
                       country_code: Option[String],
                       geo: Option[GeoJSON],
                       name: Option[String],
                       place_type: Option[String])

final case class GeoJSON(value: String) extends AnyVal


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Poll.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

import java.time.Instant

// https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll
final case class Poll(id: String,
                      options: Seq[PollOption],
                      duration_minutes: Option[Int],
                      end_datetime: Option[Instant],
                      voting_status: Option[String])

final case class PollOption(position: Int, label: String, votes: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Tweet.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

import com.danielasfregola.twitter4s.entities.v2.enums.CoordinatesType.CoordinatesType
import com.danielasfregola.twitter4s.entities.v2.enums.ReferencedTweetType.ReferencedTweetType
import com.danielasfregola.twitter4s.entities.v2.enums.TweetReplySetting.TweetReplySetting
import java.time.Instant

final case class Tweet(id: String,
                       text: String,
                       attachments: Option[TweetAttachments],
                       author_id: Option[String],
                       context_annotations: Option[Seq[TweetContextAnnotation]],
                       conversation_id: Option[String],
                       created_at: Option[Instant],
                       entities: Option[TweetEntities],
                       geo: Option[TweetGeo],
                       in_reply_to_user_id: Option[String],
                       lang: Option[String],
                       non_public_metrics: Option[TweetNonPublicMetrics],
                       organic_metrics: Option[TweetOrganicMetrics],
                       possibly_sensitive: Option[Boolean],
                       promoted_metrics: Option[TweetPromotedMetrics],
                       public_metrics: Option[TweetPublicMetrics],
                       referenced_tweets: Option[Seq[TweetReferencedTweet]],
                       reply_settings: Option[TweetReplySetting],
                       source: Option[String],
                       withheld: Option[Withheld])

final case class TweetAttachments(media_keys: Seq[String], poll_ids: Seq[String])

final case class TweetContextAnnotation(domain: TweetDomain, entity: TweetEntity)

final case class TweetGeo(coordinates: Option[TweetCoordinates], place_id: Option[String])

final case class TweetCoordinates(`type`: CoordinatesType, coordinates: (Double, Double))

final case class TweetNonPublicMetrics(impression_count: Int, url_link_clicks: Option[Int], user_profile_clicks: Int)

final case class TweetOrganicMetrics(impression_count: Int,
                                     url_link_clicks: Option[Int],
                                     user_profile_clicks: Int,
                                     retweet_count: Int,
                                     reply_count: Int,
                                     like_count: Int)

final case class TweetPromotedMetrics(impression_count: Int,
                                      url_link_clicks: Option[Int],
                                      user_profile_clicks: Int,
                                      retweet_count: Int,
                                      reply_count: Int,
                                      like_count: Int)

final case class TweetPublicMetrics(retweet_count: Int, reply_count: Int, like_count: Int, quote_count: Int)

final case class TweetReferencedTweet(`type`: ReferencedTweetType, id: String)

final case class TweetDomain(id: String, name: String, description: Option[String])

final case class TweetEntity(id: String, name: String, description: Option[String])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetEntities.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

final case class TweetEntities(annotations: Seq[TweetEntitiesAnnotation],
                               urls: Seq[TweetEntitiesURL],
                               hashtags: Seq[TweetEntitiesHashtag],
                               mentions: Seq[TweetEntitiesMention],
                               cashtags: Seq[TweetEntitiesCashtag])

final case class TweetEntitiesAnnotation(start: Int,
                                         end: Int,
                                         probability: Float,
                                         `type`: String,
                                         normalized_text: String)

final case class TweetEntitiesURL(start: Int,
                                  end: Int,
                                  url: String,
                                  expanded_url: String,
                                  display_url: String,
                                  unwound_url: Option[String])

final case class TweetEntitiesHashtag(start: Int, end: Int, tag: String)

final case class TweetEntitiesMention(start: Int, end: Int, username: Option[String], id: Option[String])

final case class TweetEntitiesCashtag(start: Int, end: Int, tag: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetIncludes.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

final case class TweetIncludes(tweets: Seq[Tweet],
                               users: Seq[User],
                               media: Seq[Media],
                               places: Seq[Place],
                               polls: Seq[Poll])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/User.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

import java.time.Instant

final case class User(id: String,
                      name: String,
                      username: String,
                      created_at: Option[Instant],
                      `protected`: Option[Boolean],
                      withheld: Option[Withheld],
                      location: Option[String],
                      url: Option[String],
                      description: Option[String],
                      verified: Option[Boolean],
                      entities: Option[UserEntities],
                      profile_image_url: Option[String],
                      public_metrics: Option[UserPublicMetrics],
                      pinned_tweet_id: Option[String])

final case class UserPublicMetrics(followers_count: Int, following_count: Int, tweet_count: Int, listed_count: Int)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserEntities.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

final case class UserEntities(url: Option[UserURLContainer], description: Option[UserEntitiesDescription])

final case class UserURLContainer(urls: Seq[UserEntitiesURL])

final case class UserEntitiesURL(start: Int, end: Int, url: String, expanded_url: String, display_url: String)

final case class UserEntitiesDescription(urls: Seq[UserEntitiesURL],
                                         hashtags: Seq[UserEntitiesHashtag],
                                         mentions: Seq[UserEntitiesMention],
                                         cashtags: Seq[UserEntitiesCashtag])

final case class UserEntitiesHashtag(start: Int, end: Int, tag: String)

final case class UserEntitiesMention(start: Int, end: Int, username: String)

final case class UserEntitiesCashtag(start: Int, end: Int, tag: String)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserIncludes.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

case class UserIncludes(tweets: Seq[Tweet], users: Seq[User])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/Withheld.scala
================================================
package com.danielasfregola.twitter4s.entities.v2

import com.danielasfregola.twitter4s.entities.v2.enums.WithheldScope.WithheldScope

final case class Withheld(copyright: Boolean, country_codes: Seq[String], scope: WithheldScope)


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/CoordinatesType.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums

object CoordinatesType extends Enumeration {
  type CoordinatesType = Value

  val Point = Value("Point")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/MediaType.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums

object MediaType extends Enumeration {
  type MediaType = Value

  val AnimatedGIF = Value("animated_gif")
  val Photo = Value("photo")
  val Video = Value("video")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/ReferencedTweetType.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums

object ReferencedTweetType extends Enumeration {
  type ReferencedTweetType = Value

  val Retweeted = Value("retweeted")
  val Quoted = Value("quoted")
  val RepliedTo = Value("replied_to")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/TweetReplySetting.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums

object TweetReplySetting extends Enumeration {
  type TweetReplySetting = Value

  val Everyone = Value("everyone")
  val MentionedUsers = Value("mentioned_users")
  val Followers = Value("followers")
  val Following = Value("following")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/WithheldScope.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums

object WithheldScope extends Enumeration {
  type WithheldScope = Value

  val Tweet = Value("tweet")
  val User = Value("user")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/TweetExpansions.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.expansions

object TweetExpansions extends Enumeration {
  type TweetExpansions = Value

  val `Attachments.PollIds` = Value("attachments.poll_ids")
  val `Attachments.MediaKeys` = Value("attachments.media_keys")
  val AuthorId = Value("author_id")
  val `Entities.Mentions.Username` = Value("entities.mentions.username")
  val `Geo.PlaceId` = Value("geo.place_id")
  val InReplyToUser = Value("in_reply_to_user_id")
  val `ReferencedTweets.Id` = Value("referenced_tweets.id")
  val `ReferencedTweets.Id.AuthorId` = Value("referenced_tweets.id.author_id")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/UserExpansions.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.expansions

object UserExpansions extends Enumeration {
  type UserExpansions = Value

  val PinnedTweetId = Value("pinned_tweet_id")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/MediaFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields

object MediaFields extends Enumeration {
  type MediaFields = Value

  val DurationMs = Value("duration_ms")
  val Height = Value("height")
  val MediaKey = Value("media_key")
  val PreviewImageUrl = Value("preview_image_url")
  val Type = Value("type")
  val Url = Value("url")
  val Width = Value("width")
  val PublicMetrics = Value("public_metrics")
  val NonPublicMetrics = Value("non_public_metrics")
  val OrganicMetrics = Value("organic_metrics")
  val PromotedMetrics = Value("promoted_metrics")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PlaceFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields

object PlaceFields extends Enumeration {
  type PlaceFields = Value

  val ContainedWithin = Value("contained_within")
  val Country = Value("country")
  val CountryCode = Value("country_code")
  val FullName = Value("full_name")
  val Geo = Value("geo")
  val Id = Value("id")
  val Name = Value("name")
  val PlaceType = Value("place_type")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PollFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields

object PollFields extends Enumeration {
  type PollFields = Value

  val DurationMinutes = Value("duration_minutes")
  val EndDatetime = Value("end_datetime")
  val Id = Value("id")
  val Options = Value("options")
  val VotingStatus = Value("voting_status")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/TweetFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields

object TweetFields extends Enumeration {
  type TweetFields = Value

  val Attachments = Value("attachments")
  val AuthorId = Value("author_id")
  val ContextAnnotations = Value("context_annotations")
  val ConversationId = Value("conversation_id")
  val CreatedAt = Value("created_at")
  val Entities = Value("entities")
  val Geo = Value("geo")
  val Id = Value("id")
  val InReplyToUserId = Value("in_reply_to_user_id")
  val Lang = Value("lang")
  val NonPublicMetrics = Value("non_public_metrics")
  val PublicMetrics = Value("public_metrics")
  val OrganicMetrics = Value("organic_metrics")
  val PromotedMetrics = Value("promoted_metrics")
  val PossiblySensitive = Value("possibly_sensitive")
  val ReferencedTweets = Value("referenced_tweets")
  val ReplySettings = Value("reply_settings")
  val Source = Value("source")
  val Text = Value("text")
  val Withheld = Value("withheld")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/UserFields.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.fields

object UserFields extends Enumeration {
  type UserFields = Value

  val CreatedAt = Value("created_at")
  val Description = Value("description")
  val Entities = Value("entities")
  val Id = Value("id")
  val Location = Value("location")
  val Name = Value("name")
  val PinnedTweetId = Value("pinned_tweet_id")
  val ProfileImageUrl = Value("profile_image_url")
  val Protected = Value("protected")
  val PublicMetrics = Value("public_metrics")
  val Url = Value("url")
  val Username = Value("username")
  val Verified = Value("verified")
  val Withheld = Value("withheld")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/rest/TimelineExclude.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.enums.rest

object TimelineExclude extends Enumeration {
  type TimelineExclude = Value

  val Retweets = Value("retweets")
  val Replies = Value("replies")
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses

import com.danielasfregola.twitter4s.entities.v2.{Error, TweetIncludes, Tweet}

final case class TweetResponse(data: Option[Tweet], includes: Option[TweetIncludes], errors: Seq[Error])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetsResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses

import com.danielasfregola.twitter4s.entities.v2.{Error, Meta, Tweet, TweetIncludes}

final case class TweetsResponse(data: Seq[Tweet],
                                includes: Option[TweetIncludes],
                                meta: Option[Meta],
                                errors: Seq[Error])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UserResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses

import com.danielasfregola.twitter4s.entities.v2.{Error, UserIncludes, User}

case class UserResponse(data: Option[User], includes: Option[UserIncludes], errors: Seq[Error])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UsersResponse.scala
================================================
package com.danielasfregola.twitter4s.entities.v2.responses

import com.danielasfregola.twitter4s.entities.v2.{User, UserIncludes, Error}

case class UsersResponse(data: Seq[User], includes: Option[UserIncludes], errors: Seq[Error])


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/exceptions/TwitterException.scala
================================================
package com.danielasfregola.twitter4s.exceptions

import akka.http.scaladsl.model.StatusCode

final case class TwitterError(message: String, code: Int) {
  override def toString = s"$message ($code)"
}

final case class Errors(errors: TwitterError*) {
  override def toString = errors.mkString(", ")
}

object Errors {

  def apply(throwable: Throwable): Errors = {
    val error = TwitterError(throwable.getMessage, code = -1)
    apply(error)
  }

  def apply(msg: String): Errors = {
    val error = TwitterError(msg, code = -1)
    apply(error)
  }
}

final case class TwitterException(code: StatusCode, errors: Errors) extends Exception(s"[$code] $errors")

object TwitterException {

  def apply(code: StatusCode, msg: String): TwitterException = {
    val error = TwitterError(msg, code.intValue)
    TwitterException(code, Errors(error))
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/Client.scala
================================================
package com.danielasfregola.twitter4s.http.clients

import akka.actor.ActorSystem
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.stream.Materializer
import akka.stream.scaladsl.{Sink, Source}
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider

import scala.concurrent.Future

trait Client extends OAuthClient {

  val withLogRequest = false
  val withLogRequestResponse = true

  def oauthProvider: OAuth1Provider

  protected def sendAndReceive[T](request: HttpRequest, f: HttpResponse => Future[T])(
      implicit system: ActorSystem,
      materializer: Materializer): Future[T] = {
    implicit val r: HttpRequest = request
    val requestStartTime = System.currentTimeMillis

    if (withLogRequest) logRequest

    Source
      .single(request)
      .via(connection)
      .mapAsync(1)(implicit response => unmarshal(requestStartTime, f))
      .runWith(Sink.head)
  }

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/CommonClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.{HttpEntity, HttpRequest, HttpResponse}
import akka.stream.Materializer
import com.danielasfregola.twitter4s.exceptions.{Errors, TwitterException}
import com.danielasfregola.twitter4s.http.serializers.JsonSupport
import com.typesafe.scalalogging.LazyLogging
import org.json4s.native.Serialization

import scala.concurrent.Future
import scala.concurrent.duration._
import scala.util.Try

private[twitter4s] trait CommonClient extends JsonSupport with LazyLogging {

  def withLogRequest: Boolean
  def withLogRequestResponse: Boolean

  protected def connection(implicit request: HttpRequest, system: ActorSystem) = {
    val scheme = request.uri.scheme
    val host = request.uri.authority.host.toString
    val port = request.uri.effectivePort
    if (scheme == "https") Http().outgoingConnectionHttps(host, port)
    else Http().outgoingConnection(host, port)
  }

  protected def unmarshal[T](requestStartTime: Long, f: HttpResponse => Future[T])(implicit request: HttpRequest,
                                                                                   response: HttpResponse,
                                                                                   materializer: Materializer) = {
    implicit val ec = materializer.executionContext
    if (withLogRequestResponse) logRequestResponse(requestStartTime)

    if (response.status.isSuccess) f(response)
    else parseFailedResponse(response).flatMap(Future.failed)
  }

  protected def parseFailedResponse(response: HttpResponse)(implicit materializer: Materializer) = {
    implicit val ec = materializer.executionContext
    response.entity.toStrict(50 seconds).map { sink =>
      val body = sink.data.utf8String
      val errors = Try {
        Serialization.read[Errors](body)
      } getOrElse Errors(body)
      TwitterException(response.status, errors)
    }
  }

  // TODO - logRequest, logRequestResponse customisable?
  def logRequest(implicit request: HttpRequest, materializer: Materializer): HttpRequest = {
    implicit val ec = materializer.executionContext
    logger.info(s"${request.method.value} ${request.uri}")
    if (logger.underlying.isDebugEnabled) {
      for {
        requestBody <- toBody(request.entity)
      } yield logger.debug(s"${request.method.value} ${request.uri} | $requestBody")
    }
    request
  }

  def logRequestResponse(requestStartTime: Long)(implicit request: HttpRequest,
                                                 materializer: Materializer): HttpResponse => HttpResponse = {
    response =>
      implicit val ec = materializer.executionContext
      val elapsed = System.currentTimeMillis - requestStartTime
      logger.info(s"${request.method.value} ${request.uri} (${response.status}) | ${elapsed}ms")
      if (logger.underlying.isDebugEnabled) {
        for {
          responseBody <- toBody(response.entity)
        } yield
          logger.debug(
            s"${request.method.value} ${request.uri} (${response.status}) | ${response.headers.mkString(", ")} | $responseBody")
      }
      response
  }

  private def toBody(entity: HttpEntity)(implicit materializer: Materializer): Future[String] = {
    implicit val ec = materializer.executionContext
    entity.toStrict(5 seconds).map(_.data.decodeString("UTF-8"))
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/OAuthClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients

import akka.http.scaladsl.client.RequestBuilding
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import akka.stream.Materializer
import com.danielasfregola.twitter4s.http.marshalling.{BodyEncoder, Parameters}
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider

import scala.concurrent.{ExecutionContext, Future}

private[twitter4s] trait OAuthClient extends CommonClient with RequestBuilding {

  def oauthProvider: OAuth1Provider

  def withOAuthHeader(callback: Option[String])(
      implicit materializer: Materializer): HttpRequest => Future[HttpRequest] = { request =>
    implicit val ec = materializer.executionContext
    for {
      authorizationHeader <- oauthProvider.oauth1Header(callback)(request, materializer)
    } yield request.withHeaders(request.headers :+ authorizationHeader)
  }

  def withSimpleOAuthHeader(callback: Option[String])(
      implicit materializer: Materializer): HttpRequest => Future[HttpRequest] = { request =>
    implicit val ec = materializer.executionContext
    for {
      authorizationHeader <- oauthProvider.oauth1Header(callback)(request.withEntity(HttpEntity.Empty), materializer)
    } yield request.withHeaders(request.headers :+ authorizationHeader)
  }

  override val Get = new OAuthRequestBuilder(GET)
  override val Post = new OAuthRequestBuilder(POST)
  override val Put = new OAuthRequestBuilder(PUT)
  override val Patch = new OAuthRequestBuilder(PATCH)
  override val Delete = new OAuthRequestBuilder(DELETE)
  override val Options = new OAuthRequestBuilder(OPTIONS)
  override val Head = new OAuthRequestBuilder(HEAD)

  private[twitter4s] class OAuthRequestBuilder(method: HttpMethod) extends RequestBuilder(method) with BodyEncoder {

    def apply(uri: String, parameters: Parameters): HttpRequest =
      if (parameters.toString.nonEmpty) apply(s"$uri?$parameters") else apply(uri)

    def apply(uri: String, content: Product): HttpRequest = {
      val data = toBodyAsEncodedParams(content)
      val contentType = ContentType(MediaTypes.`application/x-www-form-urlencoded`)
      apply(uri, data, contentType)
    }

    def asJson[A <: AnyRef](uri: String, content: A): HttpRequest = {
      val jsonData = org.json4s.native.Serialization.write(content)
      val contentType = ContentType(MediaTypes.`application/json`)
      apply(uri, jsonData, contentType)
    }

    def apply(uri: String, content: Product, contentType: ContentType): HttpRequest = {
      val data = toBodyAsParams(content)
      apply(uri, data, contentType)
    }

    def apply(uri: String, data: String, contentType: ContentType): HttpRequest =
      apply(uri).withEntity(HttpEntity(data).withContentType(contentType))

    def apply(uri: String, multipartFormData: Multipart.FormData)(implicit ec: ExecutionContext): HttpRequest =
      apply(Uri(uri), Some(multipartFormData))

  }

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/AuthenticationClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.authentication

import akka.actor.ActorSystem
import akka.http.scaladsl.model.HttpRequest
import akka.stream.{ActorMaterializer, Materializer}
import com.danielasfregola.twitter4s.entities.ConsumerToken
import com.danielasfregola.twitter4s.http.clients.Client
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider
import com.danielasfregola.twitter4s.http.serializers.{FormSupport, FromMap}

import scala.concurrent.Future

private[twitter4s] class AuthenticationClient(val consumerToken: ConsumerToken)(implicit val system: ActorSystem)
    extends Client {

  lazy val oauthProvider = new OAuth1Provider(consumerToken, None)

  private[twitter4s] implicit class RichRestHttpRequest(val request: HttpRequest) {
    implicit val materializer = ActorMaterializer()
    implicit val ec = materializer.executionContext

    def respondAs[T: Manifest](implicit fromMap: FromMap[T]): Future[T] = respondAs[T](None)

    def respondAs[T: Manifest](callback: Option[String])(implicit fromMap: FromMap[T]): Future[T] =
      for {
        requestWithAuth <- withOAuthHeader(callback)(materializer)(request)
        t <- sendReceiveAs[T](requestWithAuth)
      } yield t
  }

  def sendReceiveAs[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem,
                                                           materializer: Materializer,
                                                           fromMap: FromMap[T]): Future[T] = {
    sendAndReceive(httpRequest, response => FormSupport.unmarshallText(response))
  }

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/TwitterOAuthClient.scala
================================================
package com.danielasfregola.twitter4s.http
package clients.authentication.oauth

import com.danielasfregola.twitter4s.entities.authentication.{OAuthAccessToken, OAuthRequestToken, RequestToken}
import com.danielasfregola.twitter4s.entities.enums.AccessType.AccessType
import com.danielasfregola.twitter4s.http.clients.authentication.AuthenticationClient
import com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters.{
  AccessTokenParameters,
  RequestTokenParameters
}
import com.danielasfregola.twitter4s.util.Configurations._

import scala.concurrent.Future

/** Implements the available requests for the `oauth` resource.
  * */
trait TwitterOAuthClient {

  protected val authenticationClient: AuthenticationClient

  private val oauthUrl = s"$apiTwitterUrl/oauth"

  /** Allows a Consumer application to obtain an OAuth Request Token to request user authorization.
    * This method fulfills <a href="http://oauth.net/core/1.0/#auth_step1">Section 6.1</a> of the
    * <a href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/request_token" target="_blank">
    *   https://developer.twitter.com/en/docs/basics/authentication/api-reference/request_token</a>.
    *
    * @param oauth_callback : Optional, by default is `None`.
    *                         For OAuth 1.0a compliance this parameter is required.
    *                         The value you specify here will be used as the URL a user is redirected
    *                         to should they approve your application’s access to their account.
    *                         Set this to oob for out-of-band pin mode. This is also how you specify
    *                         custom callbacks for use in desktop/mobile applications.
    * @param x_auth_access_type : Optional, by default is `None`.
    *                             Overrides the access level an application requests to a users account.
    *                             Supported values are read or write . This parameter is intended to
    *                             allow a developer to register a read/write application but also request
    *                             read only access when appropriate.
    * @return : The authentication request token.
    * */
  def requestToken(oauth_callback: Option[String] = None,
                   x_auth_access_type: Option[AccessType] = None): Future[OAuthRequestToken] = {
    import authenticationClient._
    val parameters = RequestTokenParameters(x_auth_access_type)
    Post(s"$oauthUrl/request_token", parameters).respondAs[OAuthRequestToken](oauth_callback)
  }

  /** Allows a Consumer application to use an OAuth request_token to request user authorization.
    * This method is a replacement of <a href="http://oauth.net/core/1.0/#auth_step2">Section 6.2</a>
    * of the <a href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>
    * for applications using the callback authentication flow.
    * The method will use the currently logged in user as the account for access authorization unless
    * the `force_login` parameter is set to true.
    * This method differs from [[authorizeUrl]] in that if the user has already granted the application permission,
    * the redirect will occur without the user having to re-approve the application.
    * To realize this behavior, you must enable the `Use Sign in with Twitter` setting on your
    * <a href="https://apps.twitter.com/">application record</a>.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate" target="_blank">
    *   https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate</a>.
    *
    * @param token : The OAuthRequestToken.token obtained from [[requestToken]]
    * @param force_login : By default is `false`. When set to `true`, it forces the user to
    *                      enter their credentials to ensure the correct users account is authorized.
    * @param screen_name : Optional, by default it is `None`.
    *                      It prefills the username input box of the OAuth login screen with the given value.
    * @return : The authentication url to use in a web browser for the user to complete the authentication process.
    * */
  def authenticateUrl(token: RequestToken, force_login: Boolean = false, screen_name: Option[String] = None): String =
    genericOAuthUrl("authenticate")(token, force_login, screen_name)

  /** Allows a Consumer application to use an OAuth Request Token to request user authorization.
    * This method fulfills <a href="http://oauth.net/core/1.0/#auth_step2">Section 6.2</a>
    * of the <a href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
    * Desktop applications must use this method (and cannot use [[authenticateUrl]]).
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate" target="_blank">
    *   https://developer.twitter.com/en/docs/basics/authentication/api-reference/authenticate</a>.
    *
    * @param token : The OAuthRequestToken.token obtained from [[requestToken]]
    * @param force_login : By default is `false`. When set to `true`, it forces the user to
    *                      enter their credentials to ensure the correct users account is authorized.
    * @param screen_name : Optional, by default it is `None`.
    *                      It prefills the username input box of the OAuth login screen with the given value.
    * @return : The url to use in a web browser for the user to complete the authorization process.
    * */
  def authorizeUrl(token: RequestToken, force_login: Boolean = false, screen_name: Option[String] = None): String =
    genericOAuthUrl("authorize")(token, force_login, screen_name)

  private def genericOAuthUrl(
      path: String)(token: RequestToken, force_login: Boolean, screen_name: Option[String]): String = {
    val params = {
      val queryParams = List(Some("oauth_token" -> token.key),
                             Some("force_login" -> force_login),
                             screen_name.map(n => "screen_name" -> n))
      queryParams.flatten.map { case (key, value) => s"$key=$value" }.mkString("&")
    }
    s"$oauthUrl/$path?$params"
  }

  /** Allows a Consumer application to exchange the OAuth Request Token for an OAuth Access Token using xAuth.
    * This method fulfills <a class="reference external" href="http://oauth.net/core/1.0/#auth_step3">Section 6.3</a>
    * of the <a class="reference external" href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token" target="_blank">
    *   https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token</a>.
    *
    * @param x_auth_username : The username of the user to obtain a token for.
    * @param x_auth_password : The password of the user for which to obtain a token for.
    * @return : The access token for the requested user.
    * */
  def accessToken(x_auth_username: String, x_auth_password: String): Future[OAuthAccessToken] = {
    val parameters = AccessTokenParameters(x_auth_username = Some(x_auth_username),
                                           x_auth_password = Some(x_auth_password),
                                           x_auth_mode = Some("client_auth"))
    import authenticationClient._
    Post(s"$oauthUrl/access_token", parameters).respondAs[OAuthAccessToken]
  }

  /** Allows a Consumer application to exchange the OAuth Request Token for an OAuth Access Token using OAuth 1.0.
    * This method fulfills <a class="reference external" href="http://oauth.net/core/1.0/#auth_step3">Section 6.3</a>
    * of the <a class="reference external" href="http://oauth.net/core/1.0/#anchor9">OAuth 1.0 authentication flow</a>.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token" target="_blank">
    *   https://developer.twitter.com/en/docs/basics/authentication/api-reference/access_token</a>.
    *
    * @param token : The OAuthRequestToken.token obtained from [[requestToken]]
    * @param oauth_verifier : the `oauth_verifier` returned in the callback of the URL
    *                         provided by [[authenticateUrl]] or [[authorizeUrl]].
    * @return : The access token for the requested user.
    * */
  def accessToken(token: RequestToken, oauth_verifier: String): Future[OAuthAccessToken] = {
    val parameters = AccessTokenParameters(oauth_token = Some(token.key), oauth_verifier = Some(oauth_verifier))
    import authenticationClient._
    Post(s"$oauthUrl/access_token", parameters).respondAs[OAuthAccessToken]
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/AccessTokenParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters

import com.danielasfregola.twitter4s.http.marshalling.Parameters

private[twitter4s] final case class AccessTokenParameters(x_auth_username: Option[String] = None,
                                                          x_auth_password: Option[String] = None,
                                                          x_auth_mode: Option[String] = None,
                                                          oauth_verifier: Option[String] = None,
                                                          oauth_token: Option[String] = None)
    extends Parameters


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/RequestTokenParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters

import com.danielasfregola.twitter4s.entities.enums.AccessType.AccessType
import com.danielasfregola.twitter4s.http.marshalling.Parameters

private[twitter4s] final case class RequestTokenParameters(x_auth_access_type: Option[AccessType]) extends Parameters


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/RestClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest

import akka.actor.ActorSystem
import akka.http.scaladsl.model.{HttpRequest, HttpResponse}
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.{ActorMaterializer, Materializer}
import com.danielasfregola.twitter4s.entities.{AccessToken, ConsumerToken, RateLimit, RatedData}
import com.danielasfregola.twitter4s.http.clients.Client
import com.danielasfregola.twitter4s.http.oauth.OAuth1Provider

import scala.concurrent.Future

private[twitter4s] class RestClient(val consumerToken: ConsumerToken, val accessToken: AccessToken)(
    implicit val system: ActorSystem)
    extends Client {

  lazy val oauthProvider = new OAuth1Provider(consumerToken, Some(accessToken))

  private[twitter4s] implicit class RichRestHttpRequest(val request: HttpRequest) {

    implicit val materializer = ActorMaterializer()
    implicit val ec = materializer.executionContext

    def respondAs[T: Manifest]: Future[T] =
      for {
        requestWithAuth <- withOAuthHeader(None)(materializer)(request)
        t <- sendReceiveAs[T](requestWithAuth)
      } yield t

    def respondAsRated[T: Manifest]: Future[RatedData[T]] =
      for {
        requestWithAuth <- withOAuthHeader(None)(materializer)(request)
        t <- sendReceiveAsRated[T](requestWithAuth)
      } yield t

    def sendAsFormData: Future[Unit] =
      for {
        requestWithAuth <- withSimpleOAuthHeader(None)(materializer)(request)
        _ <- sendIgnoreResponse(requestWithAuth)
      } yield ()
  }

  def sendIgnoreResponse(httpRequest: HttpRequest)(implicit system: ActorSystem,
                                                   materializer: Materializer): Future[Unit] = {
    sendAndReceive(httpRequest, _ => Future.successful((): Unit))
  }

  def sendReceiveAs[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem,
                                                           materializer: Materializer): Future[T] = {
    implicit val ec = materializer.executionContext
    implicit val jsonSerialization = serialization
    sendAndReceive(httpRequest, response => Unmarshal(response.entity).to[T])
  }

  def sendReceiveAsRated[T: Manifest](httpRequest: HttpRequest)(implicit system: ActorSystem,
                                                                materializer: Materializer): Future[RatedData[T]] = {
    implicit val ec = materializer.executionContext
    implicit val jsonSerialization = serialization
    val unmarshallRated: HttpResponse => Future[RatedData[T]] = { response =>
      val rate = RateLimit(response.headers)
      val data = Unmarshal(response.entity).to[T]
      data.map(d => RatedData(rate, d))
    }
    sendAndReceive(httpRequest, unmarshallRated)
  }
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/TwitterAccountClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.account

import com.danielasfregola.twitter4s.entities._
import com.danielasfregola.twitter4s.entities.enums.ContributorType.ContributorType
import com.danielasfregola.twitter4s.entities.enums.Hour._
import com.danielasfregola.twitter4s.entities.enums.Language._
import com.danielasfregola.twitter4s.entities.enums.TimeZone._
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.account.parameters.CredentialsParameters
import com.danielasfregola.twitter4s.util.Configurations._

import scala.concurrent.Future

/** Implements the available requests for the `account` resource.
  * */
trait TwitterAccountClient {

  protected val restClient: RestClient

  private val accountUrl = s"$apiTwitterUrl/$twitterVersion/account"

  /** Returns settings (including current trend, geo and sleep time information) for the authenticating user.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-settings" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-settings</a>.
    *
    * @return : The account settings for the authenticating user.
    * */
  def settings(): Future[RatedData[Settings]] = {
    import restClient._
    Get(s"$accountUrl/settings.json").respondAsRated[Settings]
  }

  /** Updates the authenticating user’s settings.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner</a>.
    *
    * @param allow_contributor_request : Optional, by default it is `None`.
    *                                  Whether to allow others to include user as contributor.
    *                                  Possible values include `All` (anyone can include user),
    *                                  `Following` (only followers can include user) or `None`.
    * @param sleep_time_enabled : Optional, by default it is `None`.
    *                           When set to `true`, will enable sleep time for the user.
    *                           Sleep time is the time when push or SMS notifications should not be sent to the user.
    * @param start_sleep_time : Optional, by default it is `None`.
    *                         The hour that sleep time should begin if it is enabled.
    *                         The time is considered to be in the same timezone as the user’s time_zone setting.
    * @param end_sleep_time : Optional, by default it is `None`.
    *                       The hour that sleep time should end if it is enabled.
    *                       The time is considered to be in the same timezone as the user’s time_zone setting.
    * @param lang : Optional, by default it is `None`.
    *             The language which Twitter should render in for this user.
    * @param time_zone  : Optional, by default it is `None`.
    *                  The timezone dates and times should be displayed in for the user.
    * @param trend_location_woeid : Optional, by default it is `None`.
    *                             The Yahoo! Where On Earth ID to use as the user’s default trend location.
    *                             Global information is available by using 1 as the WOEID.
    *                             The woeid must be one of the locations returned by [node:59].
    * @return : The updated settings.
    * */
  def updateSettings(allow_contributor_request: Option[ContributorType] = None,
                     sleep_time_enabled: Option[Boolean] = None,
                     start_sleep_time: Option[Hour] = None,
                     end_sleep_time: Option[Hour] = None,
                     lang: Option[Language] = None,
                     time_zone: Option[TimeZone] = None,
                     trend_location_woeid: Option[Long] = None): Future[Settings] = {
    val options = SettingsOptions(allow_contributor_request,
                                  sleep_time_enabled,
                                  start_sleep_time,
                                  end_sleep_time,
                                  lang,
                                  time_zone,
                                  trend_location_woeid)
    updateSettings(options)
  }

  /** Updates the authenticating user’s settings.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner</a>.
    *
    * @param settings_options : The setting options to update. Only the parameters specified will be updated.
    * @return : The updated settings.
    * */
  def updateSettings(settings_options: SettingsOptions): Future[Settings] = {
    import restClient._
    Post(s"$accountUrl/settings.json", settings_options).respondAs[Settings]
  }

  /** Returns a representation of the requesting user if authentication was successful; it throws a [[com.danielasfregola.twitter4s.exceptions.TwitterException]] if not.
    * Use this method to test if supplied user credentials are valid.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials</a>.
    *
    * @param include_entities : By default it is `true`.
    *                         The parameters node will not be included when set to false.
    * @param skip_status : By default it is `false`.
    *                    When set to either `true` statuses will not be included in the returned user object.
    * @param include_email : By default it is `false`.
    *                      When set to `true` email will be returned in the user objects.
    *                      If the user does not have an email address on their account, or if the email address is un-verified, null will be returned.
    * @return : The user representation.
    * */
  def verifyCredentials(include_entities: Boolean = true,
                        skip_status: Boolean = false,
                        include_email: Boolean = false): Future[RatedData[User]] = {
    import restClient._
    val parameters = CredentialsParameters(include_entities, skip_status, include_email)
    Get(s"$accountUrl/verify_credentials.json", parameters).respondAsRated[User]
  }

  /** Sets the name that users are able to set under the “Account” tab of their settings page.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
    *
    * @param name : Full name associated with the profile. Maximum of 20 characters.
    * @param include_entities : By default it is `true`.
    *                         The parameters node will not be included when set to false.
    * @param skip_status : By default it is `false`.
    *                    When set to either `true` statuses will not be included in the returned user object.
    * @return : The user representation.
    * */
  def updateProfileName(name: String, include_entities: Boolean = true, skip_status: Boolean = false): Future[User] = {
    val update = ProfileUpdate(name = Some(name), include_entities = include_entities, skip_status = skip_status)
    updateProfile(update)
  }

  /** Sets the url that users are able to set under the “Account” tab of their settings page.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
    *
    * @param url : URL associated with the profile. Will be prepended with “http://” if not present.
    *            Maximum of 100 characters.
    * @param include_entities : By default it is `true`.
    *                         The parameters node will not be included when set to false.
    * @param skip_status : By default it is `false`.
    *                    When set to either `true` statuses will not be included in the returned user object.
    * @return : The user representation.
    * */
  def updateProfileUrl(url: String, include_entities: Boolean = true, skip_status: Boolean = false): Future[User] = {
    val update = ProfileUpdate(url = Some(url), include_entities = include_entities, skip_status = skip_status)
    updateProfile(update)
  }

  /** Sets the location that users are able to set under the “Account” tab of their settings page.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
    *
    * @param location : The city or country describing where the user of the account is located.
    *                 The contents are not normalized or geocoded in any way. Maximum of 30 characters.
    * @param include_entities : By default it is `true`.
    *                         The parameters node will not be included when set to false.
    * @param skip_status : By default it is `false`.
    *                    When set to either `true` statuses will not be included in the returned user object.
    * @return : The user representation.
    * */
  def updateProfileLocation(location: String,
                            include_entities: Boolean = true,
                            skip_status: Boolean = false): Future[User] = {
    val update =
      ProfileUpdate(location = Some(location), include_entities = include_entities, skip_status = skip_status)
    updateProfile(update)
  }

  /** Sets the description that users are able to set under the “Account” tab of their settings page.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
    *
    * @param description : A description of the user owning the account. Maximum of 160 characters.
    * @param include_entities : By default it is `true`.
    *                         The parameters node will not be included when set to false.
    * @param skip_status : By default it is `false`.
    *                    When set to either `true` statuses will not be included in the returned user object.
    * @return : The user representation.
    * */
  def updateProfileDescription(description: String,
                               include_entities: Boolean = true,
                               skip_status: Boolean = false): Future[User] = {
    val update =
      ProfileUpdate(description = Some(description), include_entities = include_entities, skip_status = skip_status)
    updateProfile(update)
  }

  /** Sets the link color that users are able to set under the “Account” tab of their settings page.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
    *
    * @param link_color : Sets a hex value that controls the color scheme of links used on the authenticating user’s profile page on twitter.com.
    *                   This must be a valid hexadecimal value, and may be either three or six characters (ex: F00 or FF0000).
    * @param include_entities : By default it is `true`.
    *                         The parameters node will not be included when set to false.
    * @param skip_status : By default it is `false`.
    *                    When set to either `true` statuses will not be included in the returned user object.
    * @return : The user representation.
    * */
  def updateProfileLinkColor(link_color: String,
                             include_entities: Boolean = true,
                             skip_status: Boolean = false): Future[User] = {
    val update = ProfileUpdate(profile_link_color = Some(link_color),
                               include_entities = include_entities,
                               skip_status = skip_status)
    updateProfile(update)
  }

  /** Sets some values that users are able to set under the “Account” tab of their settings page. Only the parameters specified will be updated.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile</a>.
    *
    * @param update : The profile values to update.
    * @return : The user representation.
    * */
  def updateProfile(update: ProfileUpdate): Future[User] = {
    import restClient._
    Post(s"$accountUrl/update_profile.json", update).respondAs[User]
  }

  /** Removes the uploaded profile banner for the authenticating user.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-remove_profile_banner</a>.
    * */
  def removeProfileBanner(): Future[Unit] = {
    import restClient._
    Post(s"$accountUrl/remove_profile_banner.json").respondAs[Unit]
  }

  // TODO - support update_profile_backgroung_image
  // TODO - support update_profile_image
  // TODO - support update_profile_banner
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/parameters/CredentialsParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.account.parameters

import com.danielasfregola.twitter4s.http.marshalling.Parameters

private[twitter4s] final case class CredentialsParameters(include_entities: Boolean,
                                                          skip_status: Boolean,
                                                          include_email: Boolean)
    extends Parameters


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/TwitterAccountActivityClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.accountactivity

import com.danielasfregola.twitter4s.entities._
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.accountactivity.parameters.WebhooksParameters
import com.danielasfregola.twitter4s.util.Configurations._

import scala.concurrent.Future

/** Implements the available requests for the `account_activity` resource.
  * */
trait TwitterAccountActivityClient {

  protected val restClient: RestClient

  private val accountUrl = s"$apiTwitterUrl/$twitterVersion/account_activity/all"

  /** Registers a webhook URL for your environment.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-webhooks" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-webhooks</a>.
    *
    * @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
    * @param url : The encoded URL for the webhook callback endpoint.
    * @return : The webhook representation.
    * */
  def registerWebhook(env_name: String, url: String): Future[Webhook] = {
    import restClient._
    val parameters = WebhooksParameters(url)
    Post(s"$accountUrl/$env_name/webhooks.json", parameters).respondAs[Webhook]
  }

  /** Removes the webhook from the provided application.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-webhooks-webhook-id" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-webhooks-webhook-id</a>.
    *
    * @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
    * @param webhookId : The id of the webhook that you want to remove.
    * */
  def removeWebhook(env_name: String, webhookId: String): Future[Unit] = {
    import restClient._
    Delete(s"$accountUrl/$env_name/webhooks/$webhookId.json").sendAsFormData
  }

  /** Reenables the webhook by setting its status to valid. It triggers the challenge response check (CRC) for the given enviroments webhook for all activites.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#put-account-activity-all-env-name-webhooks-webhook-id" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#put-account-activity-all-env-name-webhooks-webhook-id</a>.
    *
    * @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
    * @param webhookId : The id of the webhook that you want to remove.
    * */
  def reenableWebhook(env_name: String, webhookId: String): Future[Unit] = {
    import restClient._
    Put(s"$accountUrl/$env_name/webhooks/$webhookId.json").sendAsFormData
  }

  /** Subscribes the provided application to all events for the provided environment for all message types.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-subscriptions" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#post-account-activity-all-env-name-subscriptions</a>.
    *
    * @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
    * */
  def subscribeAll(env_name: String): Future[Unit] = {
    import restClient._
    Post(s"$accountUrl/$env_name/subscriptions.json").sendAsFormData
  }

  /** Deactivates subscription(s) for the provided user context and application for all activities.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-subscriptions-deprecated-" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-subscriptions-deprecated-</a>.
    *
    * @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
    * */
  def unsubscribeAll(env_name: String): Future[Unit] = {
    import restClient._
    Delete(s"$accountUrl/$env_name/subscriptions.json").sendAsFormData
  }

  /** Provides a way to determine if a webhook configuration is subscribed to the provided user’s events. If the provided user context has an active subscription with provided application, returns 204 OK. If the response code is not 204, then the user does not have an active subscription.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-env-name-subscriptions" target="_blank">
    *   https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-env-name-subscriptions</a>.
    *
    * @param env_name : The environment name is the name of the App that provide the access to the Account Activity API.
    * */
  def isUserSubscribed(env_name: String): Future[Unit] = {
    import restClient._
    Get(s"$accountUrl/$env_name/subscriptions.json").sendAsFormData
  }

  // The following routes require a Bearer token to authenticate the corresponding requests
  // TODO - GET webhooks.json https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-webhooks
  // TODO - GET subscriptions/count.json https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-subscriptions-count
  // TODO - GET :env_name/subscriptions/list.json https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#get-account-activity-all-env-name-subscriptions-list
  // TODO - DELETE :env_name/subscriptions/:user_id.json (deprecate unsubscribeAll when implementing this endpoint) https://developer.twitter.com/en/docs/accounts-and-users/subscribe-account-activity/api-reference/aaa-premium#delete-account-activity-all-env-name-subscriptions-user-id-json
}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/parameters/WebhooksParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.accountactivity.parameters

import com.danielasfregola.twitter4s.http.marshalling.Parameters

private[twitter4s] final case class WebhooksParameters(url: String) extends Parameters


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/TwitterApplicationClient.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.application

import com.danielasfregola.twitter4s.entities.enums.Resource.Resource
import com.danielasfregola.twitter4s.entities.{RateLimits, RatedData}
import com.danielasfregola.twitter4s.http.clients.rest.RestClient
import com.danielasfregola.twitter4s.http.clients.rest.application.parameters.RatesParameters
import com.danielasfregola.twitter4s.util.Configurations._

import scala.concurrent.Future

/** Implements the available requests for the `application` resource.
  */
trait TwitterApplicationClient {

  protected val restClient: RestClient

  private val applicationUrl = s"$apiTwitterUrl/$twitterVersion/application"

  /** Returns the current rate limits for methods belonging to the specified resource families.
    * For more information see
    * <a href="https://developer.twitter.com/en/docs/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status" target="_blank">
    *   https://developer.twitter.com/en/docs/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status</a>.
    *
    * @param resources : A comma-separated list of resource families you want to know the current rate limit disposition for.
    *                  If no resources are specified, all the resources are considered.
    * @return : The current rate limits for methods belonging to the specified resource families.
    */
  def rateLimits(resources: Resource*): Future[RatedData[RateLimits]] = {
    import restClient._
    val parameters = RatesParameters(Option(resources.mkString(",")).filter(_.trim.nonEmpty))
    Get(s"$applicationUrl/rate_limit_status.json", parameters).respondAsRated[RateLimits]
  }

}


================================================
FILE: src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/parameters/RatesParameters.scala
================================================
package com.danielasfregola.twitter4s.http.clients.rest.application.parameters

import com.danielasfr
Download .txt
gitextract_z8tpb3no/

├── .circleci/
│   └── config.yml
├── .gitignore
├── .mergify.yml
├── .scalafmt.conf
├── LICENSE
├── README.md
├── build.sbt
├── project/
│   ├── build.properties
│   └── plugins.sbt
├── sonatype.sbt
└── src/
    ├── main/
    │   ├── resources/
    │   │   └── reference.conf
    │   └── scala/
    │       └── com/
    │           └── danielasfregola/
    │               └── twitter4s/
    │                   ├── TwitterAuthenticationClient.scala
    │                   ├── TwitterRestClient.scala
    │                   ├── TwitterRestV2Client.scala
    │                   ├── TwitterStreamingClient.scala
    │                   ├── entities/
    │                   │   ├── AccessToken.scala
    │                   │   ├── Accuracy.scala
    │                   │   ├── Area.scala
    │                   │   ├── Banners.scala
    │                   │   ├── Category.scala
    │                   │   ├── Configuration.scala
    │                   │   ├── ConsumerToken.scala
    │                   │   ├── Contributor.scala
    │                   │   ├── Coordinate.scala
    │                   │   ├── Coordinates.scala
    │                   │   ├── DirectMessage.scala
    │                   │   ├── DirectMessageEvent.scala
    │                   │   ├── DirectMessageEventList.scala
    │                   │   ├── Entities.scala
    │                   │   ├── ExtendedTweet.scala
    │                   │   ├── Geo.scala
    │                   │   ├── GeoBoundingBox.scala
    │                   │   ├── GeoCode.scala
    │                   │   ├── GeoPlace.scala
    │                   │   ├── GeoSearch.scala
    │                   │   ├── HashTag.scala
    │                   │   ├── Image.scala
    │                   │   ├── LanguageDetails.scala
    │                   │   ├── Location.scala
    │                   │   ├── LocationTrends.scala
    │                   │   ├── LookupEntities.scala
    │                   │   ├── LookupMapped.scala
    │                   │   ├── LookupRelationship.scala
    │                   │   ├── LookupTweet.scala
    │                   │   ├── LookupUser.scala
    │                   │   ├── Media.scala
    │                   │   ├── MediaDetails.scala
    │                   │   ├── MediaUpload.scala
    │                   │   ├── OEmbedTweet.scala
    │                   │   ├── PrivacyPolicy.scala
    │                   │   ├── ProfileImage.scala
    │                   │   ├── ProfileUpdate.scala
    │                   │   ├── RateLimit.scala
    │                   │   ├── RateLimits.scala
    │                   │   ├── RatedData.scala
    │                   │   ├── Relationship.scala
    │                   │   ├── SavedSearch.scala
    │                   │   ├── Settings.scala
    │                   │   ├── SettingsOptions.scala
    │                   │   ├── Size.scala
    │                   │   ├── StatusMediaDetails.scala
    │                   │   ├── Suggestions.scala
    │                   │   ├── Symbol.scala
    │                   │   ├── TermsOfService.scala
    │                   │   ├── Tweet.scala
    │                   │   ├── TweetId.scala
    │                   │   ├── TweetSearch.scala
    │                   │   ├── TweetUpdate.scala
    │                   │   ├── TwitterList.scala
    │                   │   ├── TwitterListUpdate.scala
    │                   │   ├── TwitterLists.scala
    │                   │   ├── UploadedMedia.scala
    │                   │   ├── Url.scala
    │                   │   ├── User.scala
    │                   │   ├── UserIds.scala
    │                   │   ├── UserMention.scala
    │                   │   ├── UserStringifiedIds.scala
    │                   │   ├── Users.scala
    │                   │   ├── Variant.scala
    │                   │   ├── Video.scala
    │                   │   ├── VideoInfo.scala
    │                   │   ├── Webhook.scala
    │                   │   ├── authentication/
    │                   │   │   ├── OAuthAccessToken.scala
    │                   │   │   └── OAuthRequestToken.scala
    │                   │   ├── enums/
    │                   │   │   ├── AccessType.scala
    │                   │   │   ├── Alignment.scala
    │                   │   │   ├── ContributorType.scala
    │                   │   │   ├── DisconnectionCode.scala
    │                   │   │   ├── EventCode.scala
    │                   │   │   ├── FilterLevel.scala
    │                   │   │   ├── Granularity.scala
    │                   │   │   ├── Hour.scala
    │                   │   │   ├── Language.scala
    │                   │   │   ├── Measure.scala
    │                   │   │   ├── MediaType.scala
    │                   │   │   ├── Mode.scala
    │                   │   │   ├── Resource.scala
    │                   │   │   ├── ResultType.scala
    │                   │   │   ├── TimeZone.scala
    │                   │   │   ├── TweetMode.scala
    │                   │   │   ├── WidgetType.scala
    │                   │   │   └── WithFilter.scala
    │                   │   ├── streaming/
    │                   │   │   ├── StreamingUpdate.scala
    │                   │   │   ├── common/
    │                   │   │   │   ├── DisconnectMessage.scala
    │                   │   │   │   ├── LimitNotice.scala
    │                   │   │   │   ├── LocationDeletionNotice.scala
    │                   │   │   │   ├── StatusDeletionNotice.scala
    │                   │   │   │   ├── StatusWithheldNotice.scala
    │                   │   │   │   ├── UserWithheldNotice.scala
    │                   │   │   │   └── WarningMessage.scala
    │                   │   │   ├── site/
    │                   │   │   │   ├── ControlMessage.scala
    │                   │   │   │   └── UserEnvelop.scala
    │                   │   │   └── user/
    │                   │   │       ├── Event.scala
    │                   │   │       └── FriendsLists.scala
    │                   │   └── v2/
    │                   │       ├── Error.scala
    │                   │       ├── Media.scala
    │                   │       ├── Meta.scala
    │                   │       ├── Place.scala
    │                   │       ├── Poll.scala
    │                   │       ├── Tweet.scala
    │                   │       ├── TweetEntities.scala
    │                   │       ├── TweetIncludes.scala
    │                   │       ├── User.scala
    │                   │       ├── UserEntities.scala
    │                   │       ├── UserIncludes.scala
    │                   │       ├── Withheld.scala
    │                   │       ├── enums/
    │                   │       │   ├── CoordinatesType.scala
    │                   │       │   ├── MediaType.scala
    │                   │       │   ├── ReferencedTweetType.scala
    │                   │       │   ├── TweetReplySetting.scala
    │                   │       │   ├── WithheldScope.scala
    │                   │       │   ├── expansions/
    │                   │       │   │   ├── TweetExpansions.scala
    │                   │       │   │   └── UserExpansions.scala
    │                   │       │   ├── fields/
    │                   │       │   │   ├── MediaFields.scala
    │                   │       │   │   ├── PlaceFields.scala
    │                   │       │   │   ├── PollFields.scala
    │                   │       │   │   ├── TweetFields.scala
    │                   │       │   │   └── UserFields.scala
    │                   │       │   └── rest/
    │                   │       │       └── TimelineExclude.scala
    │                   │       └── responses/
    │                   │           ├── TweetResponse.scala
    │                   │           ├── TweetsResponse.scala
    │                   │           ├── UserResponse.scala
    │                   │           └── UsersResponse.scala
    │                   ├── exceptions/
    │                   │   └── TwitterException.scala
    │                   ├── http/
    │                   │   ├── clients/
    │                   │   │   ├── Client.scala
    │                   │   │   ├── CommonClient.scala
    │                   │   │   ├── OAuthClient.scala
    │                   │   │   ├── authentication/
    │                   │   │   │   ├── AuthenticationClient.scala
    │                   │   │   │   └── oauth/
    │                   │   │   │       ├── TwitterOAuthClient.scala
    │                   │   │   │       └── parameters/
    │                   │   │   │           ├── AccessTokenParameters.scala
    │                   │   │   │           └── RequestTokenParameters.scala
    │                   │   │   ├── rest/
    │                   │   │   │   ├── RestClient.scala
    │                   │   │   │   ├── account/
    │                   │   │   │   │   ├── TwitterAccountClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── CredentialsParameters.scala
    │                   │   │   │   ├── accountactivity/
    │                   │   │   │   │   ├── TwitterAccountActivityClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── WebhooksParameters.scala
    │                   │   │   │   ├── application/
    │                   │   │   │   │   ├── TwitterApplicationClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── RatesParameters.scala
    │                   │   │   │   ├── blocks/
    │                   │   │   │   │   ├── TwitterBlockClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── BlockParameters.scala
    │                   │   │   │   │       ├── BlockedUserIdsParameters.scala
    │                   │   │   │   │       └── BlockedUsersParameters.scala
    │                   │   │   │   ├── directmessages/
    │                   │   │   │   │   ├── TwitterDirectMessageClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── CreateEventParameters.scala
    │                   │   │   │   │       ├── CreateParameters.scala
    │                   │   │   │   │       ├── DestroyParameters.scala
    │                   │   │   │   │       ├── EventListParameters.scala
    │                   │   │   │   │       ├── ReceivedParameters.scala
    │                   │   │   │   │       ├── SentParameters.scala
    │                   │   │   │   │       └── ShowParameters.scala
    │                   │   │   │   ├── favorites/
    │                   │   │   │   │   ├── TwitterFavoriteClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── FavoriteParameters.scala
    │                   │   │   │   │       └── FavoritesParameters.scala
    │                   │   │   │   ├── followers/
    │                   │   │   │   │   ├── TwitterFollowerClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── FollowersParameters.scala
    │                   │   │   │   │       └── FollowingParameters.scala
    │                   │   │   │   ├── friends/
    │                   │   │   │   │   ├── TwitterFriendClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── FriendParameters.scala
    │                   │   │   │   │       └── FriendsParameters.scala
    │                   │   │   │   ├── friendships/
    │                   │   │   │   │   ├── TwitterFriendshipClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── BlockedParameters.scala
    │                   │   │   │   │       ├── FollowParameters.scala
    │                   │   │   │   │       ├── FriendshipParameters.scala
    │                   │   │   │   │       ├── NotificationParameters.scala
    │                   │   │   │   │       ├── RelationshipParameters.scala
    │                   │   │   │   │       ├── RelationshipsParameters.scala
    │                   │   │   │   │       └── UnfollowParameters.scala
    │                   │   │   │   ├── geo/
    │                   │   │   │   │   ├── TwitterGeoClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── GeoSearchParameters.scala
    │                   │   │   │   │       └── ReverseGeoCodeParameters.scala
    │                   │   │   │   ├── help/
    │                   │   │   │   │   └── TwitterHelpClient.scala
    │                   │   │   │   ├── lists/
    │                   │   │   │   │   ├── TwitterListClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── AddMemberParameters.scala
    │                   │   │   │   │       ├── CreateListParameters.scala
    │                   │   │   │   │       ├── ListMembersParameters.scala
    │                   │   │   │   │       ├── ListParameters.scala
    │                   │   │   │   │       ├── ListTimelineParameters.scala
    │                   │   │   │   │       ├── ListsParameters.scala
    │                   │   │   │   │       ├── MemberParameters.scala
    │                   │   │   │   │       ├── MembersParameters.scala
    │                   │   │   │   │       ├── MembershipsParameters.scala
    │                   │   │   │   │       ├── OwnershipsParameters.scala
    │                   │   │   │   │       ├── RemoveMemberParameters.scala
    │                   │   │   │   │       ├── RemoveMembersParameters.scala
    │                   │   │   │   │       ├── SubscribersParameters.scala
    │                   │   │   │   │       ├── SubscriptionsParameters.scala
    │                   │   │   │   │       └── UpdateListParameters.scala
    │                   │   │   │   ├── media/
    │                   │   │   │   │   ├── TwitterMediaClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── MediaAppendParameters.scala
    │                   │   │   │   │       ├── MediaFinalizeParameters.scala
    │                   │   │   │   │       ├── MediaInitParameters.scala
    │                   │   │   │   │       ├── MediaMetadataCreation.scala
    │                   │   │   │   │       └── MediaStatusParameters.scala
    │                   │   │   │   ├── mutes/
    │                   │   │   │   │   ├── TwitterMuteClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── MuteParameters.scala
    │                   │   │   │   │       ├── MutedUsersIdsParameters.scala
    │                   │   │   │   │       └── MutedUsersParameters.scala
    │                   │   │   │   ├── savedsearches/
    │                   │   │   │   │   ├── TwitterSavedSearchClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── SaveSearchParameters.scala
    │                   │   │   │   ├── search/
    │                   │   │   │   │   ├── TwitterSearchClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── TweetSearchParameters.scala
    │                   │   │   │   ├── statuses/
    │                   │   │   │   │   ├── TwitterStatusClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── HomeTimelineParameters.scala
    │                   │   │   │   │       ├── LookupParameters.scala
    │                   │   │   │   │       ├── MentionsParameters.scala
    │                   │   │   │   │       ├── OEmbedParameters.scala
    │                   │   │   │   │       ├── PostParameters.scala
    │                   │   │   │   │       ├── RetweetersIdsParameters.scala
    │                   │   │   │   │       ├── RetweetsOfMeParameters.scala
    │                   │   │   │   │       ├── RetweetsParameters.scala
    │                   │   │   │   │       ├── ShowParameters.scala
    │                   │   │   │   │       └── UserTimelineParameters.scala
    │                   │   │   │   ├── suggestions/
    │                   │   │   │   │   ├── TwitterSuggestionClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       └── SuggestionsParameters.scala
    │                   │   │   │   ├── trends/
    │                   │   │   │   │   ├── TwitterTrendClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── LocationParameters.scala
    │                   │   │   │   │       └── TrendsParameters.scala
    │                   │   │   │   ├── users/
    │                   │   │   │   │   ├── TwitterUserClient.scala
    │                   │   │   │   │   └── parameters/
    │                   │   │   │   │       ├── BannersParameters.scala
    │                   │   │   │   │       ├── UserParameters.scala
    │                   │   │   │   │       ├── UserSearchParameters.scala
    │                   │   │   │   │       └── UsersParameters.scala
    │                   │   │   │   └── v2/
    │                   │   │   │       ├── tweets/
    │                   │   │   │       │   ├── TwitterSearchTweetsClient.scala
    │                   │   │   │       │   ├── TwitterTimelinesClient.scala
    │                   │   │   │       │   ├── TwitterTweetLookupClient.scala
    │                   │   │   │       │   └── paramaters/
    │                   │   │   │       │       ├── SearchTweetsParameters.scala
    │                   │   │   │       │       ├── TimelineMentionsParameters.scala
    │                   │   │   │       │       ├── TimelineTweetsParameters.scala
    │                   │   │   │       │       ├── TweetParameters.scala
    │                   │   │   │       │       └── TweetsParameters.scala
    │                   │   │   │       └── users/
    │                   │   │   │           ├── TwitterUserLookupClient.scala
    │                   │   │   │           └── parameters/
    │                   │   │   │               ├── UserByUsernameParameters.scala
    │                   │   │   │               ├── UserParameters.scala
    │                   │   │   │               ├── UsersByUsernamesParameters.scala
    │                   │   │   │               └── UsersParameters.scala
    │                   │   │   └── streaming/
    │                   │   │       ├── ErrorHandler.scala
    │                   │   │       ├── StreamingClient.scala
    │                   │   │       ├── TwitterStream.scala
    │                   │   │       ├── sites/
    │                   │   │       │   ├── TwitterSiteClient.scala
    │                   │   │       │   └── parameters/
    │                   │   │       │       └── SiteParameters.scala
    │                   │   │       ├── statuses/
    │                   │   │       │   ├── TwitterStatusClient.scala
    │                   │   │       │   └── parameters/
    │                   │   │       │       ├── StatusFilters.scala
    │                   │   │       │       ├── StatusFirehoseParameters.scala
    │                   │   │       │       └── StatusSampleParameters.scala
    │                   │   │       └── users/
    │                   │   │           ├── TwitterUserClient.scala
    │                   │   │           └── parameters/
    │                   │   │               └── UserParameters.scala
    │                   │   ├── marshalling/
    │                   │   │   ├── BodyEncoder.scala
    │                   │   │   └── Parameters.scala
    │                   │   ├── oauth/
    │                   │   │   └── OAuth1Provider.scala
    │                   │   ├── package.scala
    │                   │   └── serializers/
    │                   │       ├── CustomFormats.scala
    │                   │       ├── EnumFormats.scala
    │                   │       ├── FormSupport.scala
    │                   │       ├── FormatsComposer.scala
    │                   │       ├── JsonSupport.scala
    │                   │       └── StreamingMessageFormats.scala
    │                   ├── processors/
    │                   │   └── TwitterProcessor.scala
    │                   ├── providers/
    │                   │   ├── ExecutionContextProvider.scala
    │                   │   └── TokenProvider.scala
    │                   └── util/
    │                       ├── Configurations.scala
    │                       ├── Encoder.scala
    │                       ├── MediaReader.scala
    │                       ├── SystemShutdown.scala
    │                       └── UriHelpers.scala
    └── test/
        ├── resources/
        │   ├── fixtures/
        │   │   ├── rest/
        │   │   │   ├── account/
        │   │   │   │   ├── settings.json
        │   │   │   │   └── user.json
        │   │   │   ├── accountactivity/
        │   │   │   │   └── webhook.json
        │   │   │   ├── application/
        │   │   │   │   └── rate_limits.json
        │   │   │   ├── blocks/
        │   │   │   │   ├── blocked_users.json
        │   │   │   │   ├── ids.json
        │   │   │   │   ├── stringified_ids.json
        │   │   │   │   └── user.json
        │   │   │   ├── directmessages/
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── event.json
        │   │   │   │   ├── list.json
        │   │   │   │   ├── new.json
        │   │   │   │   ├── received.json
        │   │   │   │   ├── sent.json
        │   │   │   │   └── show.json
        │   │   │   ├── favorites/
        │   │   │   │   ├── favorite.json
        │   │   │   │   ├── favorites.json
        │   │   │   │   └── unfavorite.json
        │   │   │   ├── followers/
        │   │   │   │   ├── followers.json
        │   │   │   │   ├── followers_ids.json
        │   │   │   │   └── followers_ids_stringified.json
        │   │   │   ├── friends/
        │   │   │   │   ├── friends_ids.json
        │   │   │   │   ├── friends_ids_stringified.json
        │   │   │   │   └── users.json
        │   │   │   ├── friendships/
        │   │   │   │   ├── blocked_users.json
        │   │   │   │   ├── blocked_users_stringified.json
        │   │   │   │   ├── follow.json
        │   │   │   │   ├── incoming_friendships_ids.json
        │   │   │   │   ├── incoming_friendships_ids_stringified.json
        │   │   │   │   ├── outgoing_friendships_ids.json
        │   │   │   │   ├── outgoing_friendships_ids_stringified.json
        │   │   │   │   ├── relationship.json
        │   │   │   │   ├── relationships.json
        │   │   │   │   ├── unfollow.json
        │   │   │   │   └── update.json
        │   │   │   ├── geo/
        │   │   │   │   ├── advanced_search.json
        │   │   │   │   ├── geo_place.json
        │   │   │   │   ├── reverse_geocode.json
        │   │   │   │   └── search.json
        │   │   │   ├── help/
        │   │   │   │   ├── configuration.json
        │   │   │   │   ├── languages.json
        │   │   │   │   ├── privacy.json
        │   │   │   │   └── tos.json
        │   │   │   ├── lists/
        │   │   │   │   ├── create.json
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── lists.json
        │   │   │   │   ├── member.json
        │   │   │   │   ├── members.json
        │   │   │   │   ├── memberships.json
        │   │   │   │   ├── ownerships.json
        │   │   │   │   ├── show.json
        │   │   │   │   ├── subscribers.json
        │   │   │   │   ├── subscriptions.json
        │   │   │   │   └── timeline.json
        │   │   │   ├── media/
        │   │   │   │   ├── img_media_details.json
        │   │   │   │   └── media_details.json
        │   │   │   ├── mutes/
        │   │   │   │   ├── muted_users_ids.json
        │   │   │   │   ├── user.json
        │   │   │   │   └── users.json
        │   │   │   ├── savedsearches/
        │   │   │   │   ├── create.json
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── list.json
        │   │   │   │   └── show.json
        │   │   │   ├── search/
        │   │   │   │   └── tweets.json
        │   │   │   ├── statuses/
        │   │   │   │   ├── destroy.json
        │   │   │   │   ├── direct_message.json
        │   │   │   │   ├── home_timeline.json
        │   │   │   │   ├── lookup.json
        │   │   │   │   ├── lookup_extended.json
        │   │   │   │   ├── lookup_mapped.json
        │   │   │   │   ├── lookup_mapped_extended.json
        │   │   │   │   ├── mentions_timeline.json
        │   │   │   │   ├── oembed.json
        │   │   │   │   ├── retweet.json
        │   │   │   │   ├── retweeters_ids.json
        │   │   │   │   ├── retweeters_ids_stringified.json
        │   │   │   │   ├── retweets.json
        │   │   │   │   ├── retweets_of_me.json
        │   │   │   │   ├── show.json
        │   │   │   │   ├── update.json
        │   │   │   │   └── user_timeline.json
        │   │   │   ├── suggestions/
        │   │   │   │   ├── categories.json
        │   │   │   │   ├── slug_suggestions.json
        │   │   │   │   └── suggestions_members.json
        │   │   │   ├── trends/
        │   │   │   │   ├── available_locations.json
        │   │   │   │   ├── closest_locations.json
        │   │   │   │   └── trends.json
        │   │   │   └── users/
        │   │   │       ├── profile_banner.json
        │   │   │       ├── user.json
        │   │   │       └── users.json
        │   │   └── streaming/
        │   │       ├── common/
        │   │       │   ├── disconnect_messages.json
        │   │       │   ├── limit_notices.json
        │   │       │   ├── location_deletion_notices.json
        │   │       │   ├── status_deletion_notices.json
        │   │       │   ├── status_withheld_notices.json
        │   │       │   ├── tweets.json
        │   │       │   ├── user_withheld_notices.json
        │   │       │   └── warning_messages.json
        │   │       ├── site/
        │   │       │   ├── control_messages.json
        │   │       │   ├── user_envelop_direct_message.json
        │   │       │   ├── user_envelop_direct_message_stringified.json
        │   │       │   ├── user_envelop_simple_event.json
        │   │       │   ├── user_envelop_simple_event_stringified.json
        │   │       │   ├── user_envelop_tweet.json
        │   │       │   ├── user_envelop_tweet_event.json
        │   │       │   ├── user_envelop_tweet_event_stringified.json
        │   │       │   ├── user_envelop_tweet_stringified.json
        │   │       │   ├── user_envelop_twitter_list_event.json
        │   │       │   ├── user_envelop_twitter_list_event_stringified.json
        │   │       │   ├── user_envelop_warning_message.json
        │   │       │   ├── user_envelop_warning_message_stringified.json
        │   │       │   ├── user_envelops_friends_list.json
        │   │       │   └── user_envelops_friends_list_stringified.json
        │   │       └── user/
        │   │           ├── direct_messages.json
        │   │           ├── events.json
        │   │           ├── friends_lists.json
        │   │           └── friends_lists_stringified.json
        │   └── twitter/
        │       ├── authentication/
        │       │   ├── access_token.txt
        │       │   └── request_token.txt
        │       ├── rest/
        │       │   ├── account/
        │       │   │   ├── settings.json
        │       │   │   └── user.json
        │       │   ├── accountactivity/
        │       │   │   └── webhook.json
        │       │   ├── application/
        │       │   │   └── rate_limits.json
        │       │   ├── blocks/
        │       │   │   ├── blocked_users.json
        │       │   │   ├── ids.json
        │       │   │   ├── stringified_ids.json
        │       │   │   └── user.json
        │       │   ├── directmessages/
        │       │   │   ├── destroy.json
        │       │   │   ├── event.json
        │       │   │   ├── list.json
        │       │   │   ├── new.json
        │       │   │   ├── received.json
        │       │   │   ├── sent.json
        │       │   │   └── show.json
        │       │   ├── favorites/
        │       │   │   ├── favorite.json
        │       │   │   ├── favorites.json
        │       │   │   └── unfavorite.json
        │       │   ├── followers/
        │       │   │   ├── followers.json
        │       │   │   ├── followers_ids.json
        │       │   │   └── followers_ids_stringified.json
        │       │   ├── friends/
        │       │   │   ├── friends_ids.json
        │       │   │   ├── friends_ids_stringified.json
        │       │   │   └── users.json
        │       │   ├── friendships/
        │       │   │   ├── blocked_users.json
        │       │   │   ├── blocked_users_stringified.json
        │       │   │   ├── follow.json
        │       │   │   ├── incoming_friendships_ids.json
        │       │   │   ├── incoming_friendships_ids_stringified.json
        │       │   │   ├── outgoing_friendships_ids.json
        │       │   │   ├── outgoing_friendships_ids_stringified.json
        │       │   │   ├── relationship.json
        │       │   │   ├── relationships.json
        │       │   │   ├── unfollow.json
        │       │   │   └── update.json
        │       │   ├── geo/
        │       │   │   ├── advanced_search.json
        │       │   │   ├── geo_place.json
        │       │   │   ├── reverse_geocode.json
        │       │   │   └── search.json
        │       │   ├── help/
        │       │   │   ├── configuration.json
        │       │   │   ├── languages.json
        │       │   │   ├── privacy.json
        │       │   │   └── tos.json
        │       │   ├── lists/
        │       │   │   ├── create.json
        │       │   │   ├── destroy.json
        │       │   │   ├── lists.json
        │       │   │   ├── member.json
        │       │   │   ├── members.json
        │       │   │   ├── memberships.json
        │       │   │   ├── ownerships.json
        │       │   │   ├── show.json
        │       │   │   ├── subscribers.json
        │       │   │   ├── subscriptions.json
        │       │   │   └── timeline.json
        │       │   ├── media/
        │       │   │   └── media_details.json
        │       │   ├── mutes/
        │       │   │   ├── muted_users_ids.json
        │       │   │   ├── user.json
        │       │   │   └── users.json
        │       │   ├── savedsearches/
        │       │   │   ├── create.json
        │       │   │   ├── destroy.json
        │       │   │   ├── list.json
        │       │   │   └── show.json
        │       │   ├── search/
        │       │   │   └── tweets.json
        │       │   ├── statuses/
        │       │   │   ├── destroy.json
        │       │   │   ├── direct_message.json
        │       │   │   ├── home_timeline.json
        │       │   │   ├── lookup.json
        │       │   │   ├── lookup_extended.json
        │       │   │   ├── lookup_mapped.json
        │       │   │   ├── lookup_mapped_extended.json
        │       │   │   ├── mentions_timeline.json
        │       │   │   ├── oembed.json
        │       │   │   ├── retweet.json
        │       │   │   ├── retweeters_ids.json
        │       │   │   ├── retweeters_ids_stringified.json
        │       │   │   ├── retweets.json
        │       │   │   ├── retweets_of_me.json
        │       │   │   ├── show.json
        │       │   │   ├── update.json
        │       │   │   └── user_timeline.json
        │       │   ├── suggestions/
        │       │   │   ├── categories.json
        │       │   │   ├── slug_suggestions.json
        │       │   │   └── suggestions_members.json
        │       │   ├── trends/
        │       │   │   ├── available_locations.json
        │       │   │   ├── closest_locations.json
        │       │   │   └── trends.json
        │       │   ├── users/
        │       │   │   ├── empty-user-profile-url.json
        │       │   │   ├── profile_banner.json
        │       │   │   ├── user.json
        │       │   │   └── users.json
        │       │   └── v2/
        │       │       ├── tweets/
        │       │       │   ├── tweet.json
        │       │       │   └── tweets.json
        │       │       └── users/
        │       │           ├── user.json
        │       │           └── users.json
        │       └── streaming/
        │           ├── common/
        │           │   ├── disconnect_messages.json
        │           │   ├── limit_notices.json
        │           │   ├── location_deletion_notices.json
        │           │   ├── status_deletion_notices.json
        │           │   ├── status_withheld_notices.json
        │           │   ├── tweets.json
        │           │   ├── user_withheld_notices.json
        │           │   └── warning_messages.json
        │           ├── site/
        │           │   ├── control_messages.json
        │           │   ├── user_envelop_direct_message.json
        │           │   ├── user_envelop_direct_message_stringified.json
        │           │   ├── user_envelop_simple_event.json
        │           │   ├── user_envelop_simple_event_stringified.json
        │           │   ├── user_envelop_tweet.json
        │           │   ├── user_envelop_tweet_event.json
        │           │   ├── user_envelop_tweet_event_stringified.json
        │           │   ├── user_envelop_tweet_stringified.json
        │           │   ├── user_envelop_twitter_list_event.json
        │           │   ├── user_envelop_twitter_list_event_stringified.json
        │           │   ├── user_envelop_warning_message.json
        │           │   ├── user_envelop_warning_message_stringified.json
        │           │   ├── user_envelops_friends_list.json
        │           │   └── user_envelops_friends_list_stringified.json
        │           └── user/
        │               ├── direct_messages.json
        │               ├── events.json
        │               ├── friends_lists.json
        │               └── friends_lists_stringified.json
        └── scala/
            └── com/
                └── danielasfregola/
                    └── twitter4s/
                        ├── entities/
                        │   ├── DeserializationRoundtripSpec.scala
                        │   ├── ProfileImageSpec.scala
                        │   ├── RateLimitSpec.scala
                        │   └── SerializationRoundtripSpec.scala
                        ├── helpers/
                        │   ├── AwaitableFuture.scala
                        │   ├── ClientSpec.scala
                        │   ├── FixturesSupport.scala
                        │   ├── JsonDiffSupport.scala
                        │   ├── RequestDSL.scala
                        │   ├── Spec.scala
                        │   ├── TestActorSystem.scala
                        │   └── TestExecutionContext.scala
                        ├── http/
                        │   ├── clients/
                        │   │   ├── authentication/
                        │   │   │   └── oauth/
                        │   │   │       └── TwitterOAuthClientSpec.scala
                        │   │   ├── rest/
                        │   │   │   ├── RestClientSpec.scala
                        │   │   │   ├── account/
                        │   │   │   │   └── TwitterAccountClientSpec.scala
                        │   │   │   ├── accountactivity/
                        │   │   │   │   └── TwitterAccountActivityClientSpec.scala
                        │   │   │   ├── application/
                        │   │   │   │   └── TwitterApplicationClientSpec.scala
                        │   │   │   ├── blocks/
                        │   │   │   │   └── TwitterBlockClientSpec.scala
                        │   │   │   ├── directmessages/
                        │   │   │   │   └── TwitterDirectMessageClientSpec.scala
                        │   │   │   ├── favorites/
                        │   │   │   │   └── TwitterFavoriteClientSpec.scala
                        │   │   │   ├── followers/
                        │   │   │   │   └── TwitterFollowerClientSpec.scala
                        │   │   │   ├── friends/
                        │   │   │   │   └── TwitterFriendClientSpec.scala
                        │   │   │   ├── friendships/
                        │   │   │   │   └── TwitterFriendshipClientSpec.scala
                        │   │   │   ├── geo/
                        │   │   │   │   └── TwitterGeoClientSpec.scala
                        │   │   │   ├── help/
                        │   │   │   │   └── TwitterHelpClientSpec.scala
                        │   │   │   ├── lists/
                        │   │   │   │   └── TwitterListClientSpec.scala
                        │   │   │   ├── media/
                        │   │   │   │   └── TwitterMediaClientSpec.scala
                        │   │   │   ├── mutes/
                        │   │   │   │   └── TwitterMuteClientSpec.scala
                        │   │   │   ├── savedsearches/
                        │   │   │   │   └── TwitterSavedSearchClientSpec.scala
                        │   │   │   ├── search/
                        │   │   │   │   └── TwitterSearchClientSpec.scala
                        │   │   │   ├── statuses/
                        │   │   │   │   ├── TwitterStatusClientSpec.scala
                        │   │   │   │   └── parameters/
                        │   │   │   │       ├── HomeTimelineParametersSpec.scala
                        │   │   │   │       ├── LookupParametersSpec.scala
                        │   │   │   │       ├── MentionsParametersSpec.scala
                        │   │   │   │       ├── OEmbedParametersSpec.scala
                        │   │   │   │       ├── PostParametersSpec.scala
                        │   │   │   │       ├── RetweetersIdsParametersSpec.scala
                        │   │   │   │       ├── RetweetsOfMeParametersSpec.scala
                        │   │   │   │       ├── RetweetsParametersSpec.scala
                        │   │   │   │       ├── ShowParametersSpec.scala
                        │   │   │   │       └── UserTimelineParametersSpec.scala
                        │   │   │   ├── suggestions/
                        │   │   │   │   └── TwitterSuggestionClientSpec.scala
                        │   │   │   ├── trends/
                        │   │   │   │   └── TwitterTrendClientSpec.scala
                        │   │   │   ├── users/
                        │   │   │   │   └── TwitterUserClientSpec.scala
                        │   │   │   └── v2/
                        │   │   │       ├── tweets/
                        │   │   │       │   ├── TwitterSearchTweetsClientSpec.scala
                        │   │   │       │   ├── TwitterTimelinesClientSpec.scala
                        │   │   │       │   ├── TwitterTweetLookupClientSpec.scala
                        │   │   │       │   └── deserialization/
                        │   │   │       │       ├── TweetsDeserializationSpec.scala
                        │   │   │       │       └── fixtures/
                        │   │   │       │           ├── TweetResponseFixture.scala
                        │   │   │       │           └── TweetsResponseFixture.scala
                        │   │   │       ├── users/
                        │   │   │       │   ├── TwitterUserLookupClientSpec.scala
                        │   │   │       │   └── deserialization/
                        │   │   │       │       ├── UsersResponseDeserializationSpec.scala
                        │   │   │       │       └── fixtures/
                        │   │   │       │           ├── UserResponseFixture.scala
                        │   │   │       │           └── UsersResponseFixture.scala
                        │   │   │       └── utils/
                        │   │   │           └── V2SpecQueryHelper.scala
                        │   │   └── streaming/
                        │   │       ├── StreamingClientSpec.scala
                        │   │       ├── sites/
                        │   │       │   └── TwitterSiteClientSpec.scala
                        │   │       ├── statuses/
                        │   │       │   └── TwitterStatusClientSpec.scala
                        │   │       └── users/
                        │   │           └── TwitterUserClientSpec.scala
                        │   ├── marshalling/
                        │   │   └── BodyEncoderSpec.scala
                        │   ├── oauth/
                        │   │   └── OAuth1ProviderSpec.scala
                        │   ├── packageHttpSpec.scala
                        │   └── serializers/
                        │       └── FormSupportSpec.scala
                        └── util/
                            ├── ConfigurationDetectorSpec.scala
                            ├── EncoderSpec.scala
                            └── UriHelpersSpec.scala
Condensed preview — 590 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,333K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 1398,
    "preview": "# Scala CircleCI 2.0 configuration file\n#\n# Check https://circleci.com/docs/2.0/sample-config/ for more details\n#\nversio"
  },
  {
    "path": ".gitignore",
    "chars": 469,
    "preview": "# Created by .ignore support plugin (hsz.mobi)\n### SBT template\n# Simple Build Tool\n# http://www.scala-sbt.org/release/d"
  },
  {
    "path": ".mergify.yml",
    "chars": 277,
    "preview": "pull_request_rules:\n  - name: automatically merge scala-steward's PRs\n    conditions:\n      - author=scala-steward\n     "
  },
  {
    "path": ".scalafmt.conf",
    "chars": 16,
    "preview": "maxColumn = 120\n"
  },
  {
    "path": "LICENSE",
    "chars": 11358,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 19117,
    "preview": "twitter4s\n=========\n\n[![twitter4s Scala version support](https://index.scala-lang.org/danielasfregola/twitter4s/twitter4"
  },
  {
    "path": "build.sbt",
    "chars": 3525,
    "preview": "import com.typesafe.sbt.SbtGit.{GitKeys => git}\n\nenablePlugins(GhpagesPlugin, SiteScaladocPlugin)\n\nname := \"twitter4s\"\nv"
  },
  {
    "path": "project/build.properties",
    "chars": 20,
    "preview": "sbt.version = 1.6.2\n"
  },
  {
    "path": "project/plugins.sbt",
    "chars": 550,
    "preview": "addSbtPlugin(\"com.typesafe.sbt\" % \"sbt-site\" % \"1.4.1\")\n\naddSbtPlugin(\"com.typesafe.sbt\" % \"sbt-ghpages\" % \"0.6.3\")\n\nadd"
  },
  {
    "path": "sonatype.sbt",
    "chars": 45,
    "preview": "sonatypeProfileName := \"com.danielasfregola\"\n"
  },
  {
    "path": "src/main/resources/reference.conf",
    "chars": 252,
    "preview": "twitter {\n\n  rest {\n    api = \"https://api.twitter.com\"\n    media = \"https://upload.twitter.com\"\n  }\n\n  streaming {\n    "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/TwitterAuthenticationClient.scala",
    "chars": 1673,
    "preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.Consu"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/TwitterRestClient.scala",
    "chars": 4049,
    "preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.{Acce"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/TwitterRestV2Client.scala",
    "chars": 2060,
    "preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.{Acce"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/TwitterStreamingClient.scala",
    "chars": 2077,
    "preview": "package com.danielasfregola.twitter4s\n\nimport akka.actor.ActorSystem\nimport com.danielasfregola.twitter4s.entities.{Acce"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/AccessToken.scala",
    "chars": 106,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class AccessToken(key: String, secret: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Accuracy.scala",
    "chars": 341,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport com.danielasfregola.twitter4s.entities.enums.Measure\nimport com.d"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Area.scala",
    "chars": 122,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Area(coordinates: Seq[Seq[Seq[Double]]], `type`: String"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Banners.scala",
    "chars": 167,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Banners(sizes: Map[String, Banner] = Map.empty)\n\nfinal "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Category.scala",
    "chars": 113,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Category(name: String, slug: String, size: Int)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Configuration.scala",
    "chars": 555,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Configuration(dm_text_character_limit: Long,\n          "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/ConsumerToken.scala",
    "chars": 108,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ConsumerToken(key: String, secret: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Contributor.scala",
    "chars": 124,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Contributor(id: Long, id_str: String, screen_name: Stri"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Coordinate.scala",
    "chars": 182,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Coordinate(longitude: Double, latitude: Double) {\n  def"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Coordinates.scala",
    "chars": 131,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Coordinates(coordinates: Seq[Double] = Seq.empty, `type"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessage.scala",
    "chars": 853,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nimport com.danielasfregola.twitter4s.entities."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEvent.scala",
    "chars": 779,
    "preview": "package com.danielasfregola.twitter4s.entities\nimport java.time.Instant\n\nfinal case class DirectMessageEvent(`type`: Str"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/DirectMessageEventList.scala",
    "chars": 378,
    "preview": "package com.danielasfregola.twitter4s.entities\nimport com.danielasfregola.twitter4s.entities.streaming.UserStreamingMess"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Entities.scala",
    "chars": 777,
    "preview": "package com.danielasfregola.twitter4s.entities\n\n// TODO - conversion to clean this representation? see url vs urls\n// un"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/ExtendedTweet.scala",
    "chars": 312,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ExtendedTweet(full_text: String,\n                      "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Geo.scala",
    "chars": 123,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Geo(coordinates: Seq[Double] = Seq.empty, `type`: Strin"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoBoundingBox.scala",
    "chars": 388,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoBoundingBox(southwest: Coordinate, northeast: Coordi"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoCode.scala",
    "chars": 190,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoCode(latitude: Double, longitude: Double, radius: Ac"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoPlace.scala",
    "chars": 634,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoPlace(attributes: Map[String, String],\n             "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/GeoSearch.scala",
    "chars": 582,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class GeoSearch(query: GeoQuery, result: GeoResult)\n\nfinal ca"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/HashTag.scala",
    "chars": 106,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class HashTag(text: String, indices: Seq[Int])\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Image.scala",
    "chars": 107,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Image(w: Int, h: Int, image_type: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LanguageDetails.scala",
    "chars": 125,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LanguageDetails(code: String, status: String, name: Str"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Location.scala",
    "chars": 354,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Location(country: String,\n                          cou"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LocationTrends.scala",
    "chars": 615,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LocationTrends(as_of: String, // TODO - convert to Inst"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupEntities.scala",
    "chars": 276,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LookupEntities(url: LookupUrls, description: LookupUrls"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupMapped.scala",
    "chars": 114,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LookupMapped(id: Map[String, Tweet] = Map.empty)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupRelationship.scala",
    "chars": 327,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class LookupRelationship(connections: Seq[String] = Seq.empty"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupTweet.scala",
    "chars": 857,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class LookupTweet(\n    contributors"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/LookupUser.scala",
    "chars": 1642,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class LookupUser(\n    contributors_"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Media.scala",
    "chars": 635,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Media(display_url: String,\n                       expan"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/MediaDetails.scala",
    "chars": 787,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class MediaDetails(media_id: Long,\n                          "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/MediaUpload.scala",
    "chars": 127,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class MediaUpload(media: String, additional_owners: Option[St"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/OEmbedTweet.scala",
    "chars": 665,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class OEmbedTweet(author_name: Option[String],\n              "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/PrivacyPolicy.scala",
    "chars": 96,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class PrivacyPolicy(privacy: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/ProfileImage.scala",
    "chars": 716,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ProfileImage(mini: String, normal: String, bigger: Stri"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/ProfileUpdate.scala",
    "chars": 498,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class ProfileUpdate(name: Option[String] = None,\n            "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/RateLimit.scala",
    "chars": 1212,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nimport akka.http.scaladsl.model.{HttpHeader, S"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/RateLimits.scala",
    "chars": 1722,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class RateLimits(rate_limit_context: RateLimitContext, resour"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/RatedData.scala",
    "chars": 242,
    "preview": "package com.danielasfregola.twitter4s.entities\n\n/** A wrapper for data that have rate limitation.\n  * Have a look at `ra"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Relationship.scala",
    "chars": 1601,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Relationship(relationship: RelationshipOverview)\n\nfinal"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/SavedSearch.scala",
    "chars": 179,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class SavedSearch(created_at: Insta"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Settings.scala",
    "chars": 1204,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Settings(allow_contributor_request: String,\n           "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/SettingsOptions.scala",
    "chars": 953,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport com.danielasfregola.twitter4s.entities.enums.ContributorType.Cont"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Size.scala",
    "chars": 102,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Size(h: Int, resize: String, w: Int)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/StatusMediaDetails.scala",
    "chars": 150,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class StatusMediaDetails(media_id: Long, media_id_string: Str"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Suggestions.scala",
    "chars": 146,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Suggestions(name: String, slug: String, size: Int, user"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Symbol.scala",
    "chars": 105,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Symbol(text: String, indices: Seq[Int])\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TermsOfService.scala",
    "chars": 93,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TermsOfService(tos: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Tweet.scala",
    "chars": 2396,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nimport com.danielasfregola.twitter4s.entities."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TweetId.scala",
    "chars": 99,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TweetId(id: Long, id_str: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TweetSearch.scala",
    "chars": 684,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class StatusSearch(statuses: List[Tweet], search_metadata: Se"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TweetUpdate.scala",
    "chars": 592,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TweetUpdate(status: String,\n                           "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TwitterList.scala",
    "chars": 667,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class TwitterList(created_at: Insta"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TwitterListUpdate.scala",
    "chars": 308,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport com.danielasfregola.twitter4s.entities.enums.Mode.Mode\n\nfinal cas"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/TwitterLists.scala",
    "chars": 157,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class TwitterLists(lists: Seq[TwitterList] = Seq.empty, next_"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/UploadedMedia.scala",
    "chars": 310,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UploadedMedia(media_id: Long,\n                         "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Url.scala",
    "chars": 156,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Url(indices: Seq[Int] = Seq.empty, url: String, display"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/User.scala",
    "chars": 2811,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.Instant\n\nfinal case class User(blocked_by: Boolean = fa"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/UserIds.scala",
    "chars": 143,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UserIds(ids: Seq[Long] = Seq.empty, next_cursor: Long, "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/UserMention.scala",
    "chars": 169,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UserMention(id: Long, id_str: String, indices: Seq[Int]"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/UserStringifiedIds.scala",
    "chars": 156,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class UserStringifiedIds(ids: Seq[String] = Seq.empty, next_c"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Users.scala",
    "chars": 143,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Users(users: Seq[User] = Seq.empty, next_cursor: Long, "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Variant.scala",
    "chars": 131,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Variant(bitrate: Option[Long], content_type: String, ur"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Video.scala",
    "chars": 91,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class Video(video_type: String)\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/VideoInfo.scala",
    "chars": 154,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nfinal case class VideoInfo(aspect_ratio: Seq[Int], duration_millis: Opti"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/Webhook.scala",
    "chars": 180,
    "preview": "package com.danielasfregola.twitter4s.entities\n\nimport java.time.ZonedDateTime\n\nfinal case class Webhook(id: String, url"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthAccessToken.scala",
    "chars": 710,
    "preview": "package com.danielasfregola.twitter4s.entities.authentication\n\nimport com.danielasfregola.twitter4s.entities.AccessToken"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/authentication/OAuthRequestToken.scala",
    "chars": 701,
    "preview": "package com.danielasfregola.twitter4s.entities.authentication\n\nimport com.danielasfregola.twitter4s.http.serializers.Fro"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/AccessType.scala",
    "chars": 179,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject AccessType extends Enumeration {\n  type AccessType = Value\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Alignment.scala",
    "chars": 235,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Alignment extends Enumeration {\n  type Alignment = Value\n\n "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/ContributorType.scala",
    "chars": 224,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject ContributorType extends Enumeration {\n  type ContributorTyp"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/DisconnectionCode.scala",
    "chars": 485,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject DisconnectionCode extends Enumeration {\n  type Disconnectio"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/EventCode.scala",
    "chars": 1077,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nabstract class EventCode extends Enumeration\n\nobject SimpleEventCo"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/FilterLevel.scala",
    "chars": 208,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject FilterLevel extends Enumeration {\n  type FilterLevel = Valu"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Granularity.scala",
    "chars": 282,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Granularity extends Enumeration {\n  type Granularity = Valu"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Hour.scala",
    "chars": 787,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Hour extends Enumeration {\n  type Hour = Value\n\n  val MIDNI"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Language.scala",
    "chars": 1084,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Language extends Enumeration {\n  type Language = Value\n\n  v"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Measure.scala",
    "chars": 167,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Measure extends Enumeration {\n  type Measure = Value\n\n  val"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/MediaType.scala",
    "chars": 317,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject MediaType extends Enumeration {\n  type MediaType = Value\n\n "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Mode.scala",
    "chars": 175,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Mode extends Enumeration {\n  type Mode = Value\n\n  val Priva"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/Resource.scala",
    "chars": 843,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject Resource extends Enumeration {\n  type Resource = Value\n\n  v"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/ResultType.scala",
    "chars": 216,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject ResultType extends Enumeration {\n  type ResultType = Value\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/TimeZone.scala",
    "chars": 6463,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject TimeZone extends Enumeration {\n  type TimeZone = Value\n\n  v"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/TweetMode.scala",
    "chars": 182,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject TweetMode extends Enumeration {\n  type TweetMode = Value\n\n "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/WidgetType.scala",
    "chars": 153,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject WidgetType extends Enumeration {\n  type WidgetType = Value\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/enums/WithFilter.scala",
    "chars": 189,
    "preview": "package com.danielasfregola.twitter4s.entities.enums\n\nobject WithFilter extends Enumeration {\n  type WithFilter = Value\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/StreamingUpdate.scala",
    "chars": 338,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming\n\nfinal case class StreamingUpdate(streamingEvent: StreamingMess"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/DisconnectMessage.scala",
    "chars": 992,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.enums.Dis"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LimitNotice.scala",
    "chars": 932,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/LocationDeletionNotice.scala",
    "chars": 1093,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusDeletionNotice.scala",
    "chars": 969,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/StatusWithheldNotice.scala",
    "chars": 782,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/UserWithheldNotice.scala",
    "chars": 725,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/common/WarningMessage.scala",
    "chars": 888,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.common\n\nimport com.danielasfregola.twitter4s.entities.streaming"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/ControlMessage.scala",
    "chars": 936,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.site\n\nimport com.danielasfregola.twitter4s.entities.streaming.S"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/site/UserEnvelop.scala",
    "chars": 3722,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.site\n\nimport com.danielasfregola.twitter4s.entities.streaming._"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/Event.scala",
    "chars": 2196,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.user\n\nimport java.time.Instant\n\nimport com.danielasfregola.twit"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/streaming/user/FriendsLists.scala",
    "chars": 1285,
    "preview": "package com.danielasfregola.twitter4s.entities.streaming.user\n\nimport com.danielasfregola.twitter4s.entities.streaming.U"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Error.scala",
    "chars": 471,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class Error(detail: String,\n                       field: "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Media.scala",
    "chars": 1826,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport com.danielasfregola.twitter4s.entities.v2.enums.MediaType.Medi"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Meta.scala",
    "chars": 294,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class Meta(result_count: Int,\n                      newest"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Place.scala",
    "chars": 568,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\n// https://developer.twitter.com/en/docs/twitter-api/data-dictionary/"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Poll.scala",
    "chars": 476,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport java.time.Instant\n\n// https://developer.twitter.com/en/docs/tw"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Tweet.scala",
    "chars": 3060,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport com.danielasfregola.twitter4s.entities.v2.enums.CoordinatesTyp"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetEntities.scala",
    "chars": 1245,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class TweetEntities(annotations: Seq[TweetEntitiesAnnotati"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/TweetIncludes.scala",
    "chars": 301,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class TweetIncludes(tweets: Seq[Tweet],\n                  "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/User.scala",
    "chars": 879,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport java.time.Instant\n\nfinal case class User(id: String,\n         "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserEntities.scala",
    "chars": 858,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nfinal case class UserEntities(url: Option[UserURLContainer], descript"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/UserIncludes.scala",
    "chars": 113,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\ncase class UserIncludes(tweets: Seq[Tweet], users: Seq[User])\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/Withheld.scala",
    "chars": 231,
    "preview": "package com.danielasfregola.twitter4s.entities.v2\n\nimport com.danielasfregola.twitter4s.entities.v2.enums.WithheldScope."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/CoordinatesType.scala",
    "chars": 165,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject CoordinatesType extends Enumeration {\n  type Coordinates"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/MediaType.scala",
    "chars": 224,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject MediaType extends Enumeration {\n  type MediaType = Value"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/ReferencedTweetType.scala",
    "chars": 250,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject ReferencedTweetType extends Enumeration {\n  type Referen"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/TweetReplySetting.scala",
    "chars": 297,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject TweetReplySetting extends Enumeration {\n  type TweetRepl"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/WithheldScope.scala",
    "chars": 188,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums\n\nobject WithheldScope extends Enumeration {\n  type WithheldScope"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/TweetExpansions.scala",
    "chars": 614,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.expansions\n\nobject TweetExpansions extends Enumeration {\n  type "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/expansions/UserExpansions.scala",
    "chars": 192,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.expansions\n\nobject UserExpansions extends Enumeration {\n  type U"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/MediaFields.scala",
    "chars": 571,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject MediaFields extends Enumeration {\n  type MediaFie"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PlaceFields.scala",
    "chars": 409,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject PlaceFields extends Enumeration {\n  type PlaceFie"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/PollFields.scala",
    "chars": 325,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject PollFields extends Enumeration {\n  type PollField"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/TweetFields.scala",
    "chars": 959,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject TweetFields extends Enumeration {\n  type TweetFie"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/fields/UserFields.scala",
    "chars": 643,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.fields\n\nobject UserFields extends Enumeration {\n  type UserField"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/enums/rest/TimelineExclude.scala",
    "chars": 209,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.enums.rest\n\nobject TimelineExclude extends Enumeration {\n  type Timeli"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetResponse.scala",
    "chars": 246,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{Error, Tw"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/TweetsResponse.scala",
    "chars": 366,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{Error, Me"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UserResponse.scala",
    "chars": 235,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{Error, Us"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/entities/v2/responses/UsersResponse.scala",
    "chars": 233,
    "preview": "package com.danielasfregola.twitter4s.entities.v2.responses\n\nimport com.danielasfregola.twitter4s.entities.v2.{User, Use"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/exceptions/TwitterException.scala",
    "chars": 852,
    "preview": "package com.danielasfregola.twitter4s.exceptions\n\nimport akka.http.scaladsl.model.StatusCode\n\nfinal case class TwitterEr"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/Client.scala",
    "chars": 917,
    "preview": "package com.danielasfregola.twitter4s.http.clients\n\nimport akka.actor.ActorSystem\nimport akka.http.scaladsl.model.{HttpR"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/CommonClient.scala",
    "chars": 3407,
    "preview": "package com.danielasfregola.twitter4s.http.clients\n\nimport akka.actor.ActorSystem\nimport akka.http.scaladsl.Http\nimport "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/OAuthClient.scala",
    "chars": 2932,
    "preview": "package com.danielasfregola.twitter4s.http.clients\n\nimport akka.http.scaladsl.client.RequestBuilding\nimport akka.http.sc"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/AuthenticationClient.scala",
    "chars": 1587,
    "preview": "package com.danielasfregola.twitter4s.http.clients.authentication\n\nimport akka.actor.ActorSystem\nimport akka.http.scalad"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/TwitterOAuthClient.scala",
    "chars": 8998,
    "preview": "package com.danielasfregola.twitter4s.http\npackage clients.authentication.oauth\n\nimport com.danielasfregola.twitter4s.en"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/AccessTokenParameters.scala",
    "chars": 654,
    "preview": "package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters\n\nimport com.danielasfregola.twitter4s"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/authentication/oauth/parameters/RequestTokenParameters.scala",
    "chars": 342,
    "preview": "package com.danielasfregola.twitter4s.http.clients.authentication.oauth.parameters\n\nimport com.danielasfregola.twitter4s"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/RestClient.scala",
    "chars": 2752,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest\n\nimport akka.actor.ActorSystem\nimport akka.http.scaladsl.model.{"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/TwitterAccountClient.scala",
    "chars": 14770,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.account\n\nimport com.danielasfregola.twitter4s.entities._\nimport "
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/account/parameters/CredentialsParameters.scala",
    "chars": 412,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.account.parameters\n\nimport com.danielasfregola.twitter4s.http.ma"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/TwitterAccountActivityClient.scala",
    "chars": 6898,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.accountactivity\n\nimport com.danielasfregola.twitter4s.entities._"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/accountactivity/parameters/WebhooksParameters.scala",
    "chars": 237,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.accountactivity.parameters\n\nimport com.danielasfregola.twitter4s"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/TwitterApplicationClient.scala",
    "chars": 1723,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.application\n\nimport com.danielasfregola.twitter4s.entities.enums"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/application/parameters/RatesParameters.scala",
    "chars": 244,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.application.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/TwitterBlockClient.scala",
    "chars": 10051,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks\n\nimport com.danielasfregola.twitter4s.entities._\nimport c"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/parameters/BlockParameters.scala",
    "chars": 473,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks.parameters\n\nimport com.danielasfregola.twitter4s.http.mar"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/parameters/BlockedUserIdsParameters.scala",
    "chars": 259,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks.parameters\n\nimport com.danielasfregola.twitter4s.http.mar"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/blocks/parameters/BlockedUsersParameters.scala",
    "chars": 404,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.blocks.parameters\n\nimport com.danielasfregola.twitter4s.http.mar"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/TwitterDirectMessageClient.scala",
    "chars": 12005,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages\n\nimport com.danielasfregola.twitter4s.entities._\n"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/CreateEventParameters.scala",
    "chars": 1081,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/CreateParameters.scala",
    "chars": 411,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/DestroyParameters.scala",
    "chars": 259,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/EventListParameters.scala",
    "chars": 264,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\nimport com.danielasfregola.twitter4s.h"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/ReceivedParameters.scala",
    "chars": 554,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/SentParameters.scala",
    "chars": 523,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/directmessages/parameters/ShowParameters.scala",
    "chars": 231,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.directmessages.parameters\n\nimport com.danielasfregola.twitter4s."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/favorites/TwitterFavoriteClient.scala",
    "chars": 7180,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.favorites\n\nimport com.danielasfregola.twitter4s.entities.{RatedD"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/favorites/parameters/FavoriteParameters.scala",
    "chars": 255,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.favorites.parameters\n\nimport com.danielasfregola.twitter4s.http."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/favorites/parameters/FavoritesParameters.scala",
    "chars": 640,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.favorites.parameters\n\nimport com.danielasfregola.twitter4s.http."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/followers/TwitterFollowerClient.scala",
    "chars": 13628,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.followers\n\nimport com.danielasfregola.twitter4s.entities.{RatedD"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/followers/parameters/FollowersParameters.scala",
    "chars": 635,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.followers.parameters\n\nimport com.danielasfregola.twitter4s.http."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/followers/parameters/FollowingParameters.scala",
    "chars": 549,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.followers.parameters\n\nimport com.danielasfregola.twitter4s.http."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friends/TwitterFriendClient.scala",
    "chars": 13700,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friends\n\nimport com.danielasfregola.twitter4s.entities.{RatedDat"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friends/parameters/FriendParameters.scala",
    "chars": 532,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friends.parameters\n\nimport com.danielasfregola.twitter4s.http.ma"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friends/parameters/FriendsParameters.scala",
    "chars": 621,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friends.parameters\n\nimport com.danielasfregola.twitter4s.http.ma"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/TwitterFriendshipClient.scala",
    "chars": 22855,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships\n\nimport com.danielasfregola.twitter4s.entities._\nimp"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/BlockedParameters.scala",
    "chars": 243,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/FollowParameters.scala",
    "chars": 397,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/FriendshipParameters.scala",
    "chars": 260,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/NotificationParameters.scala",
    "chars": 808,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/RelationshipParameters.scala",
    "chars": 561,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/RelationshipsParameters.scala",
    "chars": 283,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/friendships/parameters/UnfollowParameters.scala",
    "chars": 276,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.friendships.parameters\n\nimport com.danielasfregola.twitter4s.htt"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/geo/TwitterGeoClient.scala",
    "chars": 8993,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.geo\n\nimport com.danielasfregola.twitter4s.entities.enums.Granula"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/geo/parameters/GeoSearchParameters.scala",
    "chars": 1120,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.geo.parameters\n\nimport com.danielasfregola.twitter4s.entities.Ac"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/geo/parameters/ReverseGeoCodeParameters.scala",
    "chars": 783,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.geo.parameters\n\nimport com.danielasfregola.twitter4s.entities.Ac"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/help/TwitterHelpClient.scala",
    "chars": 2950,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.help\n\nimport com.danielasfregola.twitter4s.entities._\nimport com"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/TwitterListClient.scala",
    "chars": 92752,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists\n\nimport com.danielasfregola.twitter4s.entities._\nimport co"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/AddMemberParameters.scala",
    "chars": 697,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/CreateListParameters.scala",
    "chars": 337,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.entities."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListMembersParameters.scala",
    "chars": 834,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListParameters.scala",
    "chars": 499,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListTimelineParameters.scala",
    "chars": 1101,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.entities."
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/ListsParameters.scala",
    "chars": 389,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/MemberParameters.scala",
    "chars": 834,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
  },
  {
    "path": "src/main/scala/com/danielasfregola/twitter4s/http/clients/rest/lists/parameters/MembersParameters.scala",
    "chars": 687,
    "preview": "package com.danielasfregola.twitter4s.http.clients.rest.lists.parameters\n\nimport com.danielasfregola.twitter4s.http.mars"
  }
]

// ... and 390 more files (download for full content)

About this extraction

This page contains the full source code of the DanielaSfregola/twitter4s GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 590 files (3.7 MB), approximately 1.0M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!